From 9c8a741efeea143087afff2d802bcffe87223be8 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 6 Dec 2024 07:40:49 -0500 Subject: [PATCH] Respect build tag priority in `uv.lock` (#9677) ## Summary Akin to https://github.com/astral-sh/uv/pull/3781. Closes https://github.com/astral-sh/uv/issues/9673. --- crates/uv-resolver/src/lock/mod.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/uv-resolver/src/lock/mod.rs b/crates/uv-resolver/src/lock/mod.rs index 4520d5548..d965e8700 100644 --- a/crates/uv-resolver/src/lock/mod.rs +++ b/crates/uv-resolver/src/lock/mod.rs @@ -27,7 +27,9 @@ use crate::{ use uv_cache_key::RepositoryUrl; use uv_configuration::BuildOptions; use uv_distribution::DistributionDatabase; -use uv_distribution_filename::{DistExtension, ExtensionError, SourceDistExtension, WheelFilename}; +use uv_distribution_filename::{ + BuildTag, DistExtension, ExtensionError, SourceDistExtension, WheelFilename, +}; use uv_distribution_types::{ BuiltDist, DependencyMetadata, DirectUrlBuiltDist, DirectUrlSourceDist, DirectorySourceDist, Dist, DistributionMetadata, FileLocation, GitSourceDist, IndexLocations, IndexUrl, Name, @@ -2094,20 +2096,24 @@ impl Package { } fn find_best_wheel(&self, tag_policy: TagPolicy<'_>) -> Option { - let mut best: Option<(TagPriority, usize)> = None; + type WheelPriority<'lock> = (TagPriority, Option<&'lock BuildTag>); + + let mut best: Option<(WheelPriority, usize)> = None; for (i, wheel) in self.wheels.iter().enumerate() { - let TagCompatibility::Compatible(priority) = + let TagCompatibility::Compatible(tag_priority) = wheel.filename.compatibility(tag_policy.tags()) else { continue; }; + let build_tag = wheel.filename.build_tag.as_ref(); + let wheel_priority = (tag_priority, build_tag); match best { None => { - best = Some((priority, i)); + best = Some((wheel_priority, i)); } Some((best_priority, _)) => { - if priority > best_priority { - best = Some((priority, i)); + if wheel_priority > best_priority { + best = Some((wheel_priority, i)); } } }