mirror of https://github.com/astral-sh/uv
Refuse to remove non-virtual environments in `uv venv` (#15538)
## Summary Closes https://github.com/astral-sh/uv/issues/15474.
This commit is contained in:
parent
0c674619b2
commit
9eb5fc240c
|
|
@ -110,7 +110,8 @@ pub(crate) fn create(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Ok(metadata) if metadata.is_dir() => {
|
Ok(metadata) if metadata.is_dir() => {
|
||||||
let name = if uv_fs::is_virtualenv_base(location) {
|
let is_virtualenv = uv_fs::is_virtualenv_base(location);
|
||||||
|
let name = if is_virtualenv {
|
||||||
"virtual environment"
|
"virtual environment"
|
||||||
} else {
|
} else {
|
||||||
"directory"
|
"directory"
|
||||||
|
|
@ -131,7 +132,14 @@ pub(crate) fn create(
|
||||||
fs::create_dir_all(&location)?;
|
fs::create_dir_all(&location)?;
|
||||||
}
|
}
|
||||||
OnExisting::Fail => {
|
OnExisting::Fail => {
|
||||||
match confirm_clear(location, name)? {
|
let confirmation = if is_virtualenv {
|
||||||
|
confirm_clear(location, name)?
|
||||||
|
} else {
|
||||||
|
// Refuse to remove a non-virtual environment; don't even prompt.
|
||||||
|
Some(false)
|
||||||
|
};
|
||||||
|
|
||||||
|
match confirmation {
|
||||||
Some(true) => {
|
Some(true) => {
|
||||||
debug!("Removing existing {name} due to confirmation");
|
debug!("Removing existing {name} due to confirmation");
|
||||||
// Before removing the virtual environment, we need to canonicalize the
|
// Before removing the virtual environment, we need to canonicalize the
|
||||||
|
|
|
||||||
|
|
@ -958,7 +958,8 @@ fn empty_dir_exists() -> Result<()> {
|
||||||
fn non_empty_dir_exists() -> Result<()> {
|
fn non_empty_dir_exists() -> Result<()> {
|
||||||
let context = TestContext::new_with_versions(&["3.12"]);
|
let context = TestContext::new_with_versions(&["3.12"]);
|
||||||
|
|
||||||
// Create a non-empty directory at `.venv`. Creating a virtualenv at the same path should fail.
|
// Create a non-empty directory at `.venv`. Creating a virtualenv at the same path should fail,
|
||||||
|
// unless `--clear` is specified.
|
||||||
context.venv.create_dir_all()?;
|
context.venv.create_dir_all()?;
|
||||||
context.venv.child("file").touch()?;
|
context.venv.child("file").touch()?;
|
||||||
|
|
||||||
|
|
@ -966,6 +967,25 @@ fn non_empty_dir_exists() -> Result<()> {
|
||||||
.arg(context.venv.as_os_str())
|
.arg(context.venv.as_os_str())
|
||||||
.arg("--python")
|
.arg("--python")
|
||||||
.arg("3.12"), @r"
|
.arg("3.12"), @r"
|
||||||
|
success: false
|
||||||
|
exit_code: 2
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
|
Creating virtual environment at: .venv
|
||||||
|
error: Failed to create virtual environment
|
||||||
|
Caused by: A directory already exists at: .venv
|
||||||
|
|
||||||
|
hint: Use the `--clear` flag or set `UV_VENV_CLEAR=1` to replace the existing directory
|
||||||
|
"
|
||||||
|
);
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.venv()
|
||||||
|
.arg(context.venv.as_os_str())
|
||||||
|
.arg("--clear")
|
||||||
|
.arg("--python")
|
||||||
|
.arg("3.12"), @r"
|
||||||
success: true
|
success: true
|
||||||
exit_code: 0
|
exit_code: 0
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
@ -973,7 +993,6 @@ fn non_empty_dir_exists() -> Result<()> {
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
Creating virtual environment at: .venv
|
Creating virtual environment at: .venv
|
||||||
warning: A directory already exists at `.venv`. In the future, uv will require `--clear` to replace it
|
|
||||||
Activate with: source .venv/[BIN]/activate
|
Activate with: source .venv/[BIN]/activate
|
||||||
"
|
"
|
||||||
);
|
);
|
||||||
|
|
@ -994,15 +1013,17 @@ fn non_empty_dir_exists_allow_existing() -> Result<()> {
|
||||||
.arg(context.venv.as_os_str())
|
.arg(context.venv.as_os_str())
|
||||||
.arg("--python")
|
.arg("--python")
|
||||||
.arg("3.12"), @r"
|
.arg("3.12"), @r"
|
||||||
success: true
|
success: false
|
||||||
exit_code: 0
|
exit_code: 2
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
Creating virtual environment at: .venv
|
Creating virtual environment at: .venv
|
||||||
warning: A directory already exists at `.venv`. In the future, uv will require `--clear` to replace it
|
error: Failed to create virtual environment
|
||||||
Activate with: source .venv/[BIN]/activate
|
Caused by: A directory already exists at: .venv
|
||||||
|
|
||||||
|
hint: Use the `--clear` flag or set `UV_VENV_CLEAR=1` to replace the existing directory
|
||||||
"
|
"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -1578,17 +1599,33 @@ fn create_venv_current_working_directory() {
|
||||||
let context = TestContext::new_with_versions(&["3.12"]);
|
let context = TestContext::new_with_versions(&["3.12"]);
|
||||||
|
|
||||||
uv_snapshot!(context.filters(), context.venv()
|
uv_snapshot!(context.filters(), context.venv()
|
||||||
.arg(".")
|
.arg(context.venv.as_os_str())
|
||||||
.arg("--python")
|
.arg("--python")
|
||||||
.arg("3.12"), @r"
|
.arg("3.12"), @r"
|
||||||
success: true
|
success: true
|
||||||
exit_code: 0
|
exit_code: 0
|
||||||
----- stdout -----
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
|
Creating virtual environment at: .venv
|
||||||
|
Activate with: source .venv/[BIN]/activate
|
||||||
|
"
|
||||||
|
);
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.venv()
|
||||||
|
.arg(".")
|
||||||
|
.arg("--clear")
|
||||||
|
.arg("--python")
|
||||||
|
.arg("3.12")
|
||||||
|
.current_dir(&context.venv), @r"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
----- stderr -----
|
----- stderr -----
|
||||||
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
Creating virtual environment at: .
|
Creating virtual environment at: .
|
||||||
warning: A directory already exists at `.`. In the future, uv will require `--clear` to replace it
|
|
||||||
Activate with: source bin/activate
|
Activate with: source bin/activate
|
||||||
"
|
"
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue