Skip to content

Commit 6bfc32a

Browse files
committed
refactor(resolver): Pull MSRV handling to VersionPreferences
1 parent bf2987b commit 6bfc32a

File tree

5 files changed

+14
-21
lines changed

5 files changed

+14
-21
lines changed

crates/resolver-tests/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ pub fn resolve_with_config_raw(
190190
.unwrap();
191191
let opts = ResolveOpts::everything();
192192
let start = Instant::now();
193-
let max_rust_version = None;
194193
let mut version_prefs = VersionPreferences::default();
195194
if config.cli_unstable().minimal_versions {
196195
version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst)
@@ -202,7 +201,6 @@ pub fn resolve_with_config_raw(
202201
&version_prefs,
203202
Some(config),
204203
true,
205-
max_rust_version,
206204
);
207205

208206
// The largest test in our suite takes less then 30 sec.

src/cargo/core/resolver/dep_cache.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec, Registry,
2020
use crate::sources::source::QueryKind;
2121
use crate::util::errors::CargoResult;
2222
use crate::util::interning::InternedString;
23-
use crate::util::RustVersion;
2423

2524
use anyhow::Context as _;
2625
use std::collections::{BTreeSet, HashMap, HashSet};
@@ -32,7 +31,6 @@ pub struct RegistryQueryer<'a> {
3231
pub registry: &'a mut (dyn Registry + 'a),
3332
replacements: &'a [(PackageIdSpec, Dependency)],
3433
version_prefs: &'a VersionPreferences,
35-
max_rust_version: Option<RustVersion>,
3634
/// a cache of `Candidate`s that fulfil a `Dependency` (and whether `first_version`)
3735
registry_cache: HashMap<(Dependency, Option<VersionOrdering>), Poll<Rc<Vec<Summary>>>>,
3836
/// a cache of `Dependency`s that are required for a `Summary`
@@ -53,13 +51,11 @@ impl<'a> RegistryQueryer<'a> {
5351
registry: &'a mut dyn Registry,
5452
replacements: &'a [(PackageIdSpec, Dependency)],
5553
version_prefs: &'a VersionPreferences,
56-
max_rust_version: Option<&RustVersion>,
5754
) -> Self {
5855
RegistryQueryer {
5956
registry,
6057
replacements,
6158
version_prefs,
62-
max_rust_version: max_rust_version.cloned(),
6359
registry_cache: HashMap::new(),
6460
summary_cache: HashMap::new(),
6561
used_replacements: HashMap::new(),
@@ -109,10 +105,7 @@ impl<'a> RegistryQueryer<'a> {
109105

110106
let mut ret = Vec::new();
111107
let ready = self.registry.query(dep, QueryKind::Exact, &mut |s| {
112-
if self.max_rust_version.is_none() || s.rust_version() <= self.max_rust_version.as_ref()
113-
{
114-
ret.push(s);
115-
}
108+
ret.push(s);
116109
})?;
117110
if ready.is_pending() {
118111
self.registry_cache

src/cargo/core/resolver/mod.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ use crate::util::config::Config;
7171
use crate::util::errors::CargoResult;
7272
use crate::util::network::PollExt;
7373
use crate::util::profile;
74-
use crate::util::RustVersion;
7574

7675
use self::context::Context;
7776
use self::dep_cache::RegistryQueryer;
@@ -139,7 +138,6 @@ pub fn resolve(
139138
version_prefs: &VersionPreferences,
140139
config: Option<&Config>,
141140
check_public_visible_dependencies: bool,
142-
mut max_rust_version: Option<&RustVersion>,
143141
) -> CargoResult<Resolve> {
144142
let _p = profile::start("resolving");
145143
let first_version = match config {
@@ -148,14 +146,7 @@ pub fn resolve(
148146
}
149147
_ => None,
150148
};
151-
if !config
152-
.map(|c| c.cli_unstable().msrv_policy)
153-
.unwrap_or(false)
154-
{
155-
max_rust_version = None;
156-
}
157-
let mut registry =
158-
RegistryQueryer::new(registry, replacements, version_prefs, max_rust_version);
149+
let mut registry = RegistryQueryer::new(registry, replacements, version_prefs);
159150
let cx = loop {
160151
let cx = Context::new(check_public_visible_dependencies);
161152
let cx = activate_deps_loop(cx, &mut registry, summaries, first_version, config)?;

src/cargo/core/resolver/version_prefs.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::collections::{HashMap, HashSet};
66

77
use crate::core::{Dependency, PackageId, Summary};
88
use crate::util::interning::InternedString;
9+
use crate::util::RustVersion;
910

1011
/// A collection of preferences for particular package versions.
1112
///
@@ -19,6 +20,7 @@ pub struct VersionPreferences {
1920
try_to_use: HashSet<PackageId>,
2021
prefer_patch_deps: HashMap<InternedString, HashSet<Dependency>>,
2122
version_ordering: VersionOrdering,
23+
max_rust_version: Option<RustVersion>,
2224
}
2325

2426
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash, Debug)]
@@ -46,6 +48,10 @@ impl VersionPreferences {
4648
self.version_ordering = ordering;
4749
}
4850

51+
pub fn max_rust_version(&mut self, ver: Option<RustVersion>) {
52+
self.max_rust_version = ver;
53+
}
54+
4955
/// Sort the given vector of summaries in-place, with all summaries presumed to be for
5056
/// the same package. Preferred versions appear first in the result, sorted by
5157
/// `version_ordering`, followed by non-preferred versions sorted the same way.
@@ -62,6 +68,9 @@ impl VersionPreferences {
6268
.map(|deps| deps.iter().any(|d| d.matches_id(*pkg_id)))
6369
.unwrap_or(false)
6470
};
71+
if self.max_rust_version.is_some() {
72+
summaries.retain(|s| s.rust_version() <= self.max_rust_version.as_ref());
73+
}
6574
summaries.sort_unstable_by(|a, b| {
6675
let prefer_a = should_prefer(&a.package_id());
6776
let prefer_b = should_prefer(&b.package_id());

src/cargo/ops/resolve.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ pub fn resolve_with_previous<'cfg>(
324324
if ws.config().cli_unstable().minimal_versions {
325325
version_prefs.version_ordering(VersionOrdering::MinimumVersionsFirst)
326326
}
327+
if ws.config().cli_unstable().msrv_policy {
328+
version_prefs.max_rust_version(max_rust_version.cloned());
329+
}
327330

328331
// This is a set of PackageIds of `[patch]` entries, and some related locked PackageIds, for
329332
// which locking should be avoided (but which will be preferred when searching dependencies,
@@ -512,7 +515,6 @@ pub fn resolve_with_previous<'cfg>(
512515
ws.unstable_features()
513516
.require(Feature::public_dependency())
514517
.is_ok(),
515-
max_rust_version,
516518
)?;
517519
let patches: Vec<_> = registry
518520
.patches()

0 commit comments

Comments
 (0)