Skip to content

Commit d885d5f

Browse files
committed
Add ResolveVersion gating
1 parent b6bee4c commit d885d5f

File tree

5 files changed

+28
-5
lines changed

5 files changed

+28
-5
lines changed

src/cargo/core/resolver/dep_cache.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use crate::core::resolver::context::Context;
1313
use crate::core::resolver::errors::describe_path_in_context;
1414
use crate::core::resolver::types::{ConflictReason, DepInfo, FeaturesSet};
1515
use crate::core::resolver::{
16-
ActivateError, ActivateResult, CliFeatures, RequestedFeatures, ResolveOpts, VersionOrdering,
17-
VersionPreferences,
16+
ActivateError, ActivateResult, CliFeatures, RequestedFeatures, ResolveOpts, ResolveVersion,
17+
VersionOrdering, VersionPreferences,
1818
};
1919
use crate::core::{
2020
Dependency, FeatureValue, PackageId, PackageIdSpec, QueryKind, Registry, Summary,
@@ -230,6 +230,7 @@ impl<'a> RegistryQueryer<'a> {
230230
candidate: &Summary,
231231
opts: &ResolveOpts,
232232
first_minimal_version: bool,
233+
version: ResolveVersion,
233234
) -> ActivateResult<Rc<(HashSet<InternedString>, Rc<Vec<DepInfo>>)>> {
234235
// if we have calculated a result before, then we can just return it,
235236
// as it is a "pure" query of its arguments.
@@ -242,7 +243,7 @@ impl<'a> RegistryQueryer<'a> {
242243
// First, figure out our set of dependencies based on the requested set
243244
// of features. This also calculates what features we're going to enable
244245
// for our own dependencies.
245-
let (used_features, deps) = resolve_features(parent, candidate, opts)?;
246+
let (used_features, deps) = resolve_features(parent, candidate, opts, version)?;
246247

247248
// Next, transform all dependencies into a list of possible candidates
248249
// which can satisfy that dependency.
@@ -294,6 +295,7 @@ pub fn resolve_features<'b>(
294295
parent: Option<PackageId>,
295296
s: &'b Summary,
296297
opts: &'b ResolveOpts,
298+
version: ResolveVersion,
297299
) -> ActivateResult<(HashSet<InternedString>, Vec<(Dependency, FeaturesSet)>)> {
298300
// First, filter by dev-dependencies.
299301
let deps = s.dependencies();
@@ -313,6 +315,10 @@ pub fn resolve_features<'b>(
313315
.deps
314316
.get(&dep.name_in_toml())
315317
.map(|(weak, _)| {
318+
// Preserve old behaviour on older resolve versions.
319+
if version <= ResolveVersion::V3 {
320+
return false;
321+
}
316322
*weak && !reqs.features.contains(&dep.name_in_toml())
317323
})
318324
.unwrap_or(true);
@@ -339,7 +345,10 @@ pub fn resolve_features<'b>(
339345
// validation is done either in `build_requirements` or
340346
// `build_feature_map`.
341347
if parent.is_none() {
342-
for dep_name in reqs.deps.keys() {
348+
for (dep_name, (weak, _)) in reqs.deps.iter() {
349+
if *weak && !reqs.features.contains(dep_name) {
350+
continue;
351+
}
343352
if !valid_dep_names.contains(dep_name) {
344353
let e = RequirementError::MissingDependency(*dep_name);
345354
return Err(e.into_activate_error(parent, s));

src/cargo/core/resolver/encode.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ impl EncodableResolve {
158158
let mut checksums = HashMap::new();
159159

160160
let mut version = match self.version {
161+
Some(4) => ResolveVersion::V4,
161162
Some(3) => ResolveVersion::V3,
162163
Some(n) => bail!(
163164
"lock file version `{}` was found, but this version of Cargo \
@@ -612,6 +613,7 @@ impl ser::Serialize for Resolve {
612613
metadata,
613614
patch,
614615
version: match self.version() {
616+
ResolveVersion::V4 => Some(4),
615617
ResolveVersion::V3 => Some(3),
616618
ResolveVersion::V2 | ResolveVersion::V1 => None,
617619
},

src/cargo/core/resolver/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ pub fn resolve(
138138
version_prefs: &VersionPreferences,
139139
config: Option<&Config>,
140140
check_public_visible_dependencies: bool,
141+
version: ResolveVersion,
141142
) -> CargoResult<Resolve> {
142143
let _p = profile::start("resolving");
143144
let minimal_versions = match config {
@@ -158,6 +159,7 @@ pub fn resolve(
158159
summaries,
159160
direct_minimal_versions,
160161
config,
162+
version,
161163
)?;
162164
if registry.reset_pending() {
163165
break cx;
@@ -190,7 +192,7 @@ pub fn resolve(
190192
cksums,
191193
BTreeMap::new(),
192194
Vec::new(),
193-
ResolveVersion::default(),
195+
version,
194196
summaries,
195197
);
196198

@@ -212,6 +214,7 @@ fn activate_deps_loop(
212214
summaries: &[(Summary, ResolveOpts)],
213215
direct_minimal_versions: bool,
214216
config: Option<&Config>,
217+
version: ResolveVersion,
215218
) -> CargoResult<Context> {
216219
let mut backtrack_stack = Vec::new();
217220
let mut remaining_deps = RemainingDeps::new();
@@ -230,6 +233,7 @@ fn activate_deps_loop(
230233
summary.clone(),
231234
direct_minimal_versions,
232235
opts,
236+
version,
233237
);
234238
match res {
235239
Ok(Some((frame, _))) => remaining_deps.push(frame),
@@ -436,6 +440,7 @@ fn activate_deps_loop(
436440
candidate,
437441
direct_minimal_version,
438442
&opts,
443+
version,
439444
);
440445

441446
let successfully_activated = match res {
@@ -650,6 +655,7 @@ fn activate(
650655
candidate: Summary,
651656
first_minimal_version: bool,
652657
opts: &ResolveOpts,
658+
version: ResolveVersion,
653659
) -> ActivateResult<Option<(DepsFrame, Duration)>> {
654660
let candidate_pid = candidate.package_id();
655661
cx.age += 1;
@@ -706,6 +712,7 @@ fn activate(
706712
&candidate,
707713
opts,
708714
first_minimal_version,
715+
version,
709716
)?;
710717

711718
// Record what list of features is active for this package.

src/cargo/core/resolver/resolve.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ pub enum ResolveVersion {
8080
/// V3 by default staring in 1.53.
8181
#[default]
8282
V3,
83+
/// Weak dependency features are not treated as non-weak.
84+
V4,
8385
}
8486

8587
impl Resolve {

src/cargo/ops/resolve.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,8 @@ pub fn resolve_with_previous<'cfg>(
495495
None => root_replace.to_vec(),
496496
};
497497

498+
let version = previous.map(|p| p.version()).unwrap_or_default();
499+
498500
ws.preload(registry);
499501
let mut resolved = resolver::resolve(
500502
&summaries,
@@ -505,6 +507,7 @@ pub fn resolve_with_previous<'cfg>(
505507
ws.unstable_features()
506508
.require(Feature::public_dependency())
507509
.is_ok(),
510+
version,
508511
)?;
509512
let patches: Vec<_> = registry
510513
.patches()

0 commit comments

Comments
 (0)