feat(rust): port ci git-refs to native Rust#1405
Conversation
|
This pull request is part of a Mergify stack:
|
Merge ProtectionsYour pull request matches the following merge protections and will not be merged until they are valid. 🟢 ⛓️ Depends-On RequirementsWonderful, this rule succeeded.Requirement based on the presence of
🟢 🤖 Continuous IntegrationWonderful, this rule succeeded.
🟢 👀 Review RequirementsWonderful, this rule succeeded.
🟢 Enforce conventional commitWonderful, this rule succeeded.Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/
🟢 🔎 ReviewsWonderful, this rule succeeded.
🟢 📕 PR descriptionWonderful, this rule succeeded.
|
bc6091b to
dc79f69
Compare
2d49d23 to
0d7c20c
Compare
Revision history
|
0d7c20c to
d0a28d3
Compare
d0a28d3 to
c12b430
Compare
There was a problem hiding this comment.
Pull request overview
Ports mergify ci git-refs from the Python click CLI to a native Rust implementation in the mergify-ci crate, and wires the Rust binary dispatcher to run it natively (while removing the Python CLI entrypoint/tests for this command).
Changes:
- Add native Rust
ci git-refscommand with base/head detection, multiple output formats, and CI side-effects (GITHUB_OUTPUT / Buildkite meta-data). - Introduce shared Rust helpers for GitHub Actions event payload parsing and merge-queue YAML metadata extraction.
- Remove the Python click
git_refscommand and its CLI-level tests; registerci git-refsas a native subcommand in the Rustmergifybinary.
Reviewed changes
Copilot reviewed 8 out of 9 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| mergify_cli/tests/ci/test_cli.py | Removes Python CLI tests for ci git-refs now that execution is native Rust. |
| mergify_cli/ci/cli.py | Deletes the Python click ci git-refs command implementation (now handled by Rust). |
| crates/mergify-cli/src/main.rs | Adds native dispatch + clap plumbing for mergify ci git-refs --format .... |
| crates/mergify-ci/src/lib.rs | Exposes new git_refs, github_event, and queue_metadata modules. |
| crates/mergify-ci/src/github_event.rs | Adds GitHub Actions event payload deserialization + loader. |
| crates/mergify-ci/src/queue_metadata.rs | Adds MQ PR-body fenced YAML extraction + detection helper. |
| crates/mergify-ci/src/git_refs.rs | Implements detection logic, output formats, and CI side-effects for ci git-refs. |
| crates/mergify-ci/Cargo.toml | Adds serde_yaml_ng dependency for YAML parsing. |
| Cargo.lock | Locks new dependencies (including serde_yaml_ng) and transitive updates. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Pins the contract for ``mergify ci git-refs`` so a future Rust port can be validated against the same test that exercised the Python implementation. The next commit ports the command; this one lands first so it runs against Python at its own CI, then against Rust on rebase — same test, both ends of the port. The test runs in the existing live-tests harness but doesn't need the live token: ``ci git-refs`` is locally evaluated (no API call). The conftest fixture scrubs every CI provider env var and runs in a tmp dir, so the detector lands on its literal ``HEAD^..HEAD`` fallback path. The assertion checks for ``Base: HEAD^`` and ``Head: HEAD`` in stdout — output format that the Python and Rust implementations share verbatim. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Change-Id: Iae0e3fe5b4cc3b653529b80ae10bae6c83f3e53d
The Rust binary now serves ``mergify ci git-refs`` natively. The
Python implementation (``mergify_cli/ci/cli.py:git_refs``) and
its tests are removed in the same PR — port-and-delete keeps a
single live copy.
The previous commit landed a live-smoke test pinning the
``Base: HEAD^`` / ``Head: HEAD`` fallback contract. That same
test now exercises the Rust path.
The command detects the base/head git references for the
current build:
1. Buildkite env (``BUILDKITE_PULL_REQUEST`` and friends)
2. GitHub Actions event payload at ``$GITHUB_EVENT_PATH``
3. ``refs/notes/mergify/<branch>`` git notes (for merge-queue
draft PRs created by the Mergify backend)
4. The MQ PR body's YAML metadata block (fallback for tools
that can't read git notes)
5. Literal ``HEAD^..HEAD`` when none of the above match
Three output formats:
- ``text`` (default): ``Base: <ref>`` and ``Head: <ref>`` on
two lines.
- ``shell``: ``MERGIFY_GIT_REFS_{BASE,HEAD,SOURCE}=...`` lines
for ``eval``; values are properly shell-quoted.
- ``json``: a single JSON object ``{"base":..., "head":...,
"source":...}``.
The command also writes ``base=...\nhead=...`` to
``$GITHUB_OUTPUT`` when set, and calls ``buildkite-agent
meta-data set`` when ``BUILDKITE=true``.
This commit introduces two shared helper modules in the
``mergify-ci`` crate that the next port (``ci queue-info``)
will reuse:
- ``github_event``: GitHub Actions event payload deserialization
(``GITHUB_EVENT_PATH``).
- ``queue_metadata``: MQ YAML fenced-block extraction from PR
bodies and git notes.
The notes reader is injected as a trait-object callback so unit
tests can exercise the note-driven detection path without
touching a real git repository; the production path shells out
via ``real_notes_reader``.
Adds the ``serde_yaml_ng`` dep (YAML parser) to the
``mergify-ci`` crate.
12 new git-refs + 2 format round-trip tests plus 8
event/metadata tests in the shared helpers. The Python
git-refs tests in ``mergify_cli/tests/ci/test_cli.py`` are
removed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Change-Id: I9a936b47b90f1128f6fdac6e4f29af6f1525a28c
c12b430 to
a9ed3f2
Compare
72f013c to
47cefb4
Compare
Merge Queue Status
This pull request spent 16 minutes 44 seconds in the queue, including 16 minutes 16 seconds running CI. Required conditions to merge
|
The Rust binary now serves
mergify ci git-refsnatively. ThePython implementation (
mergify_cli/ci/cli.py:git_refs) andits tests are removed in the same PR — port-and-delete keeps a
single live copy.
The previous commit landed a live-smoke test pinning the
Base: HEAD^/Head: HEADfallback contract. That sametest now exercises the Rust path.
The command detects the base/head git references for the
current build:
BUILDKITE_PULL_REQUESTand friends)$GITHUB_EVENT_PATHrefs/notes/mergify/<branch>git notes (for merge-queuedraft PRs created by the Mergify backend)
that can't read git notes)
HEAD^..HEADwhen none of the above matchThree output formats:
text(default):Base: <ref>andHead: <ref>ontwo lines.
shell:MERGIFY_GIT_REFS_{BASE,HEAD,SOURCE}=...linesfor
eval; values are properly shell-quoted.json: a single JSON object{"base":..., "head":..., "source":...}.The command also writes
base=...\nhead=...to$GITHUB_OUTPUTwhen set, and callsbuildkite-agent meta-data setwhenBUILDKITE=true.This commit introduces two shared helper modules in the
mergify-cicrate that the next port (ci queue-info)will reuse:
github_event: GitHub Actions event payload deserialization(
GITHUB_EVENT_PATH).queue_metadata: MQ YAML fenced-block extraction from PRbodies and git notes.
The notes reader is injected as a trait-object callback so unit
tests can exercise the note-driven detection path without
touching a real git repository; the production path shells out
via
real_notes_reader.Adds the
serde_yaml_ngdep (YAML parser) to themergify-cicrate.12 new git-refs + 2 format round-trip tests plus 8
event/metadata tests in the shared helpers. The Python
git-refs tests in
mergify_cli/tests/ci/test_cli.pyareremoved.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Depends-On: #1404