Skip to content
4 changes: 3 additions & 1 deletion crates/uv-build-frontend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,9 @@ impl SourceBuild {
interpreter.clone(),
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::TemporaryEnvironment,
),
false,
false,
false,
Expand Down
2 changes: 1 addition & 1 deletion crates/uv-tool/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ impl InstalledTools {
interpreter,
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(uv_virtualenv::RemovalReason::Requested),
false,
false,
false,
Expand Down
2 changes: 1 addition & 1 deletion crates/uv-virtualenv/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use thiserror::Error;
use uv_preview::Preview;
use uv_python::{Interpreter, PythonEnvironment};

pub use virtualenv::{OnExisting, remove_virtualenv};
pub use virtualenv::{OnExisting, RemovalReason, remove_virtualenv};

mod virtualenv;

Expand Down
26 changes: 22 additions & 4 deletions crates/uv-virtualenv/src/virtualenv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,14 @@ pub(crate) fn create(
OnExisting::Allow => {
debug!("Allowing existing {name} due to `--allow-existing`");
}
OnExisting::Remove => {
debug!("Removing existing {name} due to `--clear`");
OnExisting::Remove(source) => {
let reason = match source {
RemovalReason::UserRequest => "due to `--clear`",
RemovalReason::ManagedEnvironment => "for environment synchronization",
RemovalReason::TemporaryEnvironment => "for temporary environment",
RemovalReason::Requested => "as requested",
};
debug!("Removing existing {name} {reason}");
// Before removing the virtual environment, we need to canonicalize the path
// because `Path::metadata` will follow the symlink but we're still operating on
// the unresolved path and will remove the symlink itself.
Expand Down Expand Up @@ -634,6 +640,18 @@ pub fn remove_virtualenv(location: &Path) -> Result<(), Error> {
Ok(())
}

#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum RemovalReason {
/// Removal triggered by user request (`--clear` flag or `UV_VENV_CLEAR`)
UserRequest,
/// Removal for temporary environments (build isolation, cache, etc.)
TemporaryEnvironment,
/// Removal for managed environments (sync operations)
ManagedEnvironment,
/// Removal as explicitly requested
Requested,
}

#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]
pub enum OnExisting {
/// Prompt before removing an existing directory.
Expand All @@ -647,15 +665,15 @@ pub enum OnExisting {
/// files in the directory.
Allow,
/// Remove an existing directory.
Remove,
Remove(RemovalReason),
}

impl OnExisting {
pub fn from_args(allow_existing: bool, clear: bool, no_clear: bool) -> Self {
if allow_existing {
Self::Allow
} else if clear {
Self::Remove
Self::Remove(RemovalReason::UserRequest)
} else if no_clear {
Self::Fail
} else {
Expand Down
2 changes: 1 addition & 1 deletion crates/uv/src/commands/project/environment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ impl CachedEnvironment {
interpreter,
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(uv_virtualenv::RemovalReason::TemporaryEnvironment),
true,
false,
false,
Expand Down
16 changes: 12 additions & 4 deletions crates/uv/src/commands/project/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1368,7 +1368,9 @@ impl ProjectEnvironment {
interpreter,
prompt,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::ManagedEnvironment,
),
false,
false,
upgradeable,
Expand Down Expand Up @@ -1408,7 +1410,9 @@ impl ProjectEnvironment {
interpreter,
prompt,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::ManagedEnvironment,
),
false,
false,
upgradeable,
Expand Down Expand Up @@ -1560,7 +1564,9 @@ impl ScriptEnvironment {
interpreter,
prompt,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::ManagedEnvironment,
),
false,
false,
upgradeable,
Expand Down Expand Up @@ -1600,7 +1606,9 @@ impl ScriptEnvironment {
interpreter,
prompt,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::ManagedEnvironment,
),
false,
false,
upgradeable,
Expand Down
16 changes: 12 additions & 4 deletions crates/uv/src/commands/project/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -481,7 +481,9 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
interpreter,
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::TemporaryEnvironment,
),
false,
false,
false,
Expand Down Expand Up @@ -681,7 +683,9 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
interpreter,
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::TemporaryEnvironment,
),
false,
false,
false,
Expand Down Expand Up @@ -914,7 +918,9 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
interpreter,
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::TemporaryEnvironment,
),
false,
false,
false,
Expand Down Expand Up @@ -1040,7 +1046,9 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
base_interpreter.clone(),
uv_virtualenv::Prompt::None,
false,
uv_virtualenv::OnExisting::Remove,
uv_virtualenv::OnExisting::Remove(
uv_virtualenv::RemovalReason::TemporaryEnvironment,
),
false,
false,
false,
Expand Down
Loading