Add a VariantJson to the prioritized distribution

This commit is contained in:
konstin 2025-07-02 22:34:00 +02:00
parent fd2e13ce4d
commit 224e639332
6 changed files with 70 additions and 11 deletions

View file

@ -61,8 +61,8 @@ impl Display for WheelFilename {
"{}-{}-{}-{}.whl", "{}-{}-{}-{}.whl",
self.name.as_dist_info_name(), self.name.as_dist_info_name(),
self.version, self.version,
self.tags self.tags,
variant, variant
) )
} else { } else {
write!( write!(
@ -364,8 +364,8 @@ impl WheelFilename {
Ok(Self { Ok(Self {
name, name,
version, version,
variant,
tags, tags,
variant,
}) })
} }
} }

View file

@ -0,0 +1,9 @@
use crate::VariantJson;
use uv_distribution_filename::DistFilename;
/// On an index page, there can be wheels, source distributions and `variant.json` files.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DistOrVariantFilename {
DistFilename(DistFilename),
VariantJson(VariantJson),
}

View file

@ -59,6 +59,7 @@ pub use crate::cached::*;
pub use crate::dependency_metadata::*; pub use crate::dependency_metadata::*;
pub use crate::diagnostic::*; pub use crate::diagnostic::*;
pub use crate::dist_error::*; pub use crate::dist_error::*;
pub use crate::dist_or_variant_filename::*;
pub use crate::error::*; pub use crate::error::*;
pub use crate::file::*; pub use crate::file::*;
pub use crate::hash::*; pub use crate::hash::*;
@ -79,6 +80,7 @@ pub use crate::resolved::*;
pub use crate::specified_requirement::*; pub use crate::specified_requirement::*;
pub use crate::status_code_strategy::*; pub use crate::status_code_strategy::*;
pub use crate::traits::*; pub use crate::traits::*;
pub use crate::variant_json::*;
mod annotation; mod annotation;
mod any; mod any;
@ -87,6 +89,7 @@ mod cached;
mod dependency_metadata; mod dependency_metadata;
mod diagnostic; mod diagnostic;
mod dist_error; mod dist_error;
mod dist_or_variant_filename;
mod error; mod error;
mod file; mod file;
mod hash; mod hash;
@ -107,6 +110,7 @@ mod resolved;
mod specified_requirement; mod specified_requirement;
mod status_code_strategy; mod status_code_strategy;
mod traits; mod traits;
mod variant_json;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum VersionOrUrlRef<'a, T: Pep508Url = VerbatimUrl> { pub enum VersionOrUrlRef<'a, T: Pep508Url = VerbatimUrl> {

View file

@ -13,7 +13,7 @@ use uv_variants::VariantPriority;
use crate::{ use crate::{
File, InstalledDist, KnownPlatform, RegistryBuiltDist, RegistryBuiltWheel, RegistrySourceDist, File, InstalledDist, KnownPlatform, RegistryBuiltDist, RegistryBuiltWheel, RegistrySourceDist,
ResolvedDistRef, ResolvedDistRef, VariantJson,
}; };
/// A collection of distributions that have been filtered by relevance. /// A collection of distributions that have been filtered by relevance.
@ -30,6 +30,8 @@ struct PrioritizedDistInner {
best_wheel_index: Option<usize>, best_wheel_index: Option<usize>,
/// The set of all wheels associated with this distribution. /// The set of all wheels associated with this distribution.
wheels: Vec<(RegistryBuiltWheel, WheelCompatibility)>, wheels: Vec<(RegistryBuiltWheel, WheelCompatibility)>,
/// The `variants.json` file associated with the package version.
variants_json: Option<VariantJson>,
/// The hashes for each distribution. /// The hashes for each distribution.
hashes: Vec<HashDigest>, hashes: Vec<HashDigest>,
/// The set of supported platforms for the distribution, described in terms of their markers. /// The set of supported platforms for the distribution, described in terms of their markers.
@ -42,6 +44,7 @@ impl Default for PrioritizedDistInner {
source: None, source: None,
best_wheel_index: None, best_wheel_index: None,
wheels: Vec::new(), wheels: Vec::new(),
variants_json: None,
hashes: Vec::new(), hashes: Vec::new(),
markers: MarkerTree::FALSE, markers: MarkerTree::FALSE,
} }
@ -350,6 +353,7 @@ impl PrioritizedDist {
markers: implied_markers(&dist.filename), markers: implied_markers(&dist.filename),
best_wheel_index: Some(0), best_wheel_index: Some(0),
wheels: vec![(dist, compatibility)], wheels: vec![(dist, compatibility)],
variants_json: None,
source: None, source: None,
hashes, hashes,
})) }))
@ -366,10 +370,23 @@ impl PrioritizedDist {
best_wheel_index: None, best_wheel_index: None,
wheels: vec![], wheels: vec![],
source: Some((dist, compatibility)), source: Some((dist, compatibility)),
variants_json: None,
hashes, hashes,
})) }))
} }
/// Create a new [`PrioritizedDist`] from the `variant.json`.
pub fn from_variant_json(variant_json: VariantJson) -> Self {
Self(Box::new(PrioritizedDistInner {
markers: MarkerTree::TRUE,
best_wheel_index: None,
wheels: vec![],
source: None,
variants_json: Some(variant_json),
hashes: vec![],
}))
}
/// Insert the given built distribution into the [`PrioritizedDist`]. /// Insert the given built distribution into the [`PrioritizedDist`].
pub fn insert_built( pub fn insert_built(
&mut self, &mut self,
@ -423,6 +440,14 @@ impl PrioritizedDist {
} }
} }
pub fn insert_variant_json(&mut self, variant_json: VariantJson) {
debug_assert!(
self.0.variants_json.is_none(),
"The variant.json filename is unique"
);
self.0.variants_json = Some(variant_json);
}
/// Return the highest-priority distribution for the package version, if any. /// Return the highest-priority distribution for the package version, if any.
pub fn get(&self) -> Option<CompatibleDist> { pub fn get(&self) -> Option<CompatibleDist> {
let best_wheel = self.0.best_wheel_index.map(|i| &self.0.wheels[i]); let best_wheel = self.0.best_wheel_index.map(|i| &self.0.wheels[i]);

View file

@ -0,0 +1,11 @@
use crate::FileLocation;
use uv_normalize::PackageName;
use uv_pep440::Version;
/// A `<name>-<version>-variant.json` file.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VariantJson {
pub name: PackageName,
pub version: Version,
pub file_location: FileLocation,
}

View file

@ -8,8 +8,8 @@ use uv_client::{FlatIndexEntries, FlatIndexEntry};
use uv_configuration::BuildOptions; use uv_configuration::BuildOptions;
use uv_distribution_filename::{DistFilename, SourceDistFilename, WheelFilename}; use uv_distribution_filename::{DistFilename, SourceDistFilename, WheelFilename};
use uv_distribution_types::{ use uv_distribution_types::{
File, HashComparison, HashPolicy, IncompatibleSource, IncompatibleWheel, IndexUrl, DistOrVariantFilename, File, HashComparison, HashPolicy, IncompatibleSource, IncompatibleWheel,
PrioritizedDist, RegistryBuiltWheel, RegistrySourceDist, SourceDistCompatibility, IndexUrl, PrioritizedDist, RegistryBuiltWheel, RegistrySourceDist, SourceDistCompatibility,
WheelCompatibility, WheelCompatibility,
}; };
use uv_normalize::PackageName; use uv_normalize::PackageName;
@ -46,7 +46,7 @@ impl FlatIndex {
let distributions = index.entry(entry.filename.name().clone()).or_default(); let distributions = index.entry(entry.filename.name().clone()).or_default();
distributions.add_file( distributions.add_file(
entry.file, entry.file,
entry.filename, DistOrVariantFilename::DistFilename(entry.filename),
tags, tags,
variants, variants,
hasher, hasher,
@ -92,7 +92,7 @@ impl FlatDistributions {
for entry in entries { for entry in entries {
distributions.add_file( distributions.add_file(
entry.file, entry.file,
entry.filename, DistOrVariantFilename::DistFilename(entry.filename),
tags, tags,
variants, variants,
hasher, hasher,
@ -117,7 +117,7 @@ impl FlatDistributions {
fn add_file( fn add_file(
&mut self, &mut self,
file: File, file: File,
filename: DistFilename, filename: DistOrVariantFilename,
tags: Option<&Tags>, tags: Option<&Tags>,
variants: Option<&VariantSet>, variants: Option<&VariantSet>,
hasher: &HashStrategy, hasher: &HashStrategy,
@ -127,7 +127,7 @@ impl FlatDistributions {
// No `requires-python` here: for source distributions, we don't have that information; // No `requires-python` here: for source distributions, we don't have that information;
// for wheels, we read it lazily only when selected. // for wheels, we read it lazily only when selected.
match filename { match filename {
DistFilename::WheelFilename(filename) => { DistOrVariantFilename::DistFilename(DistFilename::WheelFilename(filename)) => {
let version = filename.version.clone(); let version = filename.version.clone();
let compatibility = Self::wheel_compatibility( let compatibility = Self::wheel_compatibility(
@ -152,7 +152,7 @@ impl FlatDistributions {
} }
} }
} }
DistFilename::SourceDistFilename(filename) => { DistOrVariantFilename::DistFilename(DistFilename::SourceDistFilename(filename)) => {
let compatibility = Self::source_dist_compatibility( let compatibility = Self::source_dist_compatibility(
&filename, &filename,
file.hashes.as_slice(), file.hashes.as_slice(),
@ -176,6 +176,16 @@ impl FlatDistributions {
} }
} }
} }
DistOrVariantFilename::VariantJson(variant_json) => {
match self.0.entry(variant_json.version.clone()) {
Entry::Occupied(mut entry) => {
entry.get_mut().insert_variant_json(variant_json);
}
Entry::Vacant(entry) => {
entry.insert(PrioritizedDist::from_variant_json(variant_json));
}
}
}
} }
} }