Skip to content

feat(rust): port ci scopes to native Rust#1461

Open
jd wants to merge 1 commit into
devs/jd/worktree-rust-port/add-live-smoke-test-ci-scopes-select-path--14468b70from
devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc
Open

feat(rust): port ci scopes to native Rust#1461
jd wants to merge 1 commit into
devs/jd/worktree-rust-port/add-live-smoke-test-ci-scopes-select-path--14468b70from
devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented May 26, 2026

mergify ci scopes is now handled by the Rust binary: load the
.mergify.yml scopes: block, resolve (base, head) via the
existing git_refs::detect machinery (or --base/--head for
"manual" mode), shell out to git diff for changed files, and
route each path through every scope's include/exclude globs to
produce the touched-scope set.

The implementation lands in mergify-ci::scopes_detect as a
five-file module:

  • config.rs — YAML schema (Scopes / Source::Files / Source::Manual
    / FileFilters), with BTreeMap for sorted iteration that
    keeps human output deterministic without indexmap.
  • matching.rsglobset-backed file → scope routing, with
    Python-equivalent ** recursive semantics
    (literal_separator(false)).
  • changed_files.rsgit diff base...head --name-only --diff-filter=ACMRTD, with the progressive --deepen
    fetching dance Python uses to dig out a merge base on shallow
    CI clones.
  • outputs.rs — side effects: $GITHUB_OUTPUT JSON dict,
    buildkite-agent meta-data set, $GITHUB_STEP_SUMMARY
    markdown table, buildkite-agent annotate at job + build
    scope. Each one is a no-op when its environment knob isn't
    set.
  • mod.rs — the run() entry point plus the
    --write <PATH> JSON emitter consumed by
    ci scopes-send --scopes-json.

Wired into the binary as a real Subcommands::Ci(CiSubcommand:: Scopes(...)) variant (replacing the previous shim stub) and
added to NATIVE_COMMANDS. clap gains the env feature so
MERGIFY_CONFIG_PATH is honored on --config directly. Adds
globset and a workspace-internal edge mergify-ci → mergify-config for the auto-detection of .mergify.yml /
.mergify/config.yml / .github/mergify.yml. Also makes
git_refs::ReferencesSource::as_str public so the markdown
emitter can reuse the wire-format names without re-encoding the
mapping.

Live smoke test from the previous commit
(test_ci_scopes_select_all_when_no_base) now exercises the
Rust binary's "no base provided" branch end-to-end. 88
mergify-ci unit tests pass (was 75; +13 for scopes_detect).

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

Depends-On: #1460

@jd
Copy link
Copy Markdown
Member Author

jd commented May 26, 2026

This pull request is part of a Mergify stack:

# Pull Request Link
1 fix(cli): accept --debug on the Rust binary and actually toggle it in Python #1464
2 refactor(rust): share test scaffolding via mergify-test-support crate #1439
3 refactor(core): introduce CommandContext for the queue+freeze prelude #1441
4 refactor(ci): consolidate the CI-env scrubber into a shared testing module #1442
5 refactor: drop stale Phase X.Y doc markers and one inline color branch #1443
6 refactor(tui): share StyledGlyph across queue show/status renderers #1444
7 refactor(queue): drop indexmap, group_by_scope returns a Vec<(K, V)> #1445
8 refactor(ci): swap uuid for getrandom in the GHA heredoc delimiter #1446
9 refactor(config): standardize the workspace on serde_yaml_ng for YAML parsing #1447
10 test(ci): add live smoke test for ci scopes select-all path #1460
11 feat(rust): port ci scopes to native Rust #1461 👈
12 feat(ci): parse JUnit XML reports in native Rust #1465
13 feat(ci): encode JUnit cases as OTLP and upload to Mergify CI Insights #1466
14 feat(ci): promote ci junit-process from shim to native Rust #1467
15 feat(ci): promote ci junit-upload from shim to native as a deprecated alias #1468
16 fix(ci): prefer GitHub Actions PR-event head SHA over GITHUB_SHA #1469

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented May 26, 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,})

@jd
Copy link
Copy Markdown
Member Author

jd commented May 27, 2026

Revision history

# Type Changes Reason Date
1 initial d233611 2026-05-27 07:53 UTC
2 content d233611 → b1b850b (raw) 2026-05-27 07:53 UTC
3 content b1b850b → d3fd85c 2026-05-27 08:27 UTC
4 content d3fd85c → 2857e8a (raw) 2026-05-27 08:46 UTC
5 rebase 2857e8a → b0d5709 (rebase only) 2026-05-27 10:04 UTC
6 content b0d5709 → a7edc08 (raw) Wrap the three scopes_detect tests that call run() in with_ci_env(&[], ...) so they pick up the GITHUB_OUTPUT scrub from the consolidated CI_ENV_VARS list. Without the wrapper, on a GHA runner the ru… 2026-05-27 10:15 UTC

@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 07:53 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from b1b850b to d3fd85c Compare May 27, 2026 08:27
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:27 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 08:29 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from d3fd85c to 2857e8a Compare May 27, 2026 08:46
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:46 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 08:46 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/add-live-smoke-test-ci-scopes-select-path--14468b70 branch from 46f9c59 to ae16810 Compare May 27, 2026 10:04
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from 2857e8a to b0d5709 Compare May 27, 2026 10:04
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:04 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:04 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 10:07 Failure
`mergify ci scopes` is now handled by the Rust binary: load the
`.mergify.yml` `scopes:` block, resolve `(base, head)` via the
existing `git_refs::detect` machinery (or `--base`/`--head` for
"manual" mode), shell out to `git diff` for changed files, and
route each path through every scope's include/exclude globs to
produce the touched-scope set.

The implementation lands in `mergify-ci::scopes_detect` as a
five-file module:

  - `config.rs` — YAML schema (`Scopes` / `Source::Files` / `Source::Manual`
    / `FileFilters`), with `BTreeMap` for sorted iteration that
    keeps human output deterministic without `indexmap`.
  - `matching.rs` — `globset`-backed file → scope routing, with
    Python-equivalent `**` recursive semantics
    (`literal_separator(false)`).
  - `changed_files.rs` — `git diff base...head --name-only
    --diff-filter=ACMRTD`, with the progressive `--deepen`
    fetching dance Python uses to dig out a merge base on shallow
    CI clones.
  - `outputs.rs` — side effects: `$GITHUB_OUTPUT` JSON dict,
    `buildkite-agent meta-data set`, `$GITHUB_STEP_SUMMARY`
    markdown table, `buildkite-agent annotate` at job + build
    scope. Each one is a no-op when its environment knob isn't
    set.
  - `mod.rs` — the `run()` entry point plus the
    `--write <PATH>` JSON emitter consumed by
    `ci scopes-send --scopes-json`.

Wired into the binary as a real `Subcommands::Ci(CiSubcommand::
Scopes(...))` variant (replacing the previous shim stub) and
added to `NATIVE_COMMANDS`. clap gains the `env` feature so
`MERGIFY_CONFIG_PATH` is honored on `--config` directly. Adds
`globset` and a workspace-internal edge `mergify-ci →
mergify-config` for the auto-detection of `.mergify.yml` /
`.mergify/config.yml` / `.github/mergify.yml`. Also makes
`git_refs::ReferencesSource::as_str` public so the markdown
emitter can reuse the wire-format names without re-encoding the
mapping.

Live smoke test from the previous commit
(`test_ci_scopes_select_all_when_no_base`) now exercises the
Rust binary's "no base provided" branch end-to-end. 88
`mergify-ci` unit tests pass (was 75; +13 for `scopes_detect`).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Change-Id: I635d39bc6a271e71663968912908bb2fb5c7aeeb
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from b0d5709 to a7edc08 Compare May 27, 2026 10:15
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:15 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:15 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 10:15 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