diff --git a/crates/uv-cli/src/lib.rs b/crates/uv-cli/src/lib.rs index 2a15ba20f..08a816e15 100644 --- a/crates/uv-cli/src/lib.rs +++ b/crates/uv-cli/src/lib.rs @@ -76,7 +76,6 @@ const STYLES: Styles = Styles::styled() #[derive(Parser)] #[command(name = "uv", author, long_version = crate::version::uv_self_version())] #[command(about = "An extremely fast Python package manager.")] -#[command(propagate_version = true)] #[command( after_help = "Use `uv help` for more details.", after_long_help = "", @@ -127,7 +126,7 @@ pub struct TopLevelArgs { help: Option, /// Display the uv version. - #[arg(global = true, short = 'V', long, action = clap::ArgAction::Version, help_heading = "Global options")] + #[arg(short = 'V', long, action = clap::ArgAction::Version)] version: Option, } @@ -4063,9 +4062,10 @@ pub enum ToolCommand { override_usage = "uvx [OPTIONS] [COMMAND]", about = "Run a command provided by a Python package.", after_help = "Use `uv help tool run` for more details.", - after_long_help = "" + after_long_help = "", + long_version = crate::version::uv_self_version() )] - Uvx(ToolRunArgs), + Uvx(UvxArgs), /// Install commands provided by a Python package. /// /// Packages are installed into an isolated virtual environment in the uv tools directory. The @@ -4223,6 +4223,16 @@ pub struct ToolRunArgs { pub generate_shell_completion: Option, } +#[derive(Args)] +pub struct UvxArgs { + #[command(flatten)] + pub tool_run: ToolRunArgs, + + /// Display the uvx version. + #[arg(short = 'V', long, action = clap::ArgAction::Version)] + pub version: Option, +} + #[derive(Args)] #[allow(clippy::struct_excessive_bools)] pub struct ToolInstallArgs { diff --git a/crates/uv/src/lib.rs b/crates/uv/src/lib.rs index bdef0be80..1dd8b2464 100644 --- a/crates/uv/src/lib.rs +++ b/crates/uv/src/lib.rs @@ -1067,7 +1067,7 @@ async fn run(mut cli: Cli) -> Result { command: run_variant @ (ToolCommand::Uvx(_) | ToolCommand::Run(_)), }) => { let (args, invocation_source) = match run_variant { - ToolCommand::Uvx(args) => (args, ToolRunCommand::Uvx), + ToolCommand::Uvx(args) => (args.tool_run, ToolRunCommand::Uvx), ToolCommand::Run(args) => (args, ToolRunCommand::ToolRun), // OK guarded by the outer match statement _ => unreachable!(), @@ -1081,15 +1081,15 @@ async fn run(mut cli: Cli) -> Result { .find_subcommand("uvx") .unwrap() .clone() - // Avoid duplicating the `--help` and `--version` flags from the top-level arguments. + // Avoid duplicating the `--help` and `--version` flags from the top-level + // arguments. .disable_help_flag(true) - .disable_version_flag(true) - .version(env!("CARGO_PKG_VERSION")); + .disable_version_flag(true); - // Copy the top-level arguments into the `uvx` command. (Like `Args::augment_args`, but - // expanded to skip collisions.) + // Copy the top-level arguments into the `uvx` command, as in `Args::augment_args`, + // but expanded to skip collisions. for arg in TopLevelArgs::command().get_arguments() { - if arg.get_id() != "isolated" { + if arg.get_id() != "isolated" && arg.get_id() != "version" { uvx = uvx.arg(arg); } } diff --git a/crates/uv/tests/it/help.rs b/crates/uv/tests/it/help.rs index b1f883f49..c3d9f853a 100644 --- a/crates/uv/tests/it/help.rs +++ b/crates/uv/tests/it/help.rs @@ -438,9 +438,6 @@ fn help_subcommand() { -h, --help Display the concise help for this command - -V, --version - Display the uv version - Use `uv help python ` for more information on a specific command. @@ -691,9 +688,6 @@ fn help_subsubcommand() { -h, --help Display the concise help for this command - -V, --version - Display the uv version - ----- stderr ----- "#); @@ -755,8 +749,6 @@ fn help_flag_subcommand() { Avoid discovering configuration files (`pyproject.toml`, `uv.toml`) [env: UV_NO_CONFIG=] -h, --help Display the concise help for this command - -V, --version - Display the uv version Use `uv help python` for more details. @@ -826,8 +818,6 @@ fn help_flag_subsubcommand() { Avoid discovering configuration files (`pyproject.toml`, `uv.toml`) [env: UV_NO_CONFIG=] -h, --help Display the concise help for this command - -V, --version - Display the uv version ----- stderr ----- "#); @@ -896,7 +886,7 @@ fn help_unknown_subcommand() { fn help_unknown_subsubcommand() { let context = TestContext::new_with_versions(&[]); - uv_snapshot!(context.filters(), context.help().arg("python").arg("foobar"), @r###" + uv_snapshot!(context.filters(), context.help().arg("python").arg("foobar"), @r" success: false exit_code: 2 ----- stdout ----- @@ -909,7 +899,7 @@ fn help_unknown_subsubcommand() { pin dir uninstall - "###); + "); } #[test] @@ -1014,14 +1004,20 @@ fn help_with_help() { fn help_with_version() { let context = TestContext::new_with_versions(&[]); - uv_snapshot!(context.filters(), context.help().arg("--version"), @r###" - success: true - exit_code: 0 + uv_snapshot!(context.filters(), context.help().arg("--version"), @r" + success: false + exit_code: 2 ----- stdout ----- - uv [VERSION] ([COMMIT] DATE) ----- stderr ----- - "###); + error: unexpected argument '--version' found + + tip: a similar argument exists: '--verbose' + + Usage: uv help --verbose... [COMMAND]... + + For more information, try '--help'. + "); } #[test] diff --git a/crates/uv/tests/it/run.rs b/crates/uv/tests/it/run.rs index f3c833fa3..3b56ff161 100644 --- a/crates/uv/tests/it/run.rs +++ b/crates/uv/tests/it/run.rs @@ -143,6 +143,10 @@ fn run_with_python_version() -> Result<()> { fn run_args() -> Result<()> { let context = TestContext::new("3.12"); + let mut filters = context.filters(); + filters.push((r"Usage: (uv|\.exe) run \[OPTIONS\] (?s).*", "[UV RUN HELP]")); + filters.push((r"usage: (\[VENV\]|\[PYTHON-3.12\])(?s).*", "[PYTHON HELP]")); + let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" [project] @@ -158,31 +162,25 @@ fn run_args() -> Result<()> { })?; // We treat arguments before the command as uv arguments - uv_snapshot!(context.filters(), context.run().arg("--version").arg("python"), @r###" + uv_snapshot!(filters, context.run().arg("--help").arg("python"), @r" success: true exit_code: 0 ----- stdout ----- - uv [VERSION] ([COMMIT] DATE) + Run a command or script - ----- stderr ----- - "###); + [UV RUN HELP] + "); // We don't treat arguments after the command as uv arguments - uv_snapshot!(context.filters(), context.run().arg("python").arg("--version"), @r###" + uv_snapshot!(filters, context.run().arg("python").arg("--help"), @r" success: true exit_code: 0 ----- stdout ----- - Python 3.12.[X] - - ----- stderr ----- - Resolved 1 package in [TIME] - Prepared 1 package in [TIME] - Installed 1 package in [TIME] - + foo==1.0.0 (from file://[TEMP_DIR]/) - "###); + [PYTHON HELP] + "); // Can use `--` to separate uv arguments from the command arguments. - uv_snapshot!(context.filters(), context.run().arg("--").arg("python").arg("--version"), @r###" + uv_snapshot!(filters, context.run().arg("--").arg("python").arg("--version"), @r###" success: true exit_code: 0 ----- stdout ----- diff --git a/crates/uv/tests/it/tool_run.rs b/crates/uv/tests/it/tool_run.rs index 037cd41af..fb5e2f182 100644 --- a/crates/uv/tests/it/tool_run.rs +++ b/crates/uv/tests/it/tool_run.rs @@ -9,46 +9,43 @@ use uv_static::EnvVars; #[test] fn tool_run_args() { let context = TestContext::new("3.12").with_filtered_counts(); + let mut filters = context.filters(); + filters.push(( + r"Usage: uv tool run \[OPTIONS\] (?s).*", + "[UV TOOL RUN HELP]", + )); + filters.push((r"usage: pytest \[options\] (?s).*", "[PYTEST HELP]")); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); - // We treat arguments before the command as uv arguments - uv_snapshot!(context.filters(), context.tool_run() - .arg("--version") + // We treat arguments before the command as uv tool run arguments + uv_snapshot!(filters, context.tool_run() + .arg("--help") .arg("pytest") .env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str()) - .env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str()), @r###" + .env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str()), @r" success: true exit_code: 0 ----- stdout ----- - uv [VERSION] ([COMMIT] DATE) + Run a command provided by a Python package - ----- stderr ----- - "###); + [UV TOOL RUN HELP] + "); - // We don't treat arguments after the command as uv arguments - uv_snapshot!(context.filters(), context.tool_run() + // We don't treat arguments after the command as uv tool run arguments + uv_snapshot!(filters, context.tool_run() .arg("pytest") - .arg("--version") + .arg("--help") .env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str()) - .env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str()), @r###" + .env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str()), @r" success: true exit_code: 0 ----- stdout ----- - pytest 8.1.1 - - ----- stderr ----- - Resolved [N] packages in [TIME] - Prepared [N] packages in [TIME] - Installed [N] packages in [TIME] - + iniconfig==2.0.0 - + packaging==24.0 - + pluggy==1.4.0 - + pytest==8.1.1 - "###); + [PYTEST HELP] + "); // Can use `--` to separate uv arguments from the command arguments. - uv_snapshot!(context.filters(), context.tool_run() + uv_snapshot!(filters, context.tool_run() .arg("--") .arg("pytest") .arg("--version") diff --git a/docs/reference/cli.md b/docs/reference/cli.md index a6d10b21c..2ccbdc2cb 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -481,8 +481,6 @@ uv run [OPTIONS] [COMMAND]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
--with with

Run with the given packages installed.

When used in a project, these dependencies will be layered on top of the project environment in a separate, ephemeral environment. These dependencies are allowed to conflict with those specified by the project.

@@ -733,8 +731,6 @@ uv init [OPTIONS] [PATH]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv add @@ -1116,8 +1112,6 @@ uv add [OPTIONS] >

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv remove @@ -1464,8 +1458,6 @@ uv remove [OPTIONS] ...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv sync @@ -1890,8 +1882,6 @@ uv sync [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv lock @@ -2208,8 +2198,6 @@ uv lock [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv export @@ -2617,8 +2605,6 @@ uv export [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv tree @@ -3061,8 +3047,6 @@ uv tree [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv tool @@ -3435,8 +3419,6 @@ uv tool run [OPTIONS] [COMMAND]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
--with with

Run with the given packages installed

--with-editable with-editable

Run with the given packages installed in editable mode

@@ -3777,8 +3759,6 @@ uv tool install [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
--with with

Include the following extra requirements

--with-editable with-editable

Include the given packages in editable mode

@@ -4086,8 +4066,6 @@ uv tool upgrade [OPTIONS] ...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv tool list @@ -4202,8 +4180,6 @@ uv tool list [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv tool uninstall @@ -4324,8 +4300,6 @@ uv tool uninstall [OPTIONS] ...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv tool update-shell @@ -4444,8 +4418,6 @@ uv tool update-shell [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv tool dir @@ -4582,8 +4554,6 @@ uv tool dir [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv python @@ -4812,8 +4782,6 @@ uv python list [OPTIONS] [REQUEST]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv python install @@ -4985,8 +4953,6 @@ uv python install [OPTIONS] [TARGETS]...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv python find @@ -5126,8 +5092,6 @@ uv python find [OPTIONS] [REQUEST]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv python pin @@ -5276,8 +5240,6 @@ uv python pin [OPTIONS] [REQUEST]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv python dir @@ -5412,8 +5374,6 @@ uv python dir [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv python uninstall @@ -5539,8 +5499,6 @@ uv python uninstall [OPTIONS] ...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv pip @@ -6137,8 +6095,6 @@ uv pip compile [OPTIONS] >

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip sync @@ -6604,8 +6560,6 @@ uv pip sync [OPTIONS] ...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip install @@ -7157,8 +7111,6 @@ uv pip install [OPTIONS] |--editable You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip uninstall @@ -7318,8 +7270,6 @@ uv pip uninstall [OPTIONS] >

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip freeze @@ -7452,8 +7402,6 @@ uv pip freeze [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip list @@ -7674,8 +7622,6 @@ uv pip list [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip show @@ -7812,8 +7758,6 @@ uv pip show [OPTIONS] [PACKAGE]...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip tree @@ -8027,8 +7971,6 @@ uv pip tree [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv pip check @@ -8155,8 +8097,6 @@ uv pip check [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv venv @@ -8419,8 +8359,6 @@ uv venv [OPTIONS] [PATH]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv build @@ -8774,8 +8712,6 @@ uv build [OPTIONS] [SRC]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
--wheel

Build a binary distribution ("wheel") from the given directory

@@ -8971,8 +8907,6 @@ uv publish --publish-url https://upload.pypi.org/legacy/ --check-url https://pyp

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv cache @@ -9111,8 +9045,6 @@ uv cache clean [OPTIONS] [PACKAGE]...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv cache prune @@ -9231,8 +9163,6 @@ uv cache prune [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv cache dir @@ -9353,8 +9283,6 @@ uv cache dir [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv self @@ -9494,8 +9422,6 @@ uv self update [OPTIONS] [TARGET_VERSION]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
### uv self version @@ -9610,8 +9536,6 @@ uv self version [OPTIONS]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv version @@ -9751,8 +9675,6 @@ uv version [OPTIONS] [VALUE]

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-
## uv generate-shell-completion @@ -9927,7 +9849,5 @@ uv help [OPTIONS] [COMMAND]...

You can configure fine-grained logging using the RUST_LOG environment variable. (<https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives>)

-
--version, -V

Display the uv version

-