refactor(resolver): Pull MSRV handling to VersionPreferences

This commit is contained in:
Ed Page 2023-11-06 20:26:07 -06:00
parent bf2987b09b
commit 6bfc32a15e
5 changed files with 14 additions and 21 deletions

View File

@ -190,7 +190,6 @@ pub fn resolve_with_config_raw(
.unwrap(); .unwrap();
let opts = ResolveOpts::everything(); let opts = ResolveOpts::everything();
let start = Instant::now(); let start = Instant::now();
let max_rust_version = None;
let mut version_prefs = VersionPreferences::default(); let mut version_prefs = VersionPreferences::default();
if config.cli_unstable().minimal_versions { if config.cli_unstable().minimal_versions {
version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst) version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst)
@ -202,7 +201,6 @@ pub fn resolve_with_config_raw(
&version_prefs, &version_prefs,
Some(config), Some(config),
true, true,
max_rust_version,
); );
// The largest test in our suite takes less then 30 sec. // The largest test in our suite takes less then 30 sec.

View File

@ -20,7 +20,6 @@ use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec, Registry,
use crate::sources::source::QueryKind; use crate::sources::source::QueryKind;
use crate::util::errors::CargoResult; use crate::util::errors::CargoResult;
use crate::util::interning::InternedString; use crate::util::interning::InternedString;
use crate::util::RustVersion;
use anyhow::Context as _; use anyhow::Context as _;
use std::collections::{BTreeSet, HashMap, HashSet}; use std::collections::{BTreeSet, HashMap, HashSet};
@ -32,7 +31,6 @@ pub struct RegistryQueryer<'a> {
pub registry: &'a mut (dyn Registry + 'a), pub registry: &'a mut (dyn Registry + 'a),
replacements: &'a [(PackageIdSpec, Dependency)], replacements: &'a [(PackageIdSpec, Dependency)],
version_prefs: &'a VersionPreferences, version_prefs: &'a VersionPreferences,
max_rust_version: Option<RustVersion>,
/// a cache of `Candidate`s that fulfil a `Dependency` (and whether `first_version`) /// a cache of `Candidate`s that fulfil a `Dependency` (and whether `first_version`)
registry_cache: HashMap<(Dependency, Option<VersionOrdering>), Poll<Rc<Vec<Summary>>>>, registry_cache: HashMap<(Dependency, Option<VersionOrdering>), Poll<Rc<Vec<Summary>>>>,
/// a cache of `Dependency`s that are required for a `Summary` /// a cache of `Dependency`s that are required for a `Summary`
@ -53,13 +51,11 @@ impl<'a> RegistryQueryer<'a> {
registry: &'a mut dyn Registry, registry: &'a mut dyn Registry,
replacements: &'a [(PackageIdSpec, Dependency)], replacements: &'a [(PackageIdSpec, Dependency)],
version_prefs: &'a VersionPreferences, version_prefs: &'a VersionPreferences,
max_rust_version: Option<&RustVersion>,
) -> Self { ) -> Self {
RegistryQueryer { RegistryQueryer {
registry, registry,
replacements, replacements,
version_prefs, version_prefs,
max_rust_version: max_rust_version.cloned(),
registry_cache: HashMap::new(), registry_cache: HashMap::new(),
summary_cache: HashMap::new(), summary_cache: HashMap::new(),
used_replacements: HashMap::new(), used_replacements: HashMap::new(),
@ -109,10 +105,7 @@ impl<'a> RegistryQueryer<'a> {
let mut ret = Vec::new(); let mut ret = Vec::new();
let ready = self.registry.query(dep, QueryKind::Exact, &mut |s| { let ready = self.registry.query(dep, QueryKind::Exact, &mut |s| {
if self.max_rust_version.is_none() || s.rust_version() <= self.max_rust_version.as_ref()
{
ret.push(s); ret.push(s);
}
})?; })?;
if ready.is_pending() { if ready.is_pending() {
self.registry_cache self.registry_cache

View File

@ -71,7 +71,6 @@ use crate::util::config::Config;
use crate::util::errors::CargoResult; use crate::util::errors::CargoResult;
use crate::util::network::PollExt; use crate::util::network::PollExt;
use crate::util::profile; use crate::util::profile;
use crate::util::RustVersion;
use self::context::Context; use self::context::Context;
use self::dep_cache::RegistryQueryer; use self::dep_cache::RegistryQueryer;
@ -139,7 +138,6 @@ pub fn resolve(
version_prefs: &VersionPreferences, version_prefs: &VersionPreferences,
config: Option<&Config>, config: Option<&Config>,
check_public_visible_dependencies: bool, check_public_visible_dependencies: bool,
mut max_rust_version: Option<&RustVersion>,
) -> CargoResult<Resolve> { ) -> CargoResult<Resolve> {
let _p = profile::start("resolving"); let _p = profile::start("resolving");
let first_version = match config { let first_version = match config {
@ -148,14 +146,7 @@ pub fn resolve(
} }
_ => None, _ => None,
}; };
if !config let mut registry = RegistryQueryer::new(registry, replacements, version_prefs);
.map(|c| c.cli_unstable().msrv_policy)
.unwrap_or(false)
{
max_rust_version = None;
}
let mut registry =
RegistryQueryer::new(registry, replacements, version_prefs, max_rust_version);
let cx = loop { let cx = loop {
let cx = Context::new(check_public_visible_dependencies); let cx = Context::new(check_public_visible_dependencies);
let cx = activate_deps_loop(cx, &mut registry, summaries, first_version, config)?; let cx = activate_deps_loop(cx, &mut registry, summaries, first_version, config)?;

View File

@ -6,6 +6,7 @@ use std::collections::{HashMap, HashSet};
use crate::core::{Dependency, PackageId, Summary}; use crate::core::{Dependency, PackageId, Summary};
use crate::util::interning::InternedString; use crate::util::interning::InternedString;
use crate::util::RustVersion;
/// A collection of preferences for particular package versions. /// A collection of preferences for particular package versions.
/// ///
@ -19,6 +20,7 @@ pub struct VersionPreferences {
try_to_use: HashSet<PackageId>, try_to_use: HashSet<PackageId>,
prefer_patch_deps: HashMap<InternedString, HashSet<Dependency>>, prefer_patch_deps: HashMap<InternedString, HashSet<Dependency>>,
version_ordering: VersionOrdering, version_ordering: VersionOrdering,
max_rust_version: Option<RustVersion>,
} }
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash, Debug)] #[derive(Copy, Clone, Default, PartialEq, Eq, Hash, Debug)]
@ -46,6 +48,10 @@ impl VersionPreferences {
self.version_ordering = ordering; self.version_ordering = ordering;
} }
pub fn max_rust_version(&mut self, ver: Option<RustVersion>) {
self.max_rust_version = ver;
}
/// Sort the given vector of summaries in-place, with all summaries presumed to be for /// Sort the given vector of summaries in-place, with all summaries presumed to be for
/// the same package. Preferred versions appear first in the result, sorted by /// the same package. Preferred versions appear first in the result, sorted by
/// `version_ordering`, followed by non-preferred versions sorted the same way. /// `version_ordering`, followed by non-preferred versions sorted the same way.
@ -62,6 +68,9 @@ impl VersionPreferences {
.map(|deps| deps.iter().any(|d| d.matches_id(*pkg_id))) .map(|deps| deps.iter().any(|d| d.matches_id(*pkg_id)))
.unwrap_or(false) .unwrap_or(false)
}; };
if self.max_rust_version.is_some() {
summaries.retain(|s| s.rust_version() <= self.max_rust_version.as_ref());
}
summaries.sort_unstable_by(|a, b| { summaries.sort_unstable_by(|a, b| {
let prefer_a = should_prefer(&a.package_id()); let prefer_a = should_prefer(&a.package_id());
let prefer_b = should_prefer(&b.package_id()); let prefer_b = should_prefer(&b.package_id());

View File

@ -324,6 +324,9 @@ pub fn resolve_with_previous<'cfg>(
if ws.config().cli_unstable().minimal_versions { if ws.config().cli_unstable().minimal_versions {
version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst) version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst)
} }
if ws.config().cli_unstable().msrv_policy {
version_prefs.max_rust_version(max_rust_version.cloned());
}
// This is a set of PackageIds of `[patch]` entries, and some related locked PackageIds, for // This is a set of PackageIds of `[patch]` entries, and some related locked PackageIds, for
// which locking should be avoided (but which will be preferred when searching dependencies, // which locking should be avoided (but which will be preferred when searching dependencies,
@ -512,7 +515,6 @@ pub fn resolve_with_previous<'cfg>(
ws.unstable_features() ws.unstable_features()
.require(Feature::public_dependency()) .require(Feature::public_dependency())
.is_ok(), .is_ok(),
max_rust_version,
)?; )?;
let patches: Vec<_> = registry let patches: Vec<_> = registry
.patches() .patches()