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:
Charlie Marsh 2024-04-01 17:57:13 -04:00 committed by GitHub
parent d2bbc07b76
commit 999d653404
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 16 additions and 7 deletions

View file

@ -6,6 +6,7 @@ use std::ops::Deref;
use std::sync::Arc;
use anyhow::Result;
use cache_key::CanonicalUrl;
use dashmap::{DashMap, DashSet};
use futures::{FutureExt, StreamExt};
use itertools::Itertools;
@ -949,13 +950,19 @@ impl<
if let Some(precise) = precise {
match distribution {
SourceDist::DirectUrl(sdist) => {
self.index.redirects.insert(sdist.url.to_url(), precise);
self.index
.redirects
.insert(CanonicalUrl::new(&sdist.url), precise);
}
SourceDist::Git(sdist) => {
self.index.redirects.insert(sdist.url.to_url(), precise);
self.index
.redirects
.insert(CanonicalUrl::new(&sdist.url), precise);
}
SourceDist::Path(sdist) => {
self.index.redirects.insert(sdist.url.to_url(), precise);
self.index
.redirects
.insert(CanonicalUrl::new(&sdist.url), precise);
}
SourceDist::Registry(_) => {}
}