diff --git a/crates/uv-resolver/src/candidate_selector.rs b/crates/uv-resolver/src/candidate_selector.rs index a3cbca992..5d0d824c8 100644 --- a/crates/uv-resolver/src/candidate_selector.rs +++ b/crates/uv-resolver/src/candidate_selector.rs @@ -138,23 +138,12 @@ impl CandidateSelector { ) -> Option { // In the branches, we "sort" the preferences by marker-matching through an iterator that // first has the matching half and then the mismatching half. - let preferences_match = - preferences - .get(package_name) - .filter(|(marker, _index, _version)| { - // `.unwrap_or(true)` because the universal marker is considered matching. - marker - .map(|marker| env.included_by_marker(marker)) - .unwrap_or(true) - }); - let preferences_mismatch = - preferences - .get(package_name) - .filter(|(marker, _index, _version)| { - marker - .map(|marker| !env.included_by_marker(marker)) - .unwrap_or(false) - }); + let preferences_match = preferences + .get(package_name) + .filter(|(marker, _index, _version)| env.included_by_marker(marker)); + let preferences_mismatch = preferences + .get(package_name) + .filter(|(marker, _index, _version)| !env.included_by_marker(marker)); let preferences = preferences_match.chain(preferences_mismatch).filter_map( |(marker, source, version)| { // If the package is mapped to an explicit index, only consider preferences that @@ -178,7 +167,7 @@ impl CandidateSelector { /// Return the first preference that satisfies the current range and is allowed. fn get_preferred_from_iter<'a, InstalledPackages: InstalledPackagesProvider>( &'a self, - preferences: impl Iterator, &'a Version)>, + preferences: impl Iterator, package_name: &'a PackageName, range: &Range, version_maps: &'a [VersionMap], @@ -226,7 +215,7 @@ impl CandidateSelector { AllowPrerelease::No => false, // If the pre-release is "global" (i.e., provided via a lockfile, rather than // a fork), accept it unless pre-releases are completely banned. - AllowPrerelease::IfNecessary => marker.is_none(), + AllowPrerelease::IfNecessary => marker.is_true(), }; if !allow { continue; diff --git a/crates/uv-resolver/src/preferences.rs b/crates/uv-resolver/src/preferences.rs index c8d571b58..ef7ecab50 100644 --- a/crates/uv-resolver/src/preferences.rs +++ b/crates/uv-resolver/src/preferences.rs @@ -118,7 +118,7 @@ impl Preference { #[derive(Debug, Clone)] struct Entry { - marker: Option, + marker: MarkerTree, index: Option, pin: Pin, } @@ -169,7 +169,7 @@ impl Preferences { slf.insert( preference.name, preference.index, - None, + MarkerTree::TRUE, Pin { version: preference.version, hashes: preference.hashes, @@ -180,7 +180,7 @@ impl Preferences { slf.insert( preference.name.clone(), preference.index.clone(), - Some(fork_marker), + fork_marker, Pin { version: preference.version.clone(), hashes: preference.hashes.clone(), @@ -198,7 +198,7 @@ impl Preferences { &mut self, package_name: PackageName, index: Option, - markers: Option, + markers: MarkerTree, pin: impl Into, ) { self.0.entry(package_name).or_default().push(Entry { @@ -214,19 +214,15 @@ impl Preferences { ) -> impl Iterator< Item = ( &PackageName, - impl Iterator, Option<&IndexUrl>, &Version)>, + impl Iterator, &Version)>, ), > { self.0.iter().map(|(name, preferences)| { ( name, - preferences.iter().map(|entry| { - ( - entry.marker.as_ref(), - entry.index.as_ref(), - entry.pin.version(), - ) - }), + preferences + .iter() + .map(|entry| (&entry.marker, entry.index.as_ref(), entry.pin.version())), ) }) } @@ -235,14 +231,12 @@ impl Preferences { pub(crate) fn get( &self, package_name: &PackageName, - ) -> impl Iterator, Option<&IndexUrl>, &Version)> { - self.0.get(package_name).into_iter().flatten().map(|entry| { - ( - entry.marker.as_ref(), - entry.index.as_ref(), - entry.pin.version(), - ) - }) + ) -> impl Iterator, &Version)> { + self.0 + .get(package_name) + .into_iter() + .flatten() + .map(|entry| (&entry.marker, entry.index.as_ref(), entry.pin.version())) } /// Return the hashes for a package, if the version matches that of the pin. diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index 35256200c..14acd60cb 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -382,7 +382,11 @@ impl ResolverState