Skip to content

fix(cli): surface clap's --help instead of erroring on native subcommands#1380

Open
jd wants to merge 1 commit intomainfrom
devs/jd/worktree-rust-port/surface-clap-s-help-instead-erroring-native--2922aa2d
Open

fix(cli): surface clap's --help instead of erroring on native subcommands#1380
jd wants to merge 1 commit intomainfrom
devs/jd/worktree-rust-port/surface-clap-s-help-instead-erroring-native--2922aa2d

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented May 6, 2026

Reported by user: mergify queue status --help rejected the
flag with error: unexpected argument '--help' found. Root
cause: CliRoot had disable_help_flag = true, so clap's
auto-generated --help machinery wasn't wired up — and our
detect_native then surfaced the resulting parser error
(because looks_native matched) instead of falling through.

Three changes:

  1. Drop disable_help_flag = true from CliRoot. clap now
    auto-recognizes -h / --help at every level and
    generates its standard help blurb listing flags + subcommands.

  2. detect_native catches the special help-error kinds
    (DisplayHelp and
    DisplayHelpOnMissingArgumentOrSubcommand) explicitly and
    calls err.exit() regardless of the looks_native
    heuristic. err.exit() prints help to stdout and calls
    process::exit(0). The previous flow also called
    err.exit() on parser errors when looks_native, but it
    only fired when the argv contained a (group, subcommand) pair
    — root-level mergify --help had no such pair so it would
    have leaked to the Python shim.

  3. Honor MERGIFY_CLI_TESTING_UTF8_MODE from the Rust binary.
    test_binary_build.py runs mergify --help against the
    wheel-installed binary to verify UTF-8 emoji output works
    (particularly on Windows). The marker used to be printed by
    mergify_cli/cli.py::main, but now that --help is
    handled natively the Python path no longer fires. Mirror the
    marker from the Rust binary: the binary is UTF-8 native on
    every platform (no os.execv re-exec needed), so report
    utf8_mode=1 on Windows (matching the post-re-exec value
    the test expects) and utf8_mode=0 elsewhere.

Verified locally:

  • mergify --help lists the three native top-level groups
    (config / ci / queue).
  • mergify queue --help lists the native queue subcommands
    (pause / unpause / status).
  • mergify queue status --help shows --branch / --json
    / --token / --api-url / --repository with their
    doc-strings.
  • MERGIFY_CLI_TESTING_UTF8_MODE=1 mergify --help prints
    utf8_mode=0 and before the help text.

Known follow-up: mergify queue --help doesn't list show
because it's still shimmed (no clap variant). Fixable by
registering opaque clap stubs for shimmed commands; deferred to
the PR that ports queue show.

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

@jd
Copy link
Copy Markdown
Member Author

jd commented May 6, 2026

This pull request is part of a Mergify stack:

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

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented May 6, 2026

Merge Protections

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

🔴 👀 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/extract-reusable-terminal-ui-primitives-mergify--bbdbce1e branch from bd4d24c to 3697e5a Compare May 7, 2026 13:40
@jd jd force-pushed the devs/jd/worktree-rust-port/surface-clap-s-help-instead-erroring-native--2922aa2d branch from fef89f9 to aa9b1b2 Compare May 7, 2026 13:40
@jd
Copy link
Copy Markdown
Member Author

jd commented May 7, 2026

Revision history

# Type Changes Reason Date
1 initial fef89f9 2026-05-07 13:40 UTC
2 content fef89f9 → aa9b1b2 2026-05-07 13:40 UTC
3 content aa9b1b2 → 544e9b2 2026-05-07 15:17 UTC

@jd jd temporarily deployed to func-tests-live May 7, 2026 13:40 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 7, 2026 13:40 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 7, 2026 13:40 Failure
@mergify mergify Bot requested a review from a team May 7, 2026 13:53
@jd jd marked this pull request as ready for review May 7, 2026 15:02
…ands

Reported by user: ``mergify queue status --help`` rejected the
flag with ``error: unexpected argument '--help' found``. Root
cause: ``CliRoot`` had ``disable_help_flag = true``, so clap's
auto-generated ``--help`` machinery wasn't wired up — and our
``detect_native`` then surfaced the resulting parser error
(because ``looks_native`` matched) instead of falling through.

Three changes:

1. Drop ``disable_help_flag = true`` from ``CliRoot``. clap now
   auto-recognizes ``-h`` / ``--help`` at every level and
   generates its standard help blurb listing flags + subcommands.

2. ``detect_native`` catches the special help-error kinds
   (``DisplayHelp`` and
   ``DisplayHelpOnMissingArgumentOrSubcommand``) explicitly and
   calls ``err.exit()`` regardless of the ``looks_native``
   heuristic. ``err.exit()`` prints help to stdout and calls
   ``process::exit(0)``. The previous flow also called
   ``err.exit()`` on parser errors when ``looks_native``, but it
   only fired when the argv contained a (group, subcommand) pair
   — root-level ``mergify --help`` had no such pair so it would
   have leaked to the Python shim.

3. Honor ``MERGIFY_CLI_TESTING_UTF8_MODE`` from the Rust binary.
   ``test_binary_build.py`` runs ``mergify --help`` against the
   wheel-installed binary to verify UTF-8 emoji output works
   (particularly on Windows). The marker used to be printed by
   ``mergify_cli/cli.py::main``, but now that ``--help`` is
   handled natively the Python path no longer fires. Mirror the
   marker from the Rust binary: the binary is UTF-8 native on
   every platform (no ``os.execv`` re-exec needed), so report
   ``utf8_mode=1`` on Windows (matching the post-re-exec value
   the test expects) and ``utf8_mode=0`` elsewhere.

Verified locally:

- ``mergify --help`` lists the three native top-level groups
  (``config`` / ``ci`` / ``queue``).
- ``mergify queue --help`` lists the native queue subcommands
  (``pause`` / ``unpause`` / ``status``).
- ``mergify queue status --help`` shows ``--branch`` / ``--json``
  / ``--token`` / ``--api-url`` / ``--repository`` with their
  doc-strings.
- ``MERGIFY_CLI_TESTING_UTF8_MODE=1 mergify --help`` prints
  ``utf8_mode=0`` and ``✅`` before the help text.

Known follow-up: ``mergify queue --help`` doesn't list ``show``
because it's still shimmed (no clap variant). Fixable by
registering opaque clap stubs for shimmed commands; deferred to
the PR that ports ``queue show``.

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

Change-Id: I2922aa2d83af6c99cb551f2a95bf5a4959832375
@jd jd changed the base branch from devs/jd/worktree-rust-port/extract-reusable-terminal-ui-primitives-mergify--bbdbce1e to main May 7, 2026 15:17
@jd jd force-pushed the devs/jd/worktree-rust-port/surface-clap-s-help-instead-erroring-native--2922aa2d branch from aa9b1b2 to 544e9b2 Compare May 7, 2026 15:17
@jd jd temporarily deployed to func-tests-live May 7, 2026 15:17 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 7, 2026 15:17 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