diff --git a/Cargo.lock b/Cargo.lock index 3164f0b72b290..c3ecec78d7356 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4482,6 +4482,7 @@ dependencies = [ "regex", "reqwest", "rustc-hash", + "same-file", "serde", "serde_json", "similar", diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index 32af21d9bf01c..c711da74d76b9 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -66,6 +66,7 @@ owo-colors = { workspace = true } rayon = { workspace = true } regex = { workspace = true } rustc-hash = { workspace = true } +same-file = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } tempfile = { workspace = true } diff --git a/crates/uv/src/commands/tool/install.rs b/crates/uv/src/commands/tool/install.rs index 5909581623000..ba32346729cb9 100644 --- a/crates/uv/src/commands/tool/install.rs +++ b/crates/uv/src/commands/tool/install.rs @@ -276,13 +276,25 @@ pub(crate) async fn install( installed_tools .get_environment(&from.name, &cache)? .filter(|environment| { + let same_interpreter: bool; + // NOTE(lucab): this compares `base_prefix` paths as a proxy for // detecting interpreters mismatches. Directly comparing interpreters // (by paths or binaries on-disk) would result in several false // positives on Windows due to file-copying and shims. - let old_base_prefix = environment.interpreter().sys_base_prefix(); - let selected_base_prefix = interpreter.sys_base_prefix(); - if old_base_prefix == selected_base_prefix { + #[cfg(target_os="windows")] + { + let old_base_prefix = environment.interpreter().sys_base_prefix(); + let selected_base_prefix = interpreter.sys_base_prefix(); + same_interpreter = old_base_prefix == selected_base_prefix; + } + #[cfg(not(target_os="windows"))] + { + same_interpreter = environment.interpreter().sys_executable() == interpreter.sys_executable() + || same_file::is_same_file(environment.interpreter().sys_executable(), interpreter.sys_executable()).unwrap_or(false); + } + + if same_interpreter { trace!( "Existing interpreter matches the requested interpreter for `{}`: {}", from.name,