Skip to content

feat(rust): port queue status to native Rust#1359

Draft
jd wants to merge 1 commit intodevs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6from
devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32
Draft

feat(rust): port queue status to native Rust#1359
jd wants to merge 1 commit intodevs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6from
devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented May 5, 2026

The Rust binary now serves mergify queue status natively. The
Python implementation (mergify_cli/queue/cli.py:status plus the
batch/scope/topology helpers it depended on) is removed in the
same PR — the port-and-delete rule we adopted in #1322 keeps a
single live copy of every command.

mergify queue status [-r REPO] [-t TOKEN] [-u URL] [-b BRANCH] [--json]:

  1. Resolves repository / token / API URL via the shared
    mergify_queue::auth resolver introduced in feat(rust): port queue pause and unpause to native Rust #1352.
  2. Fetches GET /v1/repos/<repo>/merge-queue/status, optionally
    with ?branch=<branch> (URL-encoded via
    url::form_urlencoded::byte_serialize).
  3. With --json: pretty-prints the raw response. The schema is
    Mergify's API contract, not this CLI's, so we deserialize into
    serde_json::Value and emit verbatim — unknown fields and
    future schema additions survive the round trip.
  4. Without --json: deserializes into a typed StatusView
    that uses #[serde(default)] Option<…> for every field the
    Mergify API has historically treated as optional/nullable
    (matches the port checklist from docs(port): add port review checklist for HTTP/test/UX parity pitfalls #1357), then renders a
    header, an optional pause indicator, the batch tree (grouped
    by scope when there is more than one), and the waiting-PR
    list. Status icons (● ◑ ◌ ✓ ✗ ◎ ⏳ ↻ ⏰ ❄) and relative
    times (5m ago / ~1h) match the Python implementation.

Python used Rich's Tree for batches. The Rust port emits
flat indented text instead — same data, simpler rendering. Both
are line-oriented and round-trip cleanly through pipes; the
fancy box-drawing was visual sugar that didn't survive piping
anyway.

  • build_path covers no-branch, branch, and URL-encoding of a
    branch name with slashes + spaces (e.g. feature/foo bar
    becomes feature%2Ffoo+bar in the query).

  • relative_time covers seconds / minutes / hours / days,
    future prefix, and graceful empty-string return on a malformed
    timestamp (matches Python's "degrade rather than fail").

  • topological_sort covers parents-before-children ordering
    and tolerance of parent_ids that reference missing batches.

  • group_by_scope covers the []"default" fallback
    and multi-scope batches appearing under each scope they claim.

  • status_icon covers known + unknown codes.

  • End-to-end wiremock tests: empty queue, paused queue, batches +
    waiting PRs, multi-scope grouping, ?branch=… query
    threading, JSON-passthrough preserving an extra_field,
    and tolerance of a response that omits all optional fields.

  • crates/mergify-queue/Cargo.toml: adds chrono (relative
    time math), indexmap (scope groups in insertion order),
    promotes serde_json from dev to runtime (used for the
    serde_json::Value passthrough).

  • crates/mergify-cli/src/main.rs: registers the status
    subcommand under QueueSubcommand, threads the
    --branch/--json flags, dispatches to
    mergify_queue::status::run. Adds status to
    looks_native.

  • mergify_cli/queue/api.py: removes QueueStatusResponse,
    QueueBatch, QueuePause, QueueChecksSummary,
    QueueBatchStatus, QueuePullRequest,
    QueuePullRequestAuthor, and get_queue_status — all
    now Rust-native. QueuePullResponse and friends stay for
    the still-shimmed queue show (next phase).

  • mergify_cli/queue/cli.py: removes the @queue.command status block and the helpers it owned (STATUS_STYLES,
    _status_text, _batch_label, _pr_label,
    _topological_sort, _group_batches_by_scope,
    _print_batches, _print_waiting_prs).
    _relative_time stays — show still uses it.

  • mergify_cli/tests/queue/test_cli.py: deletes
    TestStatusCommand, TestTopologicalSort, and the
    _invoke_status helper. TestRelativeTime stays.

Workspace: 138 Rust tests green, 590 Python tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

Depends-On: #1353

@jd
Copy link
Copy Markdown
Member Author

jd commented May 5, 2026

This pull request is part of a Mergify stack:

# Pull Request Link
1 feat(rust): port queue pause and unpause to native Rust #1352
2 feat(rust): port ci git-refs and ci queue-info to native Rust #1353
3 feat(rust): port queue status to native Rust #1359 👈
4 test: derive native queue commands from the binary, not a hardcoded list #1366
5 feat(rust): extract reusable terminal-UI primitives into mergify-tui #1379
6 fix(cli): surface clap's --help instead of erroring on native subcommands #1380

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented May 5, 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 jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from ef75ea5 to d733d15 Compare May 5, 2026 13:13
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6 branch from 742d92c to 839ea5a Compare May 5, 2026 13:13
@jd
Copy link
Copy Markdown
Member Author

jd commented May 5, 2026

Revision history

# Type Changes Reason Date
1 initial ef75ea5 2026-05-05 13:13 UTC
2 rebase ef75ea5 → d733d15 2026-05-05 13:13 UTC
3 content d733d15 → aa25245 2026-05-05 13:22 UTC
4 content aa25245 → 53d4832 2026-05-05 15:18 UTC
5 content 53d4832 → e7ad85a 2026-05-05 19:59 UTC
6 rebase e7ad85a → 4be1b66 2026-05-06 10:57 UTC
7 content 4be1b66 → d75104b 2026-05-06 13:00 UTC

@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 5, 2026 13:13 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from d733d15 to aa25245 Compare May 5, 2026 13:21
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 5, 2026 13:22 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from aa25245 to 53d4832 Compare May 5, 2026 15:18
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 5, 2026 15:18 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from 53d4832 to e7ad85a Compare May 5, 2026 19:58
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6 branch from 3df5705 to 0349b1d Compare May 5, 2026 19:58
@jd jd changed the title feat(rust): port queue status to native Rust (Phase 1.7) feat(rust): port queue status to native Rust May 5, 2026
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 5, 2026 19:59 Failure
@mergify mergify Bot requested a review from a team May 5, 2026 20:08
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6 branch from 0349b1d to c3fc948 Compare May 6, 2026 10:57
@jd jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from e7ad85a to 4be1b66 Compare May 6, 2026 10:57
@jd jd temporarily deployed to func-tests-live May 6, 2026 10:57 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 6, 2026 10:57 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 6, 2026 10:57 Failure
The Rust binary now serves ``mergify queue status`` natively. The
Python implementation (``mergify_cli/queue/cli.py:status`` plus the
batch/scope/topology helpers it depended on) is removed in the
same PR — the port-and-delete rule we adopted in #1322 keeps a
single live copy of every command.

``mergify queue status [-r REPO] [-t TOKEN] [-u URL] [-b BRANCH]
[--json]``:

1. Resolves repository / token / API URL via the shared
   ``mergify_queue::auth`` resolver introduced in #1352.
2. Fetches ``GET /v1/repos/<repo>/merge-queue/status``, optionally
   with ``?branch=<branch>`` (URL-encoded via
   ``url::form_urlencoded::byte_serialize``).
3. With ``--json``: pretty-prints the raw response. The schema is
   Mergify's API contract, not this CLI's, so we deserialize into
   ``serde_json::Value`` and emit verbatim — unknown fields and
   future schema additions survive the round trip.
4. Without ``--json``: deserializes into a typed ``StatusView``
   that uses ``#[serde(default)] Option<…>`` for every field the
   Mergify API has historically treated as optional/nullable
   (matches the port checklist from #1357), then renders a
   header, an optional pause indicator, the batch tree (grouped
   by scope when there is more than one), and the waiting-PR
   list. Status icons (``● ◑ ◌ ✓ ✗ ◎ ⏳ ↻ ⏰ ❄``) and relative
   times (``5m ago`` / ``~1h``) match the Python implementation.

Python used Rich's ``Tree`` for batches. The Rust port emits
flat indented text instead — same data, simpler rendering. Both
are line-oriented and round-trip cleanly through pipes; the
fancy box-drawing was visual sugar that didn't survive piping
anyway.

- ``build_path`` covers no-branch, branch, and URL-encoding of a
  branch name with slashes + spaces (e.g. ``feature/foo bar``
  becomes ``feature%2Ffoo+bar`` in the query).
- ``relative_time`` covers seconds / minutes / hours / days,
  future prefix, and graceful empty-string return on a malformed
  timestamp (matches Python's "degrade rather than fail").
- ``topological_sort`` covers parents-before-children ordering
  and tolerance of ``parent_ids`` that reference missing batches.
- ``group_by_scope`` covers the ``[]`` → ``"default"`` fallback
  and multi-scope batches appearing under each scope they claim.
- ``status_icon`` covers known + unknown codes.
- End-to-end wiremock tests: empty queue, paused queue, batches +
  waiting PRs, multi-scope grouping, ``?branch=…`` query
  threading, JSON-passthrough preserving an ``extra_field``,
  and tolerance of a response that omits all optional fields.

- ``crates/mergify-queue/Cargo.toml``: adds ``chrono`` (relative
  time math), ``indexmap`` (scope groups in insertion order),
  promotes ``serde_json`` from dev to runtime (used for the
  ``serde_json::Value`` passthrough).
- ``crates/mergify-cli/src/main.rs``: registers the ``status``
  subcommand under ``QueueSubcommand``, threads the
  ``--branch``/``--json`` flags, dispatches to
  ``mergify_queue::status::run``. Adds ``status`` to
  ``looks_native``.
- ``mergify_cli/queue/api.py``: removes ``QueueStatusResponse``,
  ``QueueBatch``, ``QueuePause``, ``QueueChecksSummary``,
  ``QueueBatchStatus``, ``QueuePullRequest``,
  ``QueuePullRequestAuthor``, and ``get_queue_status`` — all
  now Rust-native. ``QueuePullResponse`` and friends stay for
  the still-shimmed ``queue show`` (next phase).
- ``mergify_cli/queue/cli.py``: removes the ``@queue.command
  status`` block and the helpers it owned (``STATUS_STYLES``,
  ``_status_text``, ``_batch_label``, ``_pr_label``,
  ``_topological_sort``, ``_group_batches_by_scope``,
  ``_print_batches``, ``_print_waiting_prs``).
  ``_relative_time`` stays — ``show`` still uses it.
- ``mergify_cli/tests/queue/test_cli.py``: deletes
  ``TestStatusCommand``, ``TestTopologicalSort``, and the
  ``_invoke_status`` helper. ``TestRelativeTime`` stays.

Workspace: 138 Rust tests green, 590 Python tests green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Change-Id: I8cebcd325f05173dfa41083da2ec6516a6ec3a3f
@jd jd force-pushed the devs/jd/worktree-rust-port/port-queue-status-native-rust-phase-1-7--8cebcd32 branch from 4be1b66 to d75104b Compare May 6, 2026 13:00
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-git-refs-ci-queue-info-native-rust-phase--8d3f96e6 branch from c3fc948 to 6421363 Compare May 6, 2026 13:00
@jd jd temporarily deployed to func-tests-live May 6, 2026 13:00 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 6, 2026 13:00 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 6, 2026 13:00 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 6, 2026 13: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