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, -VDisplay the uv version
-
--with withRun 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay the uv version
-
--with withRun with the given packages installed
--with-editable with-editableRun 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, -VDisplay the uv version
-
--with withInclude the following extra requirements
--with-editable with-editableInclude 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay the uv version
-
--wheelBuild 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay 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, -VDisplay the uv version
-