mirror of https://github.com/astral-sh/uv
Avoid erroring when creating `venv` in current working directory (#15537)
## Summary A strange use-case, but the current behavior is definitely a bug. Part of https://github.com/astral-sh/uv/issues/15474.
This commit is contained in:
parent
2ca8f6d250
commit
0c674619b2
|
|
@ -77,6 +77,18 @@ pub(crate) fn create(
|
||||||
base_python.display()
|
base_python.display()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Extract the prompt and compute the absolute path prior to validating the location; otherwise,
|
||||||
|
// we risk deleting (and recreating) the current working directory, which would cause the `CWD`
|
||||||
|
// queries to fail.
|
||||||
|
let prompt = match prompt {
|
||||||
|
Prompt::CurrentDirectoryName => CWD
|
||||||
|
.file_name()
|
||||||
|
.map(|name| name.to_string_lossy().to_string()),
|
||||||
|
Prompt::Static(value) => Some(value),
|
||||||
|
Prompt::None => None,
|
||||||
|
};
|
||||||
|
let absolute = std::path::absolute(location)?;
|
||||||
|
|
||||||
// Validate the existing location.
|
// Validate the existing location.
|
||||||
match location.metadata() {
|
match location.metadata() {
|
||||||
Ok(metadata) if metadata.is_file() => {
|
Ok(metadata) if metadata.is_file() => {
|
||||||
|
|
@ -172,7 +184,8 @@ pub(crate) fn create(
|
||||||
Err(err) => return Err(Error::Io(err)),
|
Err(err) => return Err(Error::Io(err)),
|
||||||
}
|
}
|
||||||
|
|
||||||
let location = std::path::absolute(location)?;
|
// Use the absolute path for all further operations.
|
||||||
|
let location = absolute;
|
||||||
|
|
||||||
let bin_name = if cfg!(unix) {
|
let bin_name = if cfg!(unix) {
|
||||||
"bin"
|
"bin"
|
||||||
|
|
@ -182,13 +195,6 @@ pub(crate) fn create(
|
||||||
unimplemented!("Only Windows and Unix are supported")
|
unimplemented!("Only Windows and Unix are supported")
|
||||||
};
|
};
|
||||||
let scripts = location.join(&interpreter.virtualenv().scripts);
|
let scripts = location.join(&interpreter.virtualenv().scripts);
|
||||||
let prompt = match prompt {
|
|
||||||
Prompt::CurrentDirectoryName => CWD
|
|
||||||
.file_name()
|
|
||||||
.map(|name| name.to_string_lossy().to_string()),
|
|
||||||
Prompt::Static(value) => Some(value),
|
|
||||||
Prompt::None => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Add the CACHEDIR.TAG.
|
// Add the CACHEDIR.TAG.
|
||||||
cachedir::ensure_tag(&location)?;
|
cachedir::ensure_tag(&location)?;
|
||||||
|
|
|
||||||
|
|
@ -1572,3 +1572,26 @@ fn create_venv_nested_symlink_preservation() -> Result<()> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn create_venv_current_working_directory() {
|
||||||
|
let context = TestContext::new_with_versions(&["3.12"]);
|
||||||
|
|
||||||
|
uv_snapshot!(context.filters(), context.venv()
|
||||||
|
.arg(".")
|
||||||
|
.arg("--python")
|
||||||
|
.arg("3.12"), @r"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
||||||
|
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
|
||||||
|
"
|
||||||
|
);
|
||||||
|
|
||||||
|
context.root.assert(predicates::path::is_dir());
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue