Skip to content

feat(rust): port stack fixup to native Rust#1518

Open
jd wants to merge 1 commit into
devs/jd/feat/rust-stack-new/port-stack-drop-native-rust--22a92418from
devs/jd/feat/rust-stack-new/port-stack-fixup-native-rust--7a139112
Open

feat(rust): port stack fixup to native Rust#1518
jd wants to merge 1 commit into
devs/jd/feat/rust-stack-new/port-stack-drop-native-rust--22a92418from
devs/jd/feat/rust-stack-new/port-stack-fixup-native-rust--7a139112

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented Jun 3, 2026

The Rust binary now serves mergify stack fixup <COMMIT>... [--dry-run] natively. The Python implementation
(stack_fixup in mergify_cli/stack/squash.py, its click
registration, and TestStackFixup in
mergify_cli/tests/stack/test_squash.py) is removed in the
same PR; stack_squash stays put.

Builds on the rebase-todo machinery: this slice adds
Action::Fixup { shas } to mergify_stack::rebase_todo
(rewrites the targeted pick lines to fixup, preserving
the diff so it folds into the previous commit) and an Fixup
variant on the _internal rebase-todo-rewrite --action enum.

Validation mirrors Python: each <COMMIT> argument resolves
against the stack walker by SHA-prefix or Change-Id prefix;
duplicates are rejected; the first commit of the stack is
rejected because it has no parent inside the stack to fold
into.

End-to-end coverage in
crates/mergify-cli/tests/stack_fixup.rs (4 cases): folds B
into A leaving [A, C], dry-run is a no-op, first-commit fixup
is rejected, unknown prefix exits non-zero. The pure
transformer is covered by 3 new rebase_todo unit tests.

The pick→fixup transform shares its implementation with a new
generalised rewrite_replace_verb helper in rebase_todo
reword will slot into the same shape when that port
follows.

Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com

Depends-On: #1517

@jd
Copy link
Copy Markdown
Member Author

jd commented Jun 3, 2026

This pull request is part of a Mergify stack:

# Pull Request Link
1 feat(rust): port stack note to native Rust #1515
2 feat(rust): port stack edit + add rebase-todo machinery #1516
3 feat(rust): port stack drop to native Rust #1517
4 feat(rust): port stack fixup to native Rust #1518 👈
5 feat(rust): port stack reword to native Rust #1519
6 feat(rust): port stack reorder + stack move to native Rust #1520
7 feat(rust): port stack squash to native Rust #1521
8 feat(rust): port stack checkout to native Rust #1522
9 feat(rust): port stack sync to native Rust #1523
10 feat(rust): port stack list + stack open to native Rust #1524

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented Jun 3, 2026

Merge Protections

Your pull request matches the following merge protections and will not be merged until they are valid.

🔴 ⛓️ Depends-On Requirements

Waiting for

This rule is failing.

Requirement based on the presence of Depends-On in the body of the pull request

🔴 👀 Review Requirements

Waiting for

  • #approved-reviews-by>=2
This rule is failing.
  • any of:
    • #approved-reviews-by>=2
    • author = dependabot[bot]
    • author = mergify-ci-bot
    • author = renovate[bot]

🔴 🔎 Reviews

Waiting for

  • #review-requested = 0
This rule is failing.
  • #review-requested = 0
  • #changes-requested-reviews-by = 0
  • #review-threads-unresolved = 0

🟢 🤖 Continuous Integration

Wonderful, this rule succeeded.
  • all of:
    • check-success=ci-gate

🟢 Enforce conventional commit

Wonderful, this rule succeeded.

Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/

  • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert|ui)(?:\(.+\))?:

🟢 📕 PR description

Wonderful, this rule succeeded.
  • body ~= (?ms:.{48,})

The Rust binary now serves ``mergify stack fixup <COMMIT>...
[--dry-run]`` natively. The Python implementation
(``stack_fixup`` in ``mergify_cli/stack/squash.py``, its click
registration, and ``TestStackFixup`` in
``mergify_cli/tests/stack/test_squash.py``) is removed in the
same PR; ``stack_squash`` stays put.

Builds on the rebase-todo machinery: this slice adds
``Action::Fixup { shas }`` to ``mergify_stack::rebase_todo``
(rewrites the targeted ``pick`` lines to ``fixup``, preserving
the diff so it folds into the previous commit) and an ``Fixup``
variant on the ``_internal rebase-todo-rewrite --action`` enum.

Validation mirrors Python: each ``<COMMIT>`` argument resolves
against the stack walker by SHA-prefix or Change-Id prefix;
duplicates are rejected; the first commit of the stack is
rejected because it has no parent inside the stack to fold
into.

End-to-end coverage in
``crates/mergify-cli/tests/stack_fixup.rs`` (4 cases): folds B
into A leaving [A, C], dry-run is a no-op, first-commit fixup
is rejected, unknown prefix exits non-zero. The pure
transformer is covered by 3 new ``rebase_todo`` unit tests.

The pick→fixup transform shares its implementation with a new
generalised ``rewrite_replace_verb`` helper in ``rebase_todo``
— ``reword`` will slot into the same shape when that port
follows.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Change-Id: I7a139112fd95ef2b1e5bd2763cb62b0b9b2f5879
@jd jd force-pushed the devs/jd/feat/rust-stack-new/port-stack-fixup-native-rust--7a139112 branch from cf3869f to c431f4c Compare June 3, 2026 21:01
@jd
Copy link
Copy Markdown
Member Author

jd commented Jun 3, 2026

Revision history

# Type Changes Reason Date
1 initial cf3869f 2026-06-03 21:01 UTC
2 rebase cf3869f → c431f4c (rebase only) 2026-06-03 21:01 UTC

@jd jd temporarily deployed to func-tests-live June 3, 2026 21:01 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live June 3, 2026 21:01 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections June 3, 2026 21:01 Failure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant