You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@texera.apache.org by gi...@apache.org on 2026/07/28 14:56:49 UTC

(texera) branch gh-readonly-queue/main/pr-6964-311e3f2ba9ebbb46f16e0bc472f0ac6b67e23cca created (now 5186c42f94)

This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a change to branch gh-readonly-queue/main/pr-6964-311e3f2ba9ebbb46f16e0bc472f0ac6b67e23cca
in repository https://gitbox.apache.org/repos/asf/texera.git


      at 5186c42f94 ci: harden backport cherry-pick against package/directory renames (#6964)

This branch includes the following new commits:

     new 5186c42f94 ci: harden backport cherry-pick against package/directory renames (#6964)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(texera) 01/01: ci: harden backport cherry-pick against package/directory renames (#6964)

Posted by gi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-6964-311e3f2ba9ebbb46f16e0bc472f0ac6b67e23cca
in repository https://gitbox.apache.org/repos/asf/texera.git

commit 5186c42f94614b7bcd6498dc2051f69c7b125754
Author: Yicong Huang <17...@users.noreply.github.com>
AuthorDate: Tue Jul 28 07:56:34 2026 -0700

    ci: harden backport cherry-pick against package/directory renames (#6964)
    
    ### What changes were proposed in this PR?
    
    The backport automation already uses `git cherry-pick` (a 3-way merge
    with rename detection), not `patch`/`git apply`, so a renamed file is
    normally followed to its new path automatically. But every `cherry-pick`
    call site invokes it **bare**, leaving three merge knobs at defaults
    that misbehave precisely when a **package/directory rename** lands
    between `main` and a `release/*` branch — producing spurious conflicts
    on backports that would otherwise apply cleanly.
    
    This PR wraps all backport `cherry-pick` invocations with the same three
    settings:
    
    ```
    git -c merge.renameLimit=999999 \
        -c diff.renameLimit=999999 \
        -c merge.directoryRenames=true \
        cherry-pick -Xrename-threshold=40% ...
    ```
    
    - **`merge.renameLimit` / `diff.renameLimit`** — Git silently skips
    inexact rename detection once the number of unpaired added/deleted paths
    exceeds the limit (warning only). A package-wide rename can blow past
    the default, degrading renamed files to "deleted + added" so picked
    hunks land on paths that no longer exist. Raised so detection stays on.
    - **`merge.directoryRenames=true`** — the default `conflict` will not
    auto-place a file the backport *adds* under an old package path into the
    renamed directory. Backports that add files are common here (see the
    feature-absent guard in `create-backport-branch.sh`).
    - **`-Xrename-threshold=40%`** — a rename that also rewrites
    `package`/`import` lines can drop a small file's similarity below the
    50% default and miss the rename.
    
    Applied **identically** at all three cherry-pick call sites so no stage
    can disagree with another over a rename:
    
    - `.github/scripts/prepare-backport-checkout.sh` — pre-merge preflight
    cherry-pick of the squashed range.
    - `.github/scripts/create-backport-branch.sh` — post-merge fallback
    cherry-pick that opens the draft backport PR.
    - `.github/workflows/direct-backport-push.yml` — post-merge green path
    that cherry-picks straight onto the release branch (thanks @xuang7 for
    catching this one).
    
    Pure configuration passthrough to the merge machinery — no control-flow
    change, no new dependencies.
    
    ### Any related issues, documentation, discussions?
    
    Closes #6963
    
    ### How was this PR tested?
    
    This is a configuration-only change to two shell scripts and one
    workflow's shell step, with no control-flow change. Verified `bash -n`
    (syntax) on the edited scripts and YAML parse on the workflow. The added
    `-c` flags and `-Xrename-threshold` are standard, long-supported `git
    cherry-pick` / merge-machinery options, so behavior on the existing
    (no-rename) path is unchanged; the new settings only take effect when a
    rename is present, which is exactly the case that previously conflicted.
    No unit tests exist for these CI helper scripts, and the real end-to-end
    path (backport preflight + Direct Backport Push) exercises them on the
    next backport-labeled PR.
    
    ### Was this PR authored or co-authored using generative AI tooling?
    
    Generated-by: Claude Code (Opus 4.8)
    
    ---------
    
    Co-authored-by: Claude Opus 4.8 (1M context) <no...@anthropic.com>
---
 .github/scripts/create-backport-branch.sh    |  8 +++++++-
 .github/scripts/prepare-backport-checkout.sh | 13 ++++++++++++-
 .github/workflows/direct-backport-push.yml   |  9 ++++++++-
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/.github/scripts/create-backport-branch.sh b/.github/scripts/create-backport-branch.sh
index 68f22d9ece..32c8fe5e69 100755
--- a/.github/scripts/create-backport-branch.sh
+++ b/.github/scripts/create-backport-branch.sh
@@ -91,7 +91,13 @@ git checkout -B "${branch}" "origin/${TARGET_BRANCH}"
 # everything turns the unmerged entries into a normal (dirty) commit.
 had_conflict=false
 conflict_files=""
-if ! git cherry-pick --no-commit "${MERGE_SHA}"; then
+# Rename-detection knobs kept identical to prepare-backport-checkout.sh so a
+# green preflight and this branch don't disagree over a package/directory
+# rename. See that script for the rationale behind each setting.
+if ! git -c merge.renameLimit=999999 \
+         -c diff.renameLimit=999999 \
+         -c merge.directoryRenames=true \
+         cherry-pick -Xrename-threshold=40% --no-commit "${MERGE_SHA}"; then
   had_conflict=true
   conflict_files="$(git diff --name-only --diff-filter=U | tr '\n' ' ')"
   log "cherry-pick conflicted in: ${conflict_files}"
diff --git a/.github/scripts/prepare-backport-checkout.sh b/.github/scripts/prepare-backport-checkout.sh
index 5286275516..8696eafe2a 100644
--- a/.github/scripts/prepare-backport-checkout.sh
+++ b/.github/scripts/prepare-backport-checkout.sh
@@ -47,4 +47,15 @@ end_tree="$(git rev-parse "${end_sha}^{tree}")"
 squash_sha="$(git commit-tree -p "${start_sha}" -m "ci: squashed backport of ${commit_range}" "${end_tree}")"
 
 git checkout -B "${workspace_branch}" "origin/${target_branch}"
-git cherry-pick -x "${squash_sha}"
+# Rename-detection knobs (kept identical in create-backport-branch.sh so the
+# preflight and the branch it later builds agree): a package/directory rename
+# between main and the release branch would otherwise produce spurious
+# conflicts. Raise the rename limits so Git does not silently skip inexact
+# rename detection when many paths moved; enable directory-rename detection so
+# files this backport *adds* under an old package path follow the rename; and
+# lower the similarity threshold since a rename that also rewrites package/
+# import lines can drop a small file below the 50% default.
+git -c merge.renameLimit=999999 \
+    -c diff.renameLimit=999999 \
+    -c merge.directoryRenames=true \
+    cherry-pick -Xrename-threshold=40% -x "${squash_sha}"
diff --git a/.github/workflows/direct-backport-push.yml b/.github/workflows/direct-backport-push.yml
index 2ce8815e70..b67fcc90fc 100644
--- a/.github/workflows/direct-backport-push.yml
+++ b/.github/workflows/direct-backport-push.yml
@@ -398,7 +398,14 @@ jobs:
           git checkout -B "${TARGET_BRANCH}" "origin/${TARGET_BRANCH}"
           base_sha=$(git rev-parse HEAD)
           log "base_sha=${base_sha}"
-          if ! git cherry-pick --no-commit "${MERGE_SHA}"; then
+          # Rename-detection knobs kept identical to prepare-backport-checkout.sh
+          # (the preflight) so a rename resolved cleanly there does not conflict
+          # here on the straight-to-release cherry-pick. See that script for the
+          # rationale behind each setting.
+          if ! git -c merge.renameLimit=999999 \
+                   -c diff.renameLimit=999999 \
+                   -c merge.directoryRenames=true \
+                   cherry-pick -Xrename-threshold=40% --no-commit "${MERGE_SHA}"; then
             endgroup
             group "Conflict diagnosis"
             conflicts=$(git diff --name-only --diff-filter=U)