mirror of
https://github.com/astral-sh/uv.git
synced 2025-09-30 14:01:13 +00:00
Use canonical URL to key redirect map (#2764)
## Summary This fixes a potential bug that revealed itself in https://github.com/astral-sh/uv/pull/2761. We don't run into this now because we always use "allowed URLs", stores the "last" compatible URL in the map. But the use of the "raw" URL (rather than the "canonical" URL) means that other writers have to follow that same assumption and iterate over dependencies in-order.
This commit is contained in:
parent
d2bbc07b76
commit
999d653404
3 changed files with 16 additions and 7 deletions
|
@ -2,6 +2,7 @@ use std::borrow::Cow;
|
||||||
use std::hash::BuildHasherDefault;
|
use std::hash::BuildHasherDefault;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use cache_key::CanonicalUrl;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use owo_colors::OwoColorize;
|
use owo_colors::OwoColorize;
|
||||||
|
@ -68,7 +69,7 @@ impl ResolutionGraph {
|
||||||
pins: &FilePins,
|
pins: &FilePins,
|
||||||
packages: &OnceMap<PackageName, VersionsResponse>,
|
packages: &OnceMap<PackageName, VersionsResponse>,
|
||||||
distributions: &OnceMap<PackageId, Metadata23>,
|
distributions: &OnceMap<PackageId, Metadata23>,
|
||||||
redirects: &DashMap<Url, Url>,
|
redirects: &DashMap<CanonicalUrl, Url>,
|
||||||
state: &State<UvDependencyProvider>,
|
state: &State<UvDependencyProvider>,
|
||||||
preferences: &Preferences,
|
preferences: &Preferences,
|
||||||
editables: Editables,
|
editables: Editables,
|
||||||
|
@ -119,7 +120,7 @@ impl ResolutionGraph {
|
||||||
let pinned_package = if let Some((editable, _)) = editables.get(package_name) {
|
let pinned_package = if let Some((editable, _)) = editables.get(package_name) {
|
||||||
Dist::from_editable(package_name.clone(), editable.clone())?
|
Dist::from_editable(package_name.clone(), editable.clone())?
|
||||||
} else {
|
} else {
|
||||||
let url = redirects.get(url).map_or_else(
|
let url = redirects.get(&CanonicalUrl::new(url)).map_or_else(
|
||||||
|| url.clone(),
|
|| url.clone(),
|
||||||
|precise| apply_redirect(url, precise.value()),
|
|precise| apply_redirect(url, precise.value()),
|
||||||
);
|
);
|
||||||
|
@ -224,7 +225,7 @@ impl ResolutionGraph {
|
||||||
.or_insert_with(Vec::new)
|
.or_insert_with(Vec::new)
|
||||||
.push(extra.clone());
|
.push(extra.clone());
|
||||||
} else {
|
} else {
|
||||||
let url = redirects.get(url).map_or_else(
|
let url = redirects.get(&CanonicalUrl::new(url)).map_or_else(
|
||||||
|| url.clone(),
|
|| url.clone(),
|
||||||
|precise| apply_redirect(url, precise.value()),
|
|precise| apply_redirect(url, precise.value()),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use cache_key::CanonicalUrl;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
@ -21,5 +22,5 @@ pub struct InMemoryIndex {
|
||||||
/// A map from source URL to precise URL. For example, the source URL
|
/// A map from source URL to precise URL. For example, the source URL
|
||||||
/// `git+https://github.com/pallets/flask.git` could be redirected to
|
/// `git+https://github.com/pallets/flask.git` could be redirected to
|
||||||
/// `git+https://github.com/pallets/flask.git@c2f65dd1cfff0672b902fd5b30815f0b4137214c`.
|
/// `git+https://github.com/pallets/flask.git@c2f65dd1cfff0672b902fd5b30815f0b4137214c`.
|
||||||
pub(crate) redirects: DashMap<Url, Url>,
|
pub(crate) redirects: DashMap<CanonicalUrl, Url>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ use std::ops::Deref;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use cache_key::CanonicalUrl;
|
||||||
use dashmap::{DashMap, DashSet};
|
use dashmap::{DashMap, DashSet};
|
||||||
use futures::{FutureExt, StreamExt};
|
use futures::{FutureExt, StreamExt};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
@ -949,13 +950,19 @@ impl<
|
||||||
if let Some(precise) = precise {
|
if let Some(precise) = precise {
|
||||||
match distribution {
|
match distribution {
|
||||||
SourceDist::DirectUrl(sdist) => {
|
SourceDist::DirectUrl(sdist) => {
|
||||||
self.index.redirects.insert(sdist.url.to_url(), precise);
|
self.index
|
||||||
|
.redirects
|
||||||
|
.insert(CanonicalUrl::new(&sdist.url), precise);
|
||||||
}
|
}
|
||||||
SourceDist::Git(sdist) => {
|
SourceDist::Git(sdist) => {
|
||||||
self.index.redirects.insert(sdist.url.to_url(), precise);
|
self.index
|
||||||
|
.redirects
|
||||||
|
.insert(CanonicalUrl::new(&sdist.url), precise);
|
||||||
}
|
}
|
||||||
SourceDist::Path(sdist) => {
|
SourceDist::Path(sdist) => {
|
||||||
self.index.redirects.insert(sdist.url.to_url(), precise);
|
self.index
|
||||||
|
.redirects
|
||||||
|
.insert(CanonicalUrl::new(&sdist.url), precise);
|
||||||
}
|
}
|
||||||
SourceDist::Registry(_) => {}
|
SourceDist::Registry(_) => {}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue