From d5012c66bd3a1eb9c2206dcd5e0326e0bca15190 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 17 Sep 2025 11:34:23 -0500 Subject: [PATCH] Add handling for unnamed conda environments in base environment detection (#15681) While investigating https://github.com/astral-sh/uv/pull/15679, I created an unnamed conda environment and noticed this quality which allows us to detect that it's not the base environment. --- crates/uv-python/src/lib.rs | 30 ++++++++++++++++++++++++++++++ crates/uv-python/src/virtualenv.rs | 6 ++++++ 2 files changed, 36 insertions(+) diff --git a/crates/uv-python/src/lib.rs b/crates/uv-python/src/lib.rs index 173b10135..f45b901ab 100644 --- a/crates/uv-python/src/lib.rs +++ b/crates/uv-python/src/lib.rs @@ -1337,6 +1337,36 @@ mod tests { "Non-base conda environment should be available for virtual environment preference" ); + // When CONDA_PREFIX equals CONDA_DEFAULT_ENV, it should be treated as a virtual environment + let unnamed_env = context.tempdir.child("my-conda-env"); + TestContext::mock_conda_prefix(&unnamed_env, "3.12.4")?; + let unnamed_env_path = unnamed_env.to_string_lossy().to_string(); + + let python = context.run_with_vars( + &[ + (EnvVars::CONDA_PREFIX, Some(unnamed_env.as_os_str())), + ( + EnvVars::CONDA_DEFAULT_ENV, + Some(&OsString::from(&unnamed_env_path)), + ), + ], + || { + find_python_installation( + &PythonRequest::Default, + EnvironmentPreference::OnlyVirtual, + PythonPreference::OnlySystem, + &context.cache, + Preview::default(), + ) + }, + )??; + + assert_eq!( + python.interpreter().python_full_version().to_string(), + "3.12.4", + "We should find the unnamed conda environment" + ); + Ok(()) } diff --git a/crates/uv-python/src/virtualenv.rs b/crates/uv-python/src/virtualenv.rs index 7cdde7ba9..db3c90b48 100644 --- a/crates/uv-python/src/virtualenv.rs +++ b/crates/uv-python/src/virtualenv.rs @@ -98,6 +98,12 @@ impl CondaEnvironmentKind { return Self::Child; }; + // If the `CONDA_PREFIX` equals the `CONDA_DEFAULT_ENV`, we're in an unnamed environment + // which is typical for environments created with `conda create -p /path/to/env`. + if path == Path::new(¤t_env) { + return Self::Child; + } + // These are the expected names for the base environment; we may want to remove this // restriction in the future as it's not strictly necessary. if current_env != "base" && current_env != "root" {