diff --git a/crates/uv-shell/Cargo.toml b/crates/uv-shell/Cargo.toml index 062bf74e8aa97..a6040c07a5ba9 100644 --- a/crates/uv-shell/Cargo.toml +++ b/crates/uv-shell/Cargo.toml @@ -11,8 +11,8 @@ workspace = true uv-fs = { workspace = true } anyhow = { workspace = true } -home = { workspace = true } -same-file = { workspace = true } +home = { workspace = true } +same-file = { workspace = true } tracing = { workspace = true } [target.'cfg(windows)'.dependencies] diff --git a/crates/uv-shell/src/lib.rs b/crates/uv-shell/src/lib.rs index a5722a546b9c6..d5a8e117b319c 100644 --- a/crates/uv-shell/src/lib.rs +++ b/crates/uv-shell/src/lib.rs @@ -171,10 +171,20 @@ impl Shell { /// Returns `true` if the given path is on the `PATH` in this shell. pub fn contains_path(path: &Path) -> bool { + let home_dir = home::home_dir(); std::env::var_os("PATH") .as_ref() .iter() .flat_map(std::env::split_paths) + .map(|path| { + // If the first component is `~`, expand to the home directory. + if let Some(home_dir) = home_dir.as_ref() { + if path.components().next().map(|c| c.as_os_str()) == Some("~".as_ref()) { + return home_dir.join(path.components().skip(1).collect::()); + } + } + path + }) .any(|p| same_file::is_same_file(path, p).unwrap_or(false)) }