feat(rust): port stack sync to native Rust#1523
Draft
jd wants to merge 1 commit into
Conversation
Member
Author
|
This pull request is part of a Mergify stack:
|
This was referenced Jun 3, 2026
Contributor
Merge ProtectionsYour pull request matches the following merge protections and will not be merged until they are valid. 🔴 ⛓️ Depends-On RequirementsWaiting for
This rule is failing.Requirement based on the presence of
🔴 👀 Review RequirementsWaiting for
This rule is failing.
🔴 🔎 ReviewsWaiting for
This rule is failing.
🟢 🤖 Continuous IntegrationWonderful, this rule succeeded.
🟢 Enforce conventional commitWonderful, this rule succeeded.Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/
🟢 📕 PR descriptionWonderful, this rule succeeded.
|
The Rust binary now serves ``mergify stack sync [--dry-run]``
natively. The Python ``stack_sync`` entry point and
``test_sync.py`` are gone; the click registration is gone too.
The rest of ``mergify_cli/stack/sync.py`` (``SyncStatus``,
``get_sync_status``, ``smart_rebase``, ``_write_drop_script``)
is kept for now because the still-Python ``stack push`` calls
``smart_rebase`` directly. The whole file is queued for deletion
with the ``stack push`` port.
New infrastructure that the remaining slices (``list``,
``push``, ``open``) will reuse:
- ``mergify_stack::sync_status`` — sync-specific classifier that
walks the local stack commits, matches each to a remote PR by
``Change-Id`` (with the cross-prefix tolerance Python's
``pop_remote_change`` had), and buckets them into
``MergedCommit`` (closed-and-merged AND head SHA matches the
local commit) and ``RemainingCommit`` (everything else). The
full create/update/skip-up-to-date classifier needed by
``stack push``/``stack list`` lands with those slices.
- ``mergify_stack::stack_context::check_local_branch`` — rejects
local branches whose shape matches the auto-generated
``<prefix>/.../<slug>--<hex8>`` or legacy ``/I<40hex>`` forms.
- ``MERGIFY_GITHUB_SERVER`` env var on
``stack_context::resolve_github_server`` — bypasses git config
and the unconditional ``https://`` coercion, so integration
tests can point at a wiremock server speaking plain ``http``.
``mergify stack sync``:
1. Validates the local branch isn't an auto-generated leaf branch
and that it isn't the trunk itself.
2. Resolves ``user/repo``, the trunk, and the
``git merge-base --fork-point`` (falling back to plain
``merge-base`` for sandboxes with no reflog).
3. Searches GitHub for the stack PRs and classifies each local
commit via ``sync_status::classify``.
4. ``--dry-run`` prints a plan and exits 0. Otherwise:
- When every commit is merged or none are, ``git pull --rebase``.
- Mixed case: ``git rebase -i <trunk>`` with
``GIT_SEQUENCE_EDITOR`` pointing at this binary's
``_internal rebase-todo-rewrite --action drop --shas <merged>``
— single rebase pass, no separate drop step.
End-to-end coverage in
``crates/mergify-cli/tests/stack_sync.rs`` (3 cases against a
real binary + wiremock + real git): up-to-date when no PRs are
merged, dry-run lists merged commits, validation rejects
auto-generated branch names. The classifier adds 7 unit tests
(merged / amended-after-merge / open / no-pr / cross-prefix
match / ``all_merged`` / ``up_to_date`` predicates).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Change-Id: I7f75be875289707f492ecbf59f6bcb6530554f24
0da0845 to
b09a7f8
Compare
694deb9 to
38d547f
Compare
Member
Author
Revision history
|
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 Rust binary now serves
mergify stack sync [--dry-run]natively. The Python
stack_syncentry point andtest_sync.pyare gone; the click registration is gone too.The rest of
mergify_cli/stack/sync.py(SyncStatus,get_sync_status,smart_rebase,_write_drop_script)is kept for now because the still-Python
stack pushcallssmart_rebasedirectly. The whole file is queued for deletionwith the
stack pushport.New infrastructure that the remaining slices (
list,push,open) will reuse:mergify_stack::sync_status— sync-specific classifier thatwalks the local stack commits, matches each to a remote PR by
Change-Id(with the cross-prefix tolerance Python'spop_remote_changehad), and buckets them intoMergedCommit(closed-and-merged AND head SHA matches thelocal commit) and
RemainingCommit(everything else). Thefull create/update/skip-up-to-date classifier needed by
stack push/stack listlands with those slices.mergify_stack::stack_context::check_local_branch— rejectslocal branches whose shape matches the auto-generated
<prefix>/.../<slug>--<hex8>or legacy/I<40hex>forms.MERGIFY_GITHUB_SERVERenv var onstack_context::resolve_github_server— bypasses git configand the unconditional
https://coercion, so integrationtests can point at a wiremock server speaking plain
http.mergify stack sync:and that it isn't the trunk itself.
user/repo, the trunk, and thegit merge-base --fork-point(falling back to plainmerge-basefor sandboxes with no reflog).commit via
sync_status::classify.--dry-runprints a plan and exits 0. Otherwise:git pull --rebase.git rebase -i <trunk>withGIT_SEQUENCE_EDITORpointing at this binary's_internal rebase-todo-rewrite --action drop --shas <merged>— single rebase pass, no separate drop step.
End-to-end coverage in
crates/mergify-cli/tests/stack_sync.rs(3 cases against areal binary + wiremock + real git): up-to-date when no PRs are
merged, dry-run lists merged commits, validation rejects
auto-generated branch names. The classifier adds 7 unit tests
(merged / amended-after-merge / open / no-pr / cross-prefix
match /
all_merged/up_to_datepredicates).Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com
Depends-On: #1522