Improve non-git error message (#3403)

The boxing changes are due to clippy
This commit is contained in:
konsti 2024-05-06 13:28:05 +02:00 committed by GitHub
parent d0c3146ef6
commit 098944fc7d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 36 additions and 18 deletions

View file

@ -8,8 +8,12 @@ use uv_git::{GitSha, GitUrl};
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum ParsedUrlError { pub enum ParsedUrlError {
#[error("Unsupported URL prefix `{prefix}` in URL: `{url}`")] #[error("Unsupported URL prefix `{prefix}` in URL: `{url}` ({message})")]
UnsupportedUrlPrefix { prefix: String, url: Url }, UnsupportedUrlPrefix {
prefix: String,
url: Url,
message: &'static str,
},
#[error("Invalid path in file URL: `{0}`")] #[error("Invalid path in file URL: `{0}`")]
InvalidFileUrl(Url), InvalidFileUrl(Url),
#[error("Failed to parse Git reference from URL: `{0}`")] #[error("Failed to parse Git reference from URL: `{0}`")]
@ -123,9 +127,25 @@ impl TryFrom<Url> for ParsedUrl {
if let Some((prefix, ..)) = url.scheme().split_once('+') { if let Some((prefix, ..)) = url.scheme().split_once('+') {
match prefix { match prefix {
"git" => Ok(Self::Git(ParsedGitUrl::try_from(url)?)), "git" => Ok(Self::Git(ParsedGitUrl::try_from(url)?)),
"bzr" => Err(ParsedUrlError::UnsupportedUrlPrefix {
prefix: prefix.to_string(),
url: url.clone(),
message: "Bazaar is not supported",
}),
"hg" => Err(ParsedUrlError::UnsupportedUrlPrefix {
prefix: prefix.to_string(),
url: url.clone(),
message: "Mercurial is not supported",
}),
"svn" => Err(ParsedUrlError::UnsupportedUrlPrefix {
prefix: prefix.to_string(),
url: url.clone(),
message: "Subversion is not supported",
}),
_ => Err(ParsedUrlError::UnsupportedUrlPrefix { _ => Err(ParsedUrlError::UnsupportedUrlPrefix {
prefix: prefix.to_string(), prefix: prefix.to_string(),
url: url.clone(), url: url.clone(),
message: "Unknown scheme",
}), }),
} }
} else if url.scheme().eq_ignore_ascii_case("file") { } else if url.scheme().eq_ignore_ascii_case("file") {

View file

@ -41,7 +41,7 @@ impl Requirement {
} }
/// Convert a [`pep508_rs::Requirement`] to a [`Requirement`]. /// Convert a [`pep508_rs::Requirement`] to a [`Requirement`].
pub fn from_pep508(requirement: pep508_rs::Requirement) -> Result<Self, ParsedUrlError> { pub fn from_pep508(requirement: pep508_rs::Requirement) -> Result<Self, Box<ParsedUrlError>> {
let source = match requirement.version_or_url { let source = match requirement.version_or_url {
None => RequirementSource::Registry { None => RequirementSource::Registry {
specifier: VersionSpecifiers::empty(), specifier: VersionSpecifiers::empty(),

View file

@ -59,7 +59,7 @@ impl UnresolvedRequirement {
} }
/// Return the version specifier or URL for the requirement. /// Return the version specifier or URL for the requirement.
pub fn source(&self) -> Result<Cow<'_, RequirementSource>, ParsedUrlError> { pub fn source(&self) -> Result<Cow<'_, RequirementSource>, Box<ParsedUrlError>> {
// TODO(konsti): This is a bad place to raise errors, we should have parsed the url earlier. // TODO(konsti): This is a bad place to raise errors, we should have parsed the url earlier.
match self { match self {
Self::Named(requirement) => Ok(Cow::Borrowed(&requirement.source)), Self::Named(requirement) => Ok(Cow::Borrowed(&requirement.source)),

View file

@ -311,7 +311,7 @@ pub struct RequirementEntry {
// `UnresolvedRequirementSpecification` is defined in `distribution-types` and `requirements-txt` // `UnresolvedRequirementSpecification` is defined in `distribution-types` and `requirements-txt`
// depends on `distribution-types`. // depends on `distribution-types`.
impl TryFrom<RequirementEntry> for UnresolvedRequirementSpecification { impl TryFrom<RequirementEntry> for UnresolvedRequirementSpecification {
type Error = ParsedUrlError; type Error = Box<ParsedUrlError>;
fn try_from(value: RequirementEntry) -> Result<Self, Self::Error> { fn try_from(value: RequirementEntry) -> Result<Self, Self::Error> {
Ok(Self { Ok(Self {

View file

@ -105,7 +105,7 @@ pub enum Error {
#[error("Failed to build PATH for build script")] #[error("Failed to build PATH for build script")]
BuildScriptPath(#[source] env::JoinPathsError), BuildScriptPath(#[source] env::JoinPathsError),
#[error("Failed to parse requirements from build backend")] #[error("Failed to parse requirements from build backend")]
DirectUrl(#[source] ParsedUrlError), DirectUrl(#[source] Box<ParsedUrlError>),
} }
#[derive(Debug)] #[derive(Debug)]

View file

@ -26,7 +26,7 @@ pub enum LookaheadError {
#[error(transparent)] #[error(transparent)]
UnsupportedUrl(#[from] distribution_types::Error), UnsupportedUrl(#[from] distribution_types::Error),
#[error(transparent)] #[error(transparent)]
InvalidRequirement(#[from] distribution_types::ParsedUrlError), InvalidRequirement(#[from] Box<distribution_types::ParsedUrlError>),
} }
/// A resolver for resolving lookahead requirements from direct URLs. /// A resolver for resolving lookahead requirements from direct URLs.

View file

@ -407,7 +407,7 @@ pub(crate) fn lower_requirement(
return if requirement.version_or_url.is_none() && &requirement.name != project_name { return if requirement.version_or_url.is_none() && &requirement.name != project_name {
Err(LoweringError::UnconstrainedVersion) Err(LoweringError::UnconstrainedVersion)
} else { } else {
Ok(Requirement::from_pep508(requirement).map_err(Box::new)?) Ok(Requirement::from_pep508(requirement)?)
}; };
}; };

View file

@ -33,7 +33,7 @@ impl Preference {
Ok(Self { Ok(Self {
requirement: match entry.requirement { requirement: match entry.requirement {
RequirementsTxtRequirement::Named(requirement) => { RequirementsTxtRequirement::Named(requirement) => {
Requirement::from_pep508(requirement).map_err(Box::new)? Requirement::from_pep508(requirement)?
} }
RequirementsTxtRequirement::Unnamed(requirement) => { RequirementsTxtRequirement::Unnamed(requirement) => {
return Err(PreferenceError::Bare(requirement)); return Err(PreferenceError::Bare(requirement));

View file

@ -892,8 +892,7 @@ impl<
.iter() .iter()
.cloned() .cloned()
.map(Requirement::from_pep508) .map(Requirement::from_pep508)
.collect::<Result<_, _>>() .collect::<Result<_, _>>()?;
.map_err(Box::new)?;
let constraints = PubGrubDependencies::from_requirements( let constraints = PubGrubDependencies::from_requirements(
&requirements, &requirements,
&self.constraints, &self.constraints,
@ -1008,8 +1007,7 @@ impl<
.iter() .iter()
.cloned() .cloned()
.map(Requirement::from_pep508) .map(Requirement::from_pep508)
.collect::<Result<_, _>>() .collect::<Result<_, _>>()?;
.map_err(Box::new)?;
let constraints = PubGrubDependencies::from_requirements( let constraints = PubGrubDependencies::from_requirements(
&requirements, &requirements,
&self.constraints, &self.constraints,

View file

@ -385,10 +385,10 @@ pub(crate) async fn pip_compile(
.iter() .iter()
.cloned() .cloned()
.map(Requirement::from_pep508) .map(Requirement::from_pep508)
.collect::<Result<_, ParsedUrlError>>()?, .collect::<Result<_, _>>()?,
optional_dependencies: IndexMap::default(), optional_dependencies: IndexMap::default(),
}; };
Ok::<_, ParsedUrlError>(( Ok::<_, Box<ParsedUrlError>>((
built_editable.editable, built_editable.editable,
built_editable.metadata, built_editable.metadata,
requirements, requirements,

View file

@ -694,7 +694,7 @@ async fn resolve(
.cloned() .cloned()
.map(Requirement::from_pep508) .map(Requirement::from_pep508)
.collect::<Result<_, _>>()?; .collect::<Result<_, _>>()?;
Ok::<_, ParsedUrlError>(( Ok::<_, Box<ParsedUrlError>>((
built_editable.editable.clone(), built_editable.editable.clone(),
built_editable.metadata.clone(), built_editable.metadata.clone(),
Requirements { Requirements {
@ -704,7 +704,7 @@ async fn resolve(
)) ))
}) })
.collect::<Result<_, _>>() .collect::<Result<_, _>>()
.map_err(|err| Error::ParsedUrl(Box::new(err)))?; .map_err(Error::ParsedUrl)?;
// Determine any lookahead requirements. // Determine any lookahead requirements.
let lookaheads = match options.dependency_mode { let lookaheads = match options.dependency_mode {

View file

@ -5224,7 +5224,7 @@ fn unsupported_scheme() -> Result<()> {
----- stdout ----- ----- stdout -----
----- stderr ----- ----- stderr -----
error: Unsupported URL prefix `bzr` in URL: `bzr+https://example.com/anyio` error: Unsupported URL prefix `bzr` in URL: `bzr+https://example.com/anyio` (Bazaar is not supported)
"### "###
); );