diff --git a/crates/uv-resolver/src/candidate_selector.rs b/crates/uv-resolver/src/candidate_selector.rs index 6f92a3f6b215d..78f157607d311 100644 --- a/crates/uv-resolver/src/candidate_selector.rs +++ b/crates/uv-resolver/src/candidate_selector.rs @@ -18,7 +18,7 @@ use crate::preferences::{Entry, PreferenceSource, Preferences}; use crate::prerelease::{AllowPrerelease, PrereleaseStrategy}; use crate::resolution_mode::ResolutionStrategy; use crate::version_map::{VersionMap, VersionMapDistHandle}; -use crate::{Exclusions, Manifest, Options, ResolverEnvironment}; +use crate::{ExcludeNewerTimestamp, Exclusions, Manifest, Options, ResolverEnvironment}; #[derive(Debug, Clone)] #[allow(clippy::struct_field_names)] @@ -86,6 +86,7 @@ impl CandidateSelector { index: Option<&'a IndexUrl>, env: &ResolverEnvironment, tags: Option<&'a Tags>, + exclude_newer: Option, ) -> Option> { let reinstall = exclusions.reinstall(package_name); let upgrade = exclusions.upgrade(package_name); @@ -134,7 +135,7 @@ impl CandidateSelector { } // Otherwise, find the best candidate from the version maps. - let compatible = self.select_no_preference(package_name, range, version_maps, env); + let compatible = self.select_no_preference(package_name, range, version_maps, env, exclude_newer); // Cross-reference against the already-installed distribution. // @@ -418,6 +419,7 @@ impl CandidateSelector { range: &Range, version_maps: &'a [VersionMap], env: &ResolverEnvironment, + exclude_newer: Option, ) -> Option> { trace!( "Selecting candidate for {package_name} with range {range} with {} remote versions", @@ -457,6 +459,7 @@ impl CandidateSelector { package_name, range, allow_prerelease, + exclude_newer, ) } else { Self::select_candidate( @@ -479,6 +482,7 @@ impl CandidateSelector { package_name, range, allow_prerelease, + exclude_newer, ) } } else { @@ -489,6 +493,7 @@ impl CandidateSelector { package_name, range, allow_prerelease, + exclude_newer, ) }) } else { @@ -498,6 +503,7 @@ impl CandidateSelector { package_name, range, allow_prerelease, + exclude_newer, ) }) } @@ -526,11 +532,13 @@ impl CandidateSelector { /// The returned [`Candidate`] _may not_ be compatible with the current platform; in such /// cases, the resolver is responsible for tracking the incompatibility and re-running the /// selection process with additional constraints. + #[allow(unused_variables)] // exclude_newer is unused here, logging handled at higher level fn select_candidate<'a>( versions: impl Iterator)>, package_name: &'a PackageName, range: &Range, allow_prerelease: bool, + exclude_newer: Option, ) -> Option> { let mut steps = 0usize; let mut incompatible: Option = None; diff --git a/crates/uv-resolver/src/pubgrub/report.rs b/crates/uv-resolver/src/pubgrub/report.rs index 564b2fecd6517..2e21e81a43342 100644 --- a/crates/uv-resolver/src/pubgrub/report.rs +++ b/crates/uv-resolver/src/pubgrub/report.rs @@ -732,7 +732,7 @@ impl PubGrubReportFormatter<'_> { return None; }; - let candidate = selector.select_no_preference(name, set, version_maps, env)?; + let candidate = selector.select_no_preference(name, set, version_maps, env, None)?; let prioritized = candidate.prioritized()?; diff --git a/crates/uv-resolver/src/resolver/batch_prefetch.rs b/crates/uv-resolver/src/resolver/batch_prefetch.rs index 5a6253bf7c123..45d484beb1b27 100644 --- a/crates/uv-resolver/src/resolver/batch_prefetch.rs +++ b/crates/uv-resolver/src/resolver/batch_prefetch.rs @@ -231,7 +231,7 @@ impl BatchPrefetcherRunner { previous, } => { if let Some(candidate) = - selector.select_no_preference(name, &compatible, version_map, env) + selector.select_no_preference(name, &compatible, version_map, env, None) { let compatible = compatible.intersection( &Range::singleton(candidate.version().clone()).complement(), @@ -266,7 +266,7 @@ impl BatchPrefetcherRunner { }; } if let Some(candidate) = - selector.select_no_preference(name, &range, version_map, env) + selector.select_no_preference(name, &range, version_map, env, None) { phase = BatchPrefetchStrategy::InOrder { previous: candidate.version().clone(), diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index e893a82b059b7..e34803152a6b7 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use std::time::Instant; use std::{iter, slice, thread}; -use dashmap::DashMap; +use dashmap::{DashMap, DashSet}; use either::Either; use futures::{FutureExt, StreamExt}; use itertools::Itertools; @@ -135,6 +135,8 @@ struct ResolverState { unavailable_packages: DashMap, /// Incompatibilities for packages that are unavailable at specific versions. incomplete_packages: DashMap>, + /// Packages for which we've already logged `exclude_newer` messages. + logged_exclude_newer: DashSet, /// The options that were used to configure this resolver. options: Options, /// The reporter to use for this resolver. @@ -254,6 +256,7 @@ impl installed_packages, unavailable_packages: DashMap::default(), incomplete_packages: DashMap::default(), + logged_exclude_newer: DashSet::default(), options, reporter: None, }; @@ -1262,6 +1265,9 @@ impl ResolverState ResolverState ResolverState ResolverState ResolverState ResolverState Result<()> { DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (*) DEBUG Adding direct dependency: anyio* DEBUG Searching for a compatible version of anyio (*) + DEBUG Excluding candidates for anyio published after 2024-03-25T00:00:00Z DEBUG No compatible version found for: anyio DEBUG Recording unit propagation conflict of anyio from incompatibility of (project) DEBUG Searching for a compatible version of project @ file://[TEMP_DIR]/ (<0.1.0 | >0.1.0)