Skip to content

Conversation

@OsamaMIT
Copy link
Contributor

Summary

This PR adds support for external subcommands in the hugr-clibinary, as per the feature request from issue #1343.
Now when you run:

hugr <subcommand> [args…]

if an executable named hugr-<subcommand> is on your PATH, it will be called with the same [args…]. If the binary is missing or fails, you get a clear error and non-zero exit code.


Details

Functionality:

  • src/main.rs

    1. Checks for no subcommand and errors out.

    2. Builds hugr-<subcommand> from the first arg.

    3. Runs it with std::process::Command, passing the remaining args.

    4. On error:

      • If not found →

        error: no such subcommand: '<subcommand>'.  
        Could not find 'hugr-<subcommand>' in PATH.
        
      • Other I/O errors →

        error: failed to invoke '<executable>': <error>
        

Testing:

  • hugr-cli/tests/external.rs

    • test_missing_external_command
      Runs hugr idontexist and checks for a “no such subcommand” error.

    • test_external_command_invocation

      1. Creates a temp dir with a dummy hugr-dummy script that echoes its args and exits 42.
      2. Prepends that dir to PATH.
      3. Runs hugr dummy foo bar and checks it prints dummy called: foo bar and exits 42.
  • Adds tempfile to dev-dependencies in Cargo.toml for these tests.


Closes #1343

@OsamaMIT OsamaMIT requested a review from a team as a code owner May 30, 2025 18:09
@OsamaMIT OsamaMIT requested a review from ss2165 May 30, 2025 18:09
@codecov
Copy link

codecov bot commented May 31, 2025

Codecov Report

Attention: Patch coverage is 73.91304% with 6 lines in your changes missing coverage. Please review.

Project coverage is 82.15%. Comparing base (ede8e7b) to head (6671809).
Report is 8 commits behind head on main.

Files with missing lines Patch % Lines
hugr-cli/src/main.rs 73.91% 6 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2278      +/-   ##
==========================================
- Coverage   82.15%   82.15%   -0.01%     
==========================================
  Files         239      239              
  Lines       42989    43010      +21     
  Branches    38901    38922      +21     
==========================================
+ Hits        35319    35334      +15     
- Misses       5679     5685       +6     
  Partials     1991     1991              
Flag Coverage Δ
python 85.34% <ø> (ø)
rust 81.81% <73.91%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@aborgna-q aborgna-q self-requested a review June 2, 2025 07:29
Copy link
Collaborator

@aborgna-q aborgna-q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, thanks!

I just have a couple comments, to make it pass the CI checks

@aborgna-q aborgna-q removed the request for review from ss2165 June 2, 2025 07:55
@OsamaMIT OsamaMIT requested a review from aborgna-q June 2, 2025 10:55
Copy link
Collaborator

@aborgna-q aborgna-q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, thanks for contributing!

@aborgna-q aborgna-q added this pull request to the merge queue Jun 3, 2025
Merged via the queue into Quantinuum:main with commit 2018304 Jun 3, 2025
26 of 27 checks passed
@hugrbot hugrbot mentioned this pull request Jun 3, 2025
github-merge-queue bot pushed a commit that referenced this pull request Jun 3, 2025
## 🤖 New release

* `hugr-model`: 0.20.0 -> 0.20.1
* `hugr-core`: 0.20.0 -> 0.20.1 (✓ API compatible changes)
* `hugr-llvm`: 0.20.0 -> 0.20.1 (✓ API compatible changes)
* `hugr-passes`: 0.20.0 -> 0.20.1 (✓ API compatible changes)
* `hugr`: 0.20.0 -> 0.20.1 (✓ API compatible changes)
* `hugr-cli`: 0.20.0 -> 0.20.1 (✓ API compatible changes)

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.20.0](hugr-model-v0.19.0...hugr-model-v0.20.0)
- 2025-05-14

### New Features

- [**breaking**] Mark all Error enums as non_exhaustive
([#2056](#2056))
- [**breaking**] Bump MSRV to 1.85
([#2136](#2136))
- Export and import entrypoints via metadata in `hugr-model`.
([#2172](#2172))
- Define text-model envelope formats
([#2188](#2188))
- Import CFG regions without adding an entry block.
([#2200](#2200))
- Symbol applications can leave out prefixes of wildcards.
([#2201](#2201))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.20.1](hugr-core-v0.20.0...hugr-core-v0.20.1)
- 2025-06-03

### Bug Fixes

- check well-definedness of DFG wires in validate
([#2221](#2221))
- Check for order edges in SiblingSubgraph::from_node
([#2223](#2223))
- Make SumType::Unit(N) equal to SumType::General([(); N])
([#2250](#2250))
- canonicalize_nodes sometimes mangles the entrypoint
([#2263](#2263))

### New Features

- Add PersistentHugr ([#2080](#2080))
- Add `Type::used_extensions`
([#2224](#2224))
- Add boundary edge traversal in SimpleReplacement
([#2231](#2231))
- Add signature map function for DFGs
([#2239](#2239))
- PersistentHugr implements HugrView
([#2202](#2202))
- PersistentHugr Walker API
([#2168](#2168))
- Hugr::store_with_exts and auto-include in serde_as
([#2280](#2280))

### Refactor

- tidies/readability improvements to PersistentHugr
([#2251](#2251))
- Deprecate ValidationError::ExtensionError
([#2281](#2281))

### Testing

- Ignore miri errors in tests involving `assert_snapshot`
([#2261](#2261))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.20.1](hugr-llvm-v0.20.0...hugr-llvm-v0.20.1)
- 2025-06-03

### Bug Fixes

- Make SumType::Unit(N) equal to SumType::General([(); N])
([#2250](#2250))

### Testing

- Add exec tests for widen op
([#2043](#2043))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.20.1](hugr-passes-v0.20.0...hugr-passes-v0.20.1)
- 2025-06-03

### Bug Fixes

- Dataflow analysis produces unsound results on Hugrs with entrypoint
([#2255](#2255))

### New Features

- LocalizeEdges pass ([#2237](#2237))
</blockquote>

## `hugr`

<blockquote>

##
[0.20.1](hugr-v0.20.0...hugr-v0.20.1)
- 2025-06-03

### Bug Fixes

- Dataflow analysis produces unsound results on Hugrs with entrypoint
([#2255](#2255))
- check well-definedness of DFG wires in validate
([#2221](#2221))
- Check for order edges in SiblingSubgraph::from_node
([#2223](#2223))
- Make SumType::Unit(N) equal to SumType::General([(); N])
([#2250](#2250))
- canonicalize_nodes sometimes mangles the entrypoint
([#2263](#2263))

### New Features

- LocalizeEdges pass ([#2237](#2237))
- Add PersistentHugr ([#2080](#2080))
- Add `Type::used_extensions`
([#2224](#2224))
- Add boundary edge traversal in SimpleReplacement
([#2231](#2231))
- Add signature map function for DFGs
([#2239](#2239))
- PersistentHugr implements HugrView
([#2202](#2202))
- PersistentHugr Walker API
([#2168](#2168))
- Hugr::store_with_exts and auto-include in serde_as
([#2280](#2280))

### Refactor

- tidies/readability improvements to PersistentHugr
([#2251](#2251))
- Deprecate ValidationError::ExtensionError
([#2281](#2281))

### Testing

- Ignore miri errors in tests involving `assert_snapshot`
([#2261](#2261))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.20.1](hugr-cli-v0.20.0...hugr-cli-v0.20.1)
- 2025-06-03

### New Features

- support external subcommands via PATH
([#1343](#1343))
([#2278](#2278))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
@hugrbot hugrbot mentioned this pull request Jun 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for external clap subcommands in hugr-cli

2 participants