Push updated heads before retargeting PR bases in the fan-out path#42
Open
Phlogistique wants to merge 6 commits into
Open
Push updated heads before retargeting PR bases in the fan-out path#42Phlogistique wants to merge 6 commits into
Phlogistique wants to merge 6 commits into
Conversation
The squash-merge fan-out retargeted every updated child PR onto the target branch and only afterwards pushed the new heads, batched into a single non-atomic push together with the merged-branch deletion. If the push failed (e.g. someone pushed to a child mid-run, rejecting the plain push) or a pr edit died partway through the loop, set -e aborted the run with PRs already retargeted but their heads stale - and unlike the conflict-resume path there is no label to re-trigger the action, so nothing ever repaired them. Apply the ordering the resume path already uses: push the updated heads first, then flip the bases, and delete the merged branch last (deleting a PR's base branch closes the PR, so every child must be off it first). A failed push now leaves the PRs untouched on their old base. The unit test captures the run transcript and asserts the push -> retarget -> delete order; it fails against the previous code. Also corrects the README: pushes are plain, not forced, and branch deletion is its own final step. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX
…g-check-3njvdx # Conflicts: # README.md
Since #40 the conflict comment's fast-forward step reads `git merge --ff-only origin/<branch>`, which assert_conflict_comment_merges picks up with its `^git merge` grep, so the extracted commands never match the expected conflict merges. Skip the --ff-only line when extracting. Also trim the new comments in the fan-out push/retarget/delete sequence. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX
The fix for the --ff-only line breaking assert_conflict_comment_merges moved to a separate PR; the e2e job here stays red until that lands and main is merged back in. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX
Phlogistique
added a commit
that referenced
this pull request
Jun 9, 2026
Since #40 the conflict comment's fast-forward step reads `git merge --ff-only origin/<branch>`, which `assert_conflict_comment_merges` picks up with its `^git merge` grep, so the extracted commands never match the expected conflict merges and the check fails on every conflict scenario. #40's test tweak only handled the new `# ...` hash gloss, not the new merge line. This went unnoticed because `tests.yml` only runs on `pull_request`, so the breakage only surfaced on the first PR after #40 landed (#42, [run 27235483781](https://github.com/scortexio/autorestack-action/actions/runs/27235483781)). Fix: skip the `--ff-only` line when extracting merge commands. Verified green as part of #42's [run 27235912022](https://github.com/scortexio/autorestack-action/actions/runs/27235912022) before being split out into this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX --- _Generated by [Claude Code](https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX)_ Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Jun 9, 2026
Phlogistique
added a commit
that referenced
this pull request
Jun 9, 2026
`branches: ['*']` looks like "all branches", but in GitHub's [filter pattern syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet) the `*` glob does not match `/` — and `pull_request.branches` filters on the *base* branch. So the Tests workflow silently skipped any PR whose base branch contains a slash. Concretely: #45 is stacked on #42's `claude/...` branch and got no Tests run at all. Drop the filter — a bare `pull_request:` trigger covers every base branch. (`'**'` would too, but no filter says what it means.) The README's example workflows never had a filter, so no doc change is needed beyond the inline comment. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX --- _Generated by [Claude Code](https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX)_ Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The squash-merge fan-out retargeted every updated child PR onto the
target branch and only afterwards pushed the new heads, batched into a
single non-atomic push together with the merged-branch deletion. If the
push failed (e.g. someone pushed to a child mid-run, rejecting the plain
push) or a pr edit died partway through the loop, set -e aborted the run
with PRs already retargeted but their heads stale - and unlike the
conflict-resume path there is no label to re-trigger the action, so
nothing ever repaired them.
Apply the ordering the resume path already uses: push the updated heads
first, then flip the bases, and delete the merged branch last (deleting
a PR's base branch closes the PR, so every child must be off it first).
A failed push now leaves the PRs untouched on their old base.
The unit test captures the run transcript and asserts the
push -> retarget -> delete order; it fails against the previous code.
Also corrects the README: pushes are plain, not forced, and branch
deletion is its own final step.
🤖 Generated with Claude Code
https://claude.ai/code/session_01JHvKryT4QUpHYdNq9YEQxX