Skip to content

Commit 5903ce5

Browse files
Avoid spurious 'Upgraded tool environment' in uv tool upgrade (#9870)
## Summary Closes #9869.
1 parent 6051a26 commit 5903ce5

File tree

2 files changed

+98
-11
lines changed

2 files changed

+98
-11
lines changed

crates/uv/src/commands/tool/upgrade.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,17 +178,19 @@ pub(crate) async fn upgrade(
178178
}
179179

180180
if let Some(python_request) = python_request {
181-
let tools = did_upgrade_environment
182-
.iter()
183-
.map(|name| format!("`{}`", name.cyan()))
184-
.collect::<Vec<_>>();
185-
let s = if tools.len() > 1 { "s" } else { "" };
186-
writeln!(
187-
printer.stderr(),
188-
"Upgraded tool environment{s} for {} to {}",
189-
conjunction(tools),
190-
python_request.cyan(),
191-
)?;
181+
if !did_upgrade_environment.is_empty() {
182+
let tools = did_upgrade_environment
183+
.iter()
184+
.map(|name| format!("`{}`", name.cyan()))
185+
.collect::<Vec<_>>();
186+
let s = if tools.len() > 1 { "s" } else { "" };
187+
writeln!(
188+
printer.stderr(),
189+
"Upgraded tool environment{s} for {} to {}",
190+
conjunction(tools),
191+
python_request.cyan(),
192+
)?;
193+
}
192194
}
193195

194196
Ok(ExitStatus::Success)

crates/uv/tests/it/tool_upgrade.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,91 @@ use uv_static::EnvVars;
55

66
use crate::common::{uv_snapshot, TestContext};
77

8+
#[test]
9+
fn tool_upgrade_empty() {
10+
let context = TestContext::new("3.12")
11+
.with_filtered_counts()
12+
.with_filtered_exe_suffix();
13+
let tool_dir = context.temp_dir.child("tools");
14+
let bin_dir = context.temp_dir.child("bin");
15+
16+
uv_snapshot!(context.filters(), context.tool_upgrade()
17+
.arg("--all")
18+
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
19+
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
20+
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
21+
success: true
22+
exit_code: 0
23+
----- stdout -----
24+
25+
----- stderr -----
26+
Nothing to upgrade
27+
"###);
28+
29+
uv_snapshot!(context.filters(), context.tool_upgrade()
30+
.arg("--all")
31+
.arg("-p")
32+
.arg("3.13")
33+
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
34+
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
35+
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
36+
success: true
37+
exit_code: 0
38+
----- stdout -----
39+
40+
----- stderr -----
41+
Nothing to upgrade
42+
"###);
43+
44+
// Install the latest `babel`.
45+
uv_snapshot!(context.filters(), context.tool_install()
46+
.arg("babel")
47+
.arg("--index-url")
48+
.arg("https://pypi.org/simple/")
49+
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
50+
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
51+
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
52+
success: true
53+
exit_code: 0
54+
----- stdout -----
55+
56+
----- stderr -----
57+
Resolved [N] packages in [TIME]
58+
Prepared [N] packages in [TIME]
59+
Installed [N] packages in [TIME]
60+
+ babel==2.14.0
61+
Installed 1 executable: pybabel
62+
"###);
63+
64+
uv_snapshot!(context.filters(), context.tool_upgrade()
65+
.arg("--all")
66+
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
67+
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
68+
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
69+
success: true
70+
exit_code: 0
71+
----- stdout -----
72+
73+
----- stderr -----
74+
Nothing to upgrade
75+
"###);
76+
77+
uv_snapshot!(context.filters(), context.tool_upgrade()
78+
.arg("--all")
79+
.arg("-p")
80+
.arg("3.12")
81+
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
82+
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
83+
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
84+
success: true
85+
exit_code: 0
86+
----- stdout -----
87+
88+
----- stderr -----
89+
Nothing to upgrade
90+
"###);
91+
}
92+
893
#[test]
994
fn tool_upgrade_name() {
1095
let context = TestContext::new("3.12")

0 commit comments

Comments
 (0)