mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-04 19:08:04 +00:00
Move FlatIndex
into the uv-resolver
crate (#2972)
## Summary This lets us remove circular dependencies (in the future, e.g., #2945) that arise from `FlatIndex` needing a bunch of resolver-specific abstractions (like incompatibilities, required hashes, etc.) that aren't necessary to _fetch_ the flat index entries.
This commit is contained in:
parent
a9d554fa90
commit
48ba7df98a
18 changed files with 222 additions and 216 deletions
|
@ -34,7 +34,6 @@ reqwest-middleware = { workspace = true }
|
|||
reqwest-retry = { workspace = true }
|
||||
rkyv = { workspace = true }
|
||||
rmp-serde = { workspace = true }
|
||||
rustc-hash = { workspace = true }
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
sys-info = { workspace = true }
|
||||
|
|
|
@ -1,26 +1,17 @@
|
|||
use std::collections::btree_map::Entry;
|
||||
use std::collections::BTreeMap;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use futures::{FutureExt, StreamExt};
|
||||
use reqwest::Response;
|
||||
use rustc_hash::FxHashMap;
|
||||
use tracing::{debug, info_span, instrument, warn, Instrument};
|
||||
|
||||
use tracing::{debug, info_span, warn, Instrument};
|
||||
use url::Url;
|
||||
|
||||
use distribution_filename::{DistFilename, SourceDistFilename, WheelFilename};
|
||||
use distribution_types::{
|
||||
BuiltDist, Dist, File, FileLocation, FlatIndexLocation, IncompatibleSource, IncompatibleWheel,
|
||||
IndexUrl, PrioritizedDist, RegistryBuiltDist, RegistrySourceDist, SourceDist,
|
||||
SourceDistCompatibility, WheelCompatibility,
|
||||
};
|
||||
use pep440_rs::Version;
|
||||
use distribution_filename::DistFilename;
|
||||
use distribution_types::{File, FileLocation, FlatIndexLocation, IndexUrl};
|
||||
|
||||
use pep508_rs::VerbatimUrl;
|
||||
use platform_tags::Tags;
|
||||
|
||||
use uv_cache::{Cache, CacheBucket};
|
||||
use uv_configuration::{NoBinary, NoBuild};
|
||||
use uv_normalize::PackageName;
|
||||
|
||||
use crate::cached_client::{CacheControl, CachedClientError};
|
||||
use crate::html::SimpleHtml;
|
||||
|
@ -38,10 +29,10 @@ pub enum FlatIndexError {
|
|||
#[derive(Debug, Default, Clone)]
|
||||
pub struct FlatIndexEntries {
|
||||
/// The list of `--find-links` entries.
|
||||
entries: Vec<(DistFilename, File, IndexUrl)>,
|
||||
pub entries: Vec<(DistFilename, File, IndexUrl)>,
|
||||
/// Whether any `--find-links` entries could not be resolved due to a lack of network
|
||||
/// connectivity.
|
||||
offline: bool,
|
||||
pub offline: bool,
|
||||
}
|
||||
|
||||
impl FlatIndexEntries {
|
||||
|
@ -258,172 +249,3 @@ impl<'a> FlatIndexClient<'a> {
|
|||
Ok(FlatIndexEntries::from_entries(dists))
|
||||
}
|
||||
}
|
||||
|
||||
/// A set of [`PrioritizedDist`] from a `--find-links` entry, indexed by [`PackageName`]
|
||||
/// and [`Version`].
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct FlatIndex {
|
||||
/// The list of [`FlatDistributions`] from the `--find-links` entries, indexed by package name.
|
||||
index: FxHashMap<PackageName, FlatDistributions>,
|
||||
/// Whether any `--find-links` entries could not be resolved due to a lack of network
|
||||
/// connectivity.
|
||||
offline: bool,
|
||||
}
|
||||
|
||||
impl FlatIndex {
|
||||
/// Collect all files from a `--find-links` target into a [`FlatIndex`].
|
||||
#[instrument(skip_all)]
|
||||
pub fn from_entries(
|
||||
entries: FlatIndexEntries,
|
||||
tags: &Tags,
|
||||
no_build: &NoBuild,
|
||||
no_binary: &NoBinary,
|
||||
) -> Self {
|
||||
// Collect compatible distributions.
|
||||
let mut index = FxHashMap::default();
|
||||
for (filename, file, url) in entries.entries {
|
||||
let distributions = index.entry(filename.name().clone()).or_default();
|
||||
Self::add_file(
|
||||
distributions,
|
||||
file,
|
||||
filename,
|
||||
tags,
|
||||
no_build,
|
||||
no_binary,
|
||||
url,
|
||||
);
|
||||
}
|
||||
|
||||
// Collect offline entries.
|
||||
let offline = entries.offline;
|
||||
|
||||
Self { index, offline }
|
||||
}
|
||||
|
||||
fn add_file(
|
||||
distributions: &mut FlatDistributions,
|
||||
file: File,
|
||||
filename: DistFilename,
|
||||
tags: &Tags,
|
||||
no_build: &NoBuild,
|
||||
no_binary: &NoBinary,
|
||||
index: IndexUrl,
|
||||
) {
|
||||
// No `requires-python` here: for source distributions, we don't have that information;
|
||||
// for wheels, we read it lazily only when selected.
|
||||
match filename {
|
||||
DistFilename::WheelFilename(filename) => {
|
||||
let version = filename.version.clone();
|
||||
|
||||
let compatibility = Self::wheel_compatibility(&filename, tags, no_binary);
|
||||
let dist = Dist::Built(BuiltDist::Registry(RegistryBuiltDist {
|
||||
filename,
|
||||
file: Box::new(file),
|
||||
index,
|
||||
}));
|
||||
match distributions.0.entry(version) {
|
||||
Entry::Occupied(mut entry) => {
|
||||
entry.get_mut().insert_built(dist, vec![], compatibility);
|
||||
}
|
||||
Entry::Vacant(entry) => {
|
||||
entry.insert(PrioritizedDist::from_built(dist, vec![], compatibility));
|
||||
}
|
||||
}
|
||||
}
|
||||
DistFilename::SourceDistFilename(filename) => {
|
||||
let compatibility = Self::source_dist_compatibility(&filename, no_build);
|
||||
let dist = Dist::Source(SourceDist::Registry(RegistrySourceDist {
|
||||
filename: filename.clone(),
|
||||
file: Box::new(file),
|
||||
index,
|
||||
}));
|
||||
match distributions.0.entry(filename.version) {
|
||||
Entry::Occupied(mut entry) => {
|
||||
entry.get_mut().insert_source(dist, vec![], compatibility);
|
||||
}
|
||||
Entry::Vacant(entry) => {
|
||||
entry.insert(PrioritizedDist::from_source(dist, vec![], compatibility));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn source_dist_compatibility(
|
||||
filename: &SourceDistFilename,
|
||||
no_build: &NoBuild,
|
||||
) -> SourceDistCompatibility {
|
||||
// Check if source distributions are allowed for this package.
|
||||
let no_build = match no_build {
|
||||
NoBuild::None => false,
|
||||
NoBuild::All => true,
|
||||
NoBuild::Packages(packages) => packages.contains(&filename.name),
|
||||
};
|
||||
|
||||
if no_build {
|
||||
return SourceDistCompatibility::Incompatible(IncompatibleSource::NoBuild);
|
||||
}
|
||||
|
||||
SourceDistCompatibility::Compatible
|
||||
}
|
||||
|
||||
fn wheel_compatibility(
|
||||
filename: &WheelFilename,
|
||||
tags: &Tags,
|
||||
no_binary: &NoBinary,
|
||||
) -> WheelCompatibility {
|
||||
// Check if binaries are allowed for this package.
|
||||
let no_binary = match no_binary {
|
||||
NoBinary::None => false,
|
||||
NoBinary::All => true,
|
||||
NoBinary::Packages(packages) => packages.contains(&filename.name),
|
||||
};
|
||||
|
||||
if no_binary {
|
||||
return WheelCompatibility::Incompatible(IncompatibleWheel::NoBinary);
|
||||
}
|
||||
|
||||
// Determine a compatibility for the wheel based on tags.
|
||||
WheelCompatibility::from(filename.compatibility(tags))
|
||||
}
|
||||
|
||||
/// Get the [`FlatDistributions`] for the given package name.
|
||||
pub fn get(&self, package_name: &PackageName) -> Option<&FlatDistributions> {
|
||||
self.index.get(package_name)
|
||||
}
|
||||
|
||||
/// Returns `true` if there are any offline `--find-links` entries.
|
||||
pub fn offline(&self) -> bool {
|
||||
self.offline
|
||||
}
|
||||
}
|
||||
|
||||
/// A set of [`PrioritizedDist`] from a `--find-links` entry for a single package, indexed
|
||||
/// by [`Version`].
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct FlatDistributions(BTreeMap<Version, PrioritizedDist>);
|
||||
|
||||
impl FlatDistributions {
|
||||
pub fn iter(&self) -> impl Iterator<Item = (&Version, &PrioritizedDist)> {
|
||||
self.0.iter()
|
||||
}
|
||||
|
||||
pub fn remove(&mut self, version: &Version) -> Option<PrioritizedDist> {
|
||||
self.0.remove(version)
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoIterator for FlatDistributions {
|
||||
type Item = (Version, PrioritizedDist);
|
||||
type IntoIter = std::collections::btree_map::IntoIter<Version, PrioritizedDist>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
self.0.into_iter()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<FlatDistributions> for BTreeMap<Version, PrioritizedDist> {
|
||||
fn from(distributions: FlatDistributions) -> Self {
|
||||
distributions.0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
pub use base_client::{BaseClient, BaseClientBuilder};
|
||||
pub use cached_client::{CacheControl, CachedClient, CachedClientError, DataWithCachePolicy};
|
||||
pub use error::{BetterReqwestError, Error, ErrorKind};
|
||||
pub use flat_index::{FlatDistributions, FlatIndex, FlatIndexClient, FlatIndexError};
|
||||
pub use flat_index::{FlatIndexClient, FlatIndexEntries, FlatIndexError};
|
||||
pub use linehaul::LineHaul;
|
||||
pub use registry_client::{
|
||||
Connectivity, RegistryClient, RegistryClientBuilder, SimpleMetadata, SimpleMetadatum,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue