Avoid inferring package name for GitHub Archives (#4928)

## Summary

Closes https://github.com/astral-sh/uv/issues/4917.
This commit is contained in:
Charlie Marsh 2024-07-09 10:30:43 -07:00 committed by GitHub
parent 0bf562f197
commit 2e307d9081
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -7,6 +7,7 @@ use configparser::ini::Ini;
use futures::{stream::FuturesOrdered, TryStreamExt}; use futures::{stream::FuturesOrdered, TryStreamExt};
use serde::Deserialize; use serde::Deserialize;
use tracing::debug; use tracing::debug;
use url::Host;
use distribution_filename::{SourceDistFilename, WheelFilename}; use distribution_filename::{SourceDistFilename, WheelFilename};
use distribution_types::{ use distribution_types::{
@ -128,13 +129,32 @@ impl<'a, Context: BuildContext> NamedRequirementsResolver<'a, Context> {
.ok() .ok()
.and_then(|filename| SourceDistFilename::parsed_normalized_filename(&filename).ok()) .and_then(|filename| SourceDistFilename::parsed_normalized_filename(&filename).ok())
{ {
return Ok(pep508_rs::Requirement { // But ignore GitHub archives, like:
name: filename.name, // https://github.com/python/mypy/archive/refs/heads/release-1.11.zip
extras: requirement.extras, //
version_or_url: Some(VersionOrUrl::Url(requirement.url)), // These have auto-generated filenames that will almost never match the package name.
marker: requirement.marker, if requirement.url.verbatim.host() == Some(Host::Domain("github.com"))
origin: requirement.origin, && requirement
}); .url
.verbatim
.path_segments()
.is_some_and(|mut path_segments| {
path_segments.any(|segment| segment == "archive")
})
{
debug!(
"Rejecting inferred name from GitHub archive: {}",
requirement.url.verbatim
);
} else {
return Ok(pep508_rs::Requirement {
name: filename.name,
extras: requirement.extras,
version_or_url: Some(VersionOrUrl::Url(requirement.url)),
marker: requirement.marker,
origin: requirement.origin,
});
}
} }
let source = match &requirement.url.parsed_url { let source = match &requirement.url.parsed_url {