Skip to content

Commit 6a3b481

Browse files
committed
chore(resolver): Gate new resolver behind Version 5
Signed-off-by: Jackhr-arch <[email protected]>
1 parent e607b37 commit 6a3b481

File tree

3 files changed

+52
-27
lines changed

3 files changed

+52
-27
lines changed

crates/resolver-tests/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ pub fn resolve_with_global_context_raw(
206206
&[],
207207
&mut registry,
208208
&version_prefs,
209-
ResolveVersion::with_rust_version(None),
209+
ResolveVersion::V5,
210210
Some(gctx),
211211
);
212212

src/cargo/core/resolver/dep_cache.rs

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use crate::core::resolver::context::ResolverContext;
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, PackageIdSpecQuery, Registry, Summary,
@@ -229,6 +229,7 @@ impl<'a> RegistryQueryer<'a> {
229229
candidate: &Summary,
230230
opts: &ResolveOpts,
231231
first_version: Option<VersionOrdering>,
232+
version: ResolveVersion,
232233
) -> ActivateResult<Rc<(HashSet<InternedString>, Rc<Vec<DepInfo>>)>> {
233234
// if we have calculated a result before, then we can just return it,
234235
// as it is a "pure" query of its arguments.
@@ -241,7 +242,7 @@ impl<'a> RegistryQueryer<'a> {
241242
// First, figure out our set of dependencies based on the requested set
242243
// of features. This also calculates what features we're going to enable
243244
// for our own dependencies.
244-
let (used_features, deps) = resolve_features(parent, candidate, opts)?;
245+
let (used_features, deps) = resolve_features(parent, candidate, opts, version)?;
245246

246247
// Next, transform all dependencies into a list of possible candidates
247248
// which can satisfy that dependency.
@@ -291,12 +292,13 @@ pub fn resolve_features<'b>(
291292
parent: Option<PackageId>,
292293
s: &'b Summary,
293294
opts: &'b ResolveOpts,
295+
version: ResolveVersion,
294296
) -> ActivateResult<(HashSet<InternedString>, Vec<(Dependency, FeaturesSet)>)> {
295297
// First, filter by dev-dependencies.
296298
let deps = s.dependencies();
297299
let deps = deps.iter().filter(|d| d.is_transitive() || opts.dev_deps);
298300

299-
let reqs = build_requirements(parent, s, opts)?;
301+
let reqs = build_requirements(parent, s, opts, version)?;
300302
let mut ret = Vec::new();
301303
let default_dep = BTreeSet::new();
302304
let mut valid_dep_names = HashSet::new();
@@ -344,21 +346,24 @@ fn build_requirements<'a, 'b: 'a>(
344346
parent: Option<PackageId>,
345347
s: &'a Summary,
346348
opts: &'b ResolveOpts,
349+
version: ResolveVersion,
347350
) -> ActivateResult<Requirements<'a>> {
348351
let mut reqs = Requirements::new(s);
349352

350353
let handle_default = |uses_default_features, reqs: &mut Requirements<'_>| {
351354
if uses_default_features && s.features().contains_key("default") {
352-
if let Err(e) = reqs.require_feature(INTERNED_DEFAULT) {
355+
if let Err(e) = reqs.require_feature(INTERNED_DEFAULT, version) {
353356
return Err(e.into_activate_error(parent, s));
354357
}
355358
}
356-
// all features(including those containing 'weak' ones) have been enabled,
357-
// so we assume all packages have been enabled, thus run the second
358-
// (also final) scan to enable the rest weak dependency features
359-
for feature in std::mem::take(&mut reqs.weak_feature_values) {
360-
if let Err(e) = reqs.require_value(&feature) {
361-
return Err(e.into_activate_error(parent, s));
359+
if version >= ResolveVersion::V5 {
360+
// all features(including those containing 'weak' ones) have been enabled,
361+
// so we assume all packages have been enabled, thus run the second
362+
// (also final) scan to enable the rest weak dependency features
363+
for feature in std::mem::take(&mut reqs.weak_feature_values) {
364+
if let Err(e) = reqs.require_value(&feature, version) {
365+
return Err(e.into_activate_error(parent, s));
366+
}
362367
}
363368
}
364369
Ok(())
@@ -372,14 +377,14 @@ fn build_requirements<'a, 'b: 'a>(
372377
}) => {
373378
if *all_features {
374379
for key in s.features().keys() {
375-
if let Err(e) = reqs.require_feature(*key) {
380+
if let Err(e) = reqs.require_feature(*key, version) {
376381
return Err(e.into_activate_error(parent, s));
377382
}
378383
}
379384
}
380385

381386
for fv in features.iter() {
382-
if let Err(e) = reqs.require_value(fv) {
387+
if let Err(e) = reqs.require_value(fv, version) {
383388
return Err(e.into_activate_error(parent, s));
384389
}
385390
}
@@ -390,7 +395,7 @@ fn build_requirements<'a, 'b: 'a>(
390395
uses_default_features,
391396
} => {
392397
for feature in features.iter() {
393-
if let Err(e) = reqs.require_feature(*feature) {
398+
if let Err(e) = reqs.require_feature(*feature, version) {
394399
return Err(e.into_activate_error(parent, s));
395400
}
396401
}
@@ -453,6 +458,7 @@ impl Requirements<'_> {
453458
package: InternedString,
454459
feat: InternedString,
455460
weak: bool,
461+
version: ResolveVersion,
456462
) -> Result<(), RequirementError> {
457463
// If `package` is indeed an optional dependency then we activate the
458464
// feature named `package`, but otherwise if `package` is a required
@@ -468,16 +474,20 @@ impl Requirements<'_> {
468474
// the same name if the `dep:` syntax is used to avoid creating
469475
// that implicit feature.
470476
if self.summary.features().contains_key(&package) {
471-
self.require_feature(package)?;
477+
self.require_feature(package, version)?;
472478
}
473479
}
474480
self.deps.entry(package).or_default().insert(feat);
475481
} else {
476-
// If parent package haven't enabled this package, the feature will
477-
// be ignored.
478-
self.deps.entry(package).and_modify(|feats| {
479-
feats.insert(feat);
480-
});
482+
if version >= ResolveVersion::V5 {
483+
// If parent package haven't enabled this package, the feature will
484+
// be ignored.
485+
self.deps.entry(package).and_modify(|feats| {
486+
feats.insert(feat);
487+
});
488+
} else {
489+
self.deps.entry(package).or_default().insert(feat);
490+
}
481491
}
482492

483493
Ok(())
@@ -487,7 +497,11 @@ impl Requirements<'_> {
487497
self.deps.entry(pkg).or_default();
488498
}
489499

490-
fn require_feature(&mut self, feat: InternedString) -> Result<(), RequirementError> {
500+
fn require_feature(
501+
&mut self,
502+
feat: InternedString,
503+
version: ResolveVersion,
504+
) -> Result<(), RequirementError> {
491505
if !self.features.insert(feat) {
492506
// Already seen this feature.
493507
return Ok(());
@@ -503,25 +517,30 @@ impl Requirements<'_> {
503517
return Err(RequirementError::Cycle(feat));
504518
}
505519
}
506-
if let FeatureValue::DepFeature { weak, .. } = &fv
520+
if version >= ResolveVersion::V5
521+
&& let FeatureValue::DepFeature { weak, .. } = &fv
507522
&& *weak
508523
{
509524
self.weak_feature_values.insert(fv.clone());
510525
}
511-
self.require_value(fv)?;
526+
self.require_value(fv, version)?;
512527
}
513528
Ok(())
514529
}
515530

516-
fn require_value(&mut self, fv: &FeatureValue) -> Result<(), RequirementError> {
531+
fn require_value(
532+
&mut self,
533+
fv: &FeatureValue,
534+
version: ResolveVersion,
535+
) -> Result<(), RequirementError> {
517536
match fv {
518-
FeatureValue::Feature(feat) => self.require_feature(*feat)?,
537+
FeatureValue::Feature(feat) => self.require_feature(*feat, version)?,
519538
FeatureValue::Dep { dep_name } => self.require_dependency(*dep_name),
520539
FeatureValue::DepFeature {
521540
dep_name,
522541
dep_feature,
523542
weak,
524-
} => self.require_dep_feature(*dep_name, *dep_feature, *weak)?,
543+
} => self.require_dep_feature(*dep_name, *dep_feature, *weak, version)?,
525544
};
526545
Ok(())
527546
}

src/cargo/core/resolver/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ pub fn resolve(
145145
first_version,
146146
gctx,
147147
&mut past_conflicting_activations,
148+
resolve_version,
148149
)?;
149150
if registry.reset_pending() {
150151
break resolver_ctx;
@@ -199,6 +200,7 @@ fn activate_deps_loop(
199200
first_version: Option<VersionOrdering>,
200201
gctx: Option<&GlobalContext>,
201202
past_conflicting_activations: &mut conflict_cache::ConflictCache,
203+
version: ResolveVersion,
202204
) -> CargoResult<ResolverContext> {
203205
let mut resolver_ctx = ResolverContext::new();
204206
let mut backtrack_stack = Vec::new();
@@ -214,6 +216,7 @@ fn activate_deps_loop(
214216
summary.clone(),
215217
first_version,
216218
opts,
219+
version,
217220
);
218221
match res {
219222
Ok(Some((frame, _))) => remaining_deps.push(frame),
@@ -415,6 +418,7 @@ fn activate_deps_loop(
415418
candidate,
416419
first_version,
417420
&opts,
421+
version,
418422
);
419423

420424
let successfully_activated = match res {
@@ -627,6 +631,7 @@ fn activate(
627631
candidate: Summary,
628632
first_version: Option<VersionOrdering>,
629633
opts: &ResolveOpts,
634+
version: ResolveVersion,
630635
) -> ActivateResult<Option<(DepsFrame, Duration)>> {
631636
let candidate_pid = candidate.package_id();
632637
cx.age += 1;
@@ -674,6 +679,7 @@ fn activate(
674679
&candidate,
675680
opts,
676681
first_version,
682+
version,
677683
)?;
678684

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

0 commit comments

Comments
 (0)