Use portable path instead of string for subdirectory (#10069)
Some checks are pending
CI / check system | python on macos x86_64 (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / lint (push) Waiting to run
CI / cargo clippy | ubuntu (push) Blocked by required conditions
CI / cargo clippy | windows (push) Blocked by required conditions
CI / cargo dev generate-all (push) Blocked by required conditions
CI / cargo shear (push) Waiting to run
CI / cargo test | ubuntu (push) Blocked by required conditions
CI / cargo test | macos (push) Blocked by required conditions
CI / cargo test | windows (push) Blocked by required conditions
CI / check windows trampoline | aarch64 (push) Blocked by required conditions
CI / check windows trampoline | i686 (push) Blocked by required conditions
CI / check windows trampoline | x86_64 (push) Blocked by required conditions
CI / test windows trampoline | i686 (push) Blocked by required conditions
CI / test windows trampoline | x86_64 (push) Blocked by required conditions
CI / typos (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / build binary | linux (push) Blocked by required conditions
CI / build binary | macos aarch64 (push) Blocked by required conditions
CI / build binary | macos x86_64 (push) Blocked by required conditions
CI / build binary | windows (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / build binary | freebsd (push) Blocked by required conditions
CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
CI / ecosystem test | pallets/flask (push) Blocked by required conditions
CI / integration test | conda on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on linux (push) Blocked by required conditions
CI / integration test | free-threaded on windows (push) Blocked by required conditions
CI / integration test | pypy on ubuntu (push) Blocked by required conditions
CI / integration test | pypy on windows (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | determine publish changes (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
CI / check cache | ubuntu (push) Blocked by required conditions
CI / check cache | macos aarch64 (push) Blocked by required conditions
CI / check system | python on debian (push) Blocked by required conditions
CI / check system | python on fedora (push) Blocked by required conditions
CI / check system | python on ubuntu (push) Blocked by required conditions
CI / check system | python on opensuse (push) Blocked by required conditions
CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
CI / check system | python on rocky linux 8 (push) Blocked by required conditions
CI / check system | python on rocky linux 9 (push) Blocked by required conditions
CI / check system | pypy on ubuntu (push) Blocked by required conditions
CI / check system | pyston (push) Blocked by required conditions
CI / check system | alpine (push) Blocked by required conditions
CI / check system | python on macos aarch64 (push) Blocked by required conditions
CI / check system | python3.10 on windows (push) Blocked by required conditions
CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
CI / check system | python3.13 on windows (push) Blocked by required conditions
CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
CI / check system | python3.9 via pyenv (push) Blocked by required conditions
CI / check system | python3.13 (push) Blocked by required conditions
CI / check system | conda3.11 on linux (push) Blocked by required conditions
CI / check system | conda3.8 on linux (push) Blocked by required conditions
CI / check system | conda3.11 on macos (push) Blocked by required conditions
CI / check system | conda3.8 on macos (push) Blocked by required conditions
CI / check system | conda3.11 on windows (push) Blocked by required conditions
CI / check system | conda3.8 on windows (push) Blocked by required conditions
CI / check system | amazonlinux (push) Blocked by required conditions
CI / check system | embedded python3.10 on windows (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions

## Summary

A few places where there are extra conversions to and from string that
seem unnecessary; a few places where we're using `PathBuf` instead of
`PortablePathBuf`.
This commit is contained in:
Charlie Marsh 2024-12-20 19:28:36 -05:00 committed by GitHub
parent ddc290feb4
commit 9128fe1866
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 52 additions and 27 deletions

View file

@ -392,6 +392,16 @@ impl std::fmt::Display for PortablePathBuf {
}
}
impl From<&str> for PortablePathBuf {
fn from(path: &str) -> Self {
if path == "." {
Self(PathBuf::new())
} else {
Self(PathBuf::from(path))
}
}
}
impl From<PortablePathBuf> for PathBuf {
fn from(portable: PortablePathBuf) -> Self {
portable.0

View file

@ -1703,7 +1703,7 @@ impl Package {
self.wheels[best_wheel_index].filename.clone();
let url = Url::from(ParsedArchiveUrl {
url: url.to_url(),
subdirectory: direct.subdirectory.as_ref().map(PathBuf::from),
subdirectory: direct.subdirectory.clone(),
ext: DistExtension::Wheel,
});
let direct_dist = DirectUrlBuiltDist {
@ -1848,14 +1848,14 @@ impl Package {
// Reconstruct the PEP 508-compatible URL from the `GitSource`.
let url = Url::from(ParsedGitUrl {
url: git_url.clone(),
subdirectory: git.subdirectory.as_ref().map(PathBuf::from),
subdirectory: git.subdirectory.clone(),
});
let git_dist = GitSourceDist {
name: self.id.name.clone(),
url: VerbatimUrl::from_url(url),
git: Box::new(git_url),
subdirectory: git.subdirectory.as_ref().map(PathBuf::from),
subdirectory: git.subdirectory.clone(),
};
uv_distribution_types::SourceDist::Git(git_dist)
}
@ -2475,11 +2475,7 @@ impl Source {
Source::Direct(
normalize_url(direct_dist.url.to_url()),
DirectSource {
subdirectory: direct_dist
.subdirectory
.as_deref()
.and_then(Path::to_str)
.map(ToString::to_string),
subdirectory: direct_dist.subdirectory.clone(),
},
)
}
@ -2541,11 +2537,7 @@ impl Source {
precise: git_dist.git.precise().unwrap_or_else(|| {
panic!("Git distribution is missing a precise hash: {git_dist}")
}),
subdirectory: git_dist
.subdirectory
.as_deref()
.and_then(Path::to_str)
.map(ToString::to_string),
subdirectory: git_dist.subdirectory.clone(),
},
)
}
@ -2603,7 +2595,10 @@ impl Source {
Source::Direct(ref url, DirectSource { ref subdirectory }) => {
source_table.insert("url", Value::from(url.as_ref()));
if let Some(ref subdirectory) = *subdirectory {
source_table.insert("subdirectory", Value::from(subdirectory));
source_table.insert(
"subdirectory",
Value::from(PortablePath::from(subdirectory).to_string()),
);
}
}
Source::Path(ref path) => {
@ -2683,15 +2678,14 @@ impl Source {
#[serde(untagged)]
enum SourceWire {
Registry {
registry: RegistrySource,
registry: RegistrySourceWire,
},
Git {
git: String,
},
Direct {
url: UrlString,
#[serde(default)]
subdirectory: Option<String>,
subdirectory: Option<PortablePathBuf>,
},
Path {
path: PortablePathBuf,
@ -2715,7 +2709,7 @@ impl TryFrom<SourceWire> for Source {
use self::SourceWire::*;
match wire {
Registry { registry } => Ok(Source::Registry(registry)),
Registry { registry } => Ok(Source::Registry(registry.into())),
Git { git } => {
let url = Url::parse(&git)
.map_err(|err| SourceParseError::InvalidUrl {
@ -2737,7 +2731,12 @@ impl TryFrom<SourceWire> for Source {
Ok(Source::Git(UrlString::from(url), git_source))
}
Direct { url, subdirectory } => Ok(Source::Direct(url, DirectSource { subdirectory })),
Direct { url, subdirectory } => Ok(Source::Direct(
url,
DirectSource {
subdirectory: subdirectory.map(PathBuf::from),
},
)),
Path { path } => Ok(Source::Path(path.into())),
Directory { directory } => Ok(Source::Directory(directory.into())),
Editable { editable } => Ok(Source::Editable(editable.into())),
@ -2764,7 +2763,15 @@ impl std::fmt::Display for RegistrySource {
}
}
impl<'de> serde::de::Deserialize<'de> for RegistrySource {
#[derive(Clone, Debug)]
enum RegistrySourceWire {
/// Ex) `https://pypi.org/simple`
Url(UrlString),
/// Ex) `../path/to/local/index`
Path(PortablePathBuf),
}
impl<'de> serde::de::Deserialize<'de> for RegistrySourceWire {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::de::Deserializer<'de>,
@ -2772,7 +2779,7 @@ impl<'de> serde::de::Deserialize<'de> for RegistrySource {
struct Visitor;
impl serde::de::Visitor<'_> for Visitor {
type Value = RegistrySource;
type Value = RegistrySourceWire;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a valid URL or a file path")
@ -2787,14 +2794,14 @@ impl<'de> serde::de::Deserialize<'de> for RegistrySource {
serde::Deserialize::deserialize(serde::de::value::StrDeserializer::new(
value,
))
.map(RegistrySource::Url)?,
.map(RegistrySourceWire::Url)?,
)
} else {
Ok(
serde::Deserialize::deserialize(serde::de::value::StrDeserializer::new(
value,
))
.map(RegistrySource::Path)?,
.map(RegistrySourceWire::Path)?,
)
}
}
@ -2804,9 +2811,18 @@ impl<'de> serde::de::Deserialize<'de> for RegistrySource {
}
}
impl From<RegistrySourceWire> for RegistrySource {
fn from(wire: RegistrySourceWire) -> Self {
match wire {
RegistrySourceWire::Url(url) => Self::Url(url),
RegistrySourceWire::Path(path) => Self::Path(path.into()),
}
}
}
#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, serde::Deserialize)]
struct DirectSource {
subdirectory: Option<String>,
subdirectory: Option<PathBuf>,
}
/// NOTE: Care should be taken when adding variants to this enum. Namely, new
@ -2816,7 +2832,7 @@ struct DirectSource {
#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
struct GitSource {
precise: GitSha,
subdirectory: Option<String>,
subdirectory: Option<PathBuf>,
kind: GitSourceKind,
}
@ -2838,7 +2854,7 @@ impl GitSource {
"tag" => kind = GitSourceKind::Tag(val.into_owned()),
"branch" => kind = GitSourceKind::Branch(val.into_owned()),
"rev" => kind = GitSourceKind::Rev(val.into_owned()),
"subdirectory" => subdirectory = Some(val.into_owned()),
"subdirectory" => subdirectory = Some(PortablePathBuf::from(val.as_ref()).into()),
_ => continue,
};
}

View file

@ -1,5 +1,4 @@
use std::borrow::Cow;
use std::env;
use std::ffi::OsString;
use std::fmt::Write;
use std::io::stdout;