mirror of https://github.com/astral-sh/uv
Use copy-on-write when normalizing paths (#9710)
This commit is contained in:
parent
f8e6a94893
commit
7df16af764
|
|
@ -317,10 +317,10 @@ impl LoweredRequirement {
|
|||
let source = if let Some(git_member) = &git_member {
|
||||
// If the workspace comes from a Git dependency, all workspace
|
||||
// members need to be Git dependencies, too.
|
||||
let subdirectory = uv_fs::normalize_path(
|
||||
&uv_fs::relative_to(member.root(), git_member.fetch_root)
|
||||
.expect("Workspace member must be relative"),
|
||||
);
|
||||
let subdirectory =
|
||||
uv_fs::relative_to(member.root(), git_member.fetch_root)
|
||||
.expect("Workspace member must be relative");
|
||||
let subdirectory = uv_fs::normalize_path_buf(subdirectory);
|
||||
RequirementSource::Git {
|
||||
repository: git_member.git_source.git.repository().clone(),
|
||||
reference: git_member.git_source.git.reference().clone(),
|
||||
|
|
@ -711,10 +711,9 @@ fn path_source(
|
|||
};
|
||||
if is_dir {
|
||||
if let Some(git_member) = git_member {
|
||||
let subdirectory = uv_fs::normalize_path(
|
||||
&uv_fs::relative_to(install_path, git_member.fetch_root)
|
||||
.expect("Workspace member must be relative"),
|
||||
);
|
||||
let subdirectory = uv_fs::relative_to(install_path, git_member.fetch_root)
|
||||
.expect("Workspace member must be relative");
|
||||
let subdirectory = uv_fs::normalize_path_buf(subdirectory);
|
||||
return Ok(RequirementSource::Git {
|
||||
repository: git_member.git_source.git.repository().clone(),
|
||||
reference: git_member.git_source.git.reference().clone(),
|
||||
|
|
|
|||
|
|
@ -199,7 +199,33 @@ pub fn normalize_absolute_path(path: &Path) -> Result<PathBuf, std::io::Error> {
|
|||
Ok(ret)
|
||||
}
|
||||
|
||||
/// Normalize a path, removing things like `.` and `..`.
|
||||
/// Normalize a [`Path`], removing things like `.` and `..`.
|
||||
pub fn normalize_path(path: &Path) -> Cow<Path> {
|
||||
// Fast path: if the path is already normalized, return it as-is.
|
||||
if path.components().all(|component| match component {
|
||||
Component::Prefix(_) | Component::RootDir | Component::Normal(_) => true,
|
||||
Component::ParentDir | Component::CurDir => false,
|
||||
}) {
|
||||
Cow::Borrowed(path)
|
||||
} else {
|
||||
Cow::Owned(normalized(path))
|
||||
}
|
||||
}
|
||||
|
||||
/// Normalize a [`PathBuf`], removing things like `.` and `..`.
|
||||
pub fn normalize_path_buf(path: PathBuf) -> PathBuf {
|
||||
// Fast path: if the path is already normalized, return it as-is.
|
||||
if path.components().all(|component| match component {
|
||||
Component::Prefix(_) | Component::RootDir | Component::Normal(_) => true,
|
||||
Component::ParentDir | Component::CurDir => false,
|
||||
}) {
|
||||
path
|
||||
} else {
|
||||
normalized(&path)
|
||||
}
|
||||
}
|
||||
|
||||
/// Normalize a [`Path`].
|
||||
///
|
||||
/// Unlike [`normalize_absolute_path`], this works with relative paths and does never error.
|
||||
///
|
||||
|
|
@ -216,8 +242,7 @@ pub fn normalize_absolute_path(path: &Path) -> Result<PathBuf, std::io::Error> {
|
|||
/// Out: `workspace-git-path-dep-test/packages/d`
|
||||
///
|
||||
/// In: `./a/../../b`
|
||||
/// Out: `../b`
|
||||
pub fn normalize_path(path: &Path) -> PathBuf {
|
||||
fn normalized(path: &Path) -> PathBuf {
|
||||
let mut normalized = PathBuf::new();
|
||||
for component in path.components() {
|
||||
match component {
|
||||
|
|
|
|||
|
|
@ -3749,7 +3749,8 @@ fn normalize_requirement(
|
|||
ext,
|
||||
url: _,
|
||||
} => {
|
||||
let install_path = uv_fs::normalize_path(&workspace.install_path().join(&install_path));
|
||||
let install_path =
|
||||
uv_fs::normalize_path_buf(workspace.install_path().join(&install_path));
|
||||
let url = VerbatimUrl::from_absolute_path(&install_path)
|
||||
.map_err(LockErrorKind::RequirementVerbatimUrl)?;
|
||||
|
||||
|
|
@ -3772,7 +3773,8 @@ fn normalize_requirement(
|
|||
r#virtual,
|
||||
url: _,
|
||||
} => {
|
||||
let install_path = uv_fs::normalize_path(&workspace.install_path().join(&install_path));
|
||||
let install_path =
|
||||
uv_fs::normalize_path_buf(workspace.install_path().join(&install_path));
|
||||
let url = VerbatimUrl::from_absolute_path(&install_path)
|
||||
.map_err(LockErrorKind::RequirementVerbatimUrl)?;
|
||||
|
||||
|
|
|
|||
|
|
@ -65,8 +65,7 @@ async fn run(mut cli: Cli) -> Result<ExitStatus> {
|
|||
.as_deref()
|
||||
.map(std::path::absolute)
|
||||
.transpose()?
|
||||
.as_deref()
|
||||
.map(uv_fs::normalize_path)
|
||||
.map(uv_fs::normalize_path_buf)
|
||||
.map(Cow::Owned)
|
||||
.unwrap_or_else(|| Cow::Borrowed(&*CWD));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue