Skip to content

feat(rust): port stack reword to native Rust#1519

Draft
jd wants to merge 1 commit into
devs/jd/feat/rust-stack-new/port-stack-fixup-native-rust--7a139112from
devs/jd/feat/rust-stack-new/port-stack-reword-native-rust--39f31d0f
Draft

feat(rust): port stack reword to native Rust#1519
jd wants to merge 1 commit into
devs/jd/feat/rust-stack-new/port-stack-fixup-native-rust--7a139112from
devs/jd/feat/rust-stack-new/port-stack-reword-native-rust--39f31d0f

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented Jun 3, 2026

The Rust binary now serves mergify stack reword <COMMIT> [-m <msg>] [--dry-run] natively. The Python implementation
(mergify_cli/stack/reword.py, its click registration, and
mergify_cli/tests/stack/test_reword.py) is removed in the
same PR.

Two new rebase_todo actions back the two flavors:

  • Action::Reword { sha } rewrites the target pick line as
    reword. Git pauses on the commit and runs
    git commit --amend, opening $GIT_EDITOR. Used when no
    -m argument is given.

  • Action::ExecAfter { sha, command } injects an exec <command> line directly after the target pick line. Used
    with -m: the message is written to a tempfile and the
    exec runs git commit --amend -F <file> while HEAD still
    points at the target commit, so any prepare-commit-msg
    hook re-attaches the Change-Id. Tempfile is intentionally
    leaked so git rebase --continue after a conflict can still
    find it. The ExecAfter shape lands here because it is also
    the squash-with-custom-message machinery, so the next slice
    reuses it for free.

mergify stack reword <COMMIT> [-m <msg>] [--dry-run]:

  1. Resolves the trunk and walks the stack (shared with the
    other rebase-family commands).
  2. Matches the <COMMIT> argument by SHA-prefix or Change-Id
    prefix.
  3. --dry-run short-circuits with a Reword plan: line
    showing reword (no -m) or amend (-m given) so
    the dry-run text matches Python.
  4. Otherwise spawns git rebase -i <base> with
    GIT_SEQUENCE_EDITOR pointing at the binary's
    _internal rebase-todo-rewrite subcommand.

End-to-end coverage in
crates/mergify-cli/tests/stack_reword.rs (3 cases): -m
replaces subject + body, --dry-run is a no-op, unknown
prefix exits non-zero. The pure transformer is covered by 4
new rebase_todo unit tests (reword happy path / no match;
exec-after happy path / no match).

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

Depends-On: #1518

@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 reword <COMMIT>
[-m <msg>] [--dry-run]`` natively. The Python implementation
(``mergify_cli/stack/reword.py``, its click registration, and
``mergify_cli/tests/stack/test_reword.py``) is removed in the
same PR.

Two new ``rebase_todo`` actions back the two flavors:

- ``Action::Reword { sha }`` rewrites the target ``pick`` line as
  ``reword``. Git pauses on the commit and runs
  ``git commit --amend``, opening ``$GIT_EDITOR``. Used when no
  ``-m`` argument is given.

- ``Action::ExecAfter { sha, command }`` injects an ``exec
  <command>`` line directly after the target ``pick`` line. Used
  with ``-m``: the message is written to a tempfile and the
  exec runs ``git commit --amend -F <file>`` while HEAD still
  points at the target commit, so any ``prepare-commit-msg``
  hook re-attaches the Change-Id. Tempfile is intentionally
  leaked so ``git rebase --continue`` after a conflict can still
  find it. The ``ExecAfter`` shape lands here because it is also
  the squash-with-custom-message machinery, so the next slice
  reuses it for free.

``mergify stack reword <COMMIT> [-m <msg>] [--dry-run]``:

1. Resolves the trunk and walks the stack (shared with the
   other rebase-family commands).
2. Matches the ``<COMMIT>`` argument by SHA-prefix or Change-Id
   prefix.
3. ``--dry-run`` short-circuits with a ``Reword plan:`` line
   showing ``reword`` (no ``-m``) or ``amend`` (``-m`` given) so
   the dry-run text matches Python.
4. Otherwise spawns ``git rebase -i <base>`` with
   ``GIT_SEQUENCE_EDITOR`` pointing at the binary's
   ``_internal rebase-todo-rewrite`` subcommand.

End-to-end coverage in
``crates/mergify-cli/tests/stack_reword.rs`` (3 cases): ``-m``
replaces subject + body, ``--dry-run`` is a no-op, unknown
prefix exits non-zero. The pure transformer is covered by 4
new ``rebase_todo`` unit tests (reword happy path / no match;
exec-after happy path / no match).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Change-Id: I39f31d0f8b31b890a3a390e928f7342ca04cd7b7
@jd jd force-pushed the devs/jd/feat/rust-stack-new/port-stack-reword-native-rust--39f31d0f branch from 42b64a3 to 9d01b71 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 42b64a3 2026-06-03 21:01 UTC
2 rebase 42b64a3 → 9d01b71 (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
@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