From 89bb79f6aec7b07ff29689182b8e4c40e057cbd5 Mon Sep 17 00:00:00 2001 From: Vincent Koc <25068+vincentkoc@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:06:34 -0700 Subject: [PATCH] fix(pr): allow merge-commit landings --- scripts/pr | 1 + scripts/pr-lib/merge.sh | 22 ++++++++++++++++++++-- test/scripts/pr-wrappers.test.ts | 7 ++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/scripts/pr b/scripts/pr index 11f992b90876..aa76655d9e38 100755 --- a/scripts/pr +++ b/scripts/pr @@ -72,6 +72,7 @@ Usage: scripts/pr prepare-run scripts/pr merge-verify scripts/pr merge-run + OPENCLAW_PR_MERGE_METHOD=merge preserves the PR commit series. USAGE } diff --git a/scripts/pr-lib/merge.sh b/scripts/pr-lib/merge.sh index aa80b32f2504..43a2d21e7595 100644 --- a/scripts/pr-lib/merge.sh +++ b/scripts/pr-lib/merge.sh @@ -233,8 +233,26 @@ merge_run() { return 0 } + local merge_method="${OPENCLAW_PR_MERGE_METHOD:-squash}" + local merge_flag + local merge_label + case "$merge_method" in + squash) + merge_flag="--squash" + merge_label="squash" + ;; + merge) + merge_flag="--merge" + merge_label="merge commit" + ;; + *) + echo "Invalid OPENCLAW_PR_MERGE_METHOD: $merge_method (expected squash or merge)." + exit 2 + ;; + esac + if ! gh pr merge "$pr" \ - --squash \ + "$merge_flag" \ --match-head-commit "$PREP_HEAD_SHA" \ >.local/merge-output.log 2>&1 then @@ -299,7 +317,7 @@ merge_run() { for attempt in 1 2 3; do if comment_output=$( { - echo "Merged via squash." + echo "Merged via $merge_label." echo echo "- Prepared head SHA: [$PREP_HEAD_SHA]($prep_sha_url)" echo "- Landed commit: [$landed_sha]($landed_sha_url)" diff --git a/test/scripts/pr-wrappers.test.ts b/test/scripts/pr-wrappers.test.ts index 9d6a8a700e87..d1e58977c991 100644 --- a/test/scripts/pr-wrappers.test.ts +++ b/test/scripts/pr-wrappers.test.ts @@ -35,13 +35,14 @@ describe("scripts/pr wrappers", () => { expect(script).toContain('exec "$base" merge-run "$pr"'); }); - it("uses the repository-approved squash landing method", () => { + it("defaults to squash and allows an explicit merge commit", () => { const script = readScript("scripts/pr-lib/merge.sh"); + expect(script).toContain("OPENCLAW_PR_MERGE_METHOD:-squash"); expect(script).toContain("--squash"); + expect(script).toContain("--merge"); expect(script).not.toContain("--rebase"); - expect(script).toContain("Merged via squash."); - expect(script).not.toContain("Merged via rebase."); + expect(script).toContain('echo "Merged via $merge_label."'); }); it("keeps prepare wrapper modes delegated to the main PR helper", () => {