Skip to content

Commit dc3a127

Browse files
committed
wip
1 parent 726f858 commit dc3a127

File tree

4 files changed

+100
-18
lines changed

4 files changed

+100
-18
lines changed

src/cargo/core/resolver/context.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,12 @@ impl PublicDependency {
372372
// and we can save some time by stopping now.
373373
continue;
374374
}
375-
if let Some(public_age) = age.public_age() {
376-
// Mark that `c` has now bean seen publicly
377-
let old_age = o.get().1.private_age();
378-
o.insert((c, PublicContextAge::Both(old_age, public_age)));
375+
if public.is_public() {
376+
if let Some(public_age) = age.public_age() {
377+
// Mark that `c` has now bean seen publicly
378+
let old_age = o.get().1.private_age();
379+
o.insert((c, PublicContextAge::Both(old_age, public_age)));
380+
}
379381
}
380382
}
381383
im_rc::hashmap::Entry::Vacant(v) => {

src/cargo/core/resolver/mod.rs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,16 @@ fn activate_deps_loop(
420420
{
421421
// If one of our deps is known unresolvable
422422
// then we will not succeed.
423+
// dbg!(&cx.parents, &cx.public_dependency);
423424
conflicting_activations.extend(
424-
conflicting.iter().map(|(&p, r)| (p, r.clone())).filter_map(
425-
|x| {
425+
conflicting
426+
.iter()
427+
.map(|(&p, r)| (p, r.clone()))
428+
.inspect(|(p, r)| {
429+
// dbg!(p, r.clone(), cx.still_applies(*p, r));
430+
assert!(cx.still_applies(*p, &r).is_some());
431+
})
432+
.filter_map(|x| {
426433
use ConflictReason::*;
427434
// How ever if we are part of the reason that
428435
// one of our deps conflicts then
@@ -464,10 +471,7 @@ fn activate_deps_loop(
464471
} else {
465472
Some((
466473
parent.package_id(),
467-
PublicDependency(
468-
r,
469-
e && dep.is_public(),
470-
),
474+
PublicDependency(r, true),
471475
))
472476
}
473477
}
@@ -501,8 +505,11 @@ fn activate_deps_loop(
501505
(p, _) if p == pid => None,
502506
_ => Some(x),
503507
}
504-
},
505-
),
508+
})
509+
.inspect(|(p, r)| {
510+
// dbg!(p, r.clone(), cx.still_applies(*p, r));
511+
assert!(cx.still_applies(*p, &r).is_some());
512+
}),
506513
);
507514

508515
has_past_conflicting_dep = true;
@@ -540,10 +547,15 @@ fn activate_deps_loop(
540547
// but that is not how the cache is set up.
541548
// So we add the less general but much faster,
542549
// "our dep will not succeed if other dep's parent is activated".
550+
// dbg!(&cx.parents, &cx.public_dependency);
543551
conflicting_activations.extend(
544552
conflict
545553
.iter()
546554
.map(|(&p, r)| (p, r.clone()))
555+
.inspect(|(p, r)| {
556+
// dbg!(p, r.clone(), cx.still_applies(*p, r));
557+
assert!(cx.still_applies(*p, &r).is_some());
558+
})
547559
.filter_map(|x| {
548560
use ConflictReason::*;
549561
match x {
@@ -581,10 +593,7 @@ fn activate_deps_loop(
581593
} else {
582594
Some((
583595
parent.package_id(),
584-
PublicDependency(
585-
r,
586-
e && other_dep.is_public(),
587-
),
596+
PublicDependency(r, true),
588597
))
589598
}
590599
}
@@ -620,6 +629,10 @@ fn activate_deps_loop(
620629
}
621630
_ => Some(x),
622631
}
632+
})
633+
.inspect(|(p, r)| {
634+
// dbg!(p, r.clone(), cx.still_applies(*p, r));
635+
assert!(cx.still_applies(*p, &r).is_some());
623636
}),
624637
);
625638
has_past_conflicting_dep = true;

tests/testsuite/resolve.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,55 @@ fn public_dependency_skipping_in_backtracking_18() {
770770
let _ = resolve_and_validated(vec![dep("E")], &reg, None);
771771
}
772772

773+
#[cargo_test]
774+
fn public_dependency_skipping_in_backtracking_19() {
775+
// When backtracking due to a failed dependency, if Cargo is
776+
// trying to be clever and skip irrelevant dependencies, care must
777+
// the effects of pub dep must be accounted for.
778+
let input = vec![
779+
pkg!(("E", "0.0.3")),
780+
pkg!(("E", "0.0.2")),
781+
pkg!(("E", "0.0.1")),
782+
pkg!(("D", "0.0.8")),
783+
pkg!(("D", "0.0.7")),
784+
pkg!(("D", "0.0.6")),
785+
pkg!(("D", "0.0.5")),
786+
pkg!(("D", "0.0.3")),
787+
pkg!(("D", "0.0.2")),
788+
pkg!(("D", "0.0.1")),
789+
pkg!("C" => [dep_req_kind("D", "*", Kind::Normal, true),]),
790+
pkg!("B" => [dep("C"),dep_req("D", ">= 0.0.6"),]),
791+
pkg!("A" => [dep("B"),dep("C"),dep_req("D", "<= 0.0.5"),dep("E"),]),
792+
];
793+
let reg = registry(input);
794+
let _ = resolve_and_validated(vec![dep("A")], &reg, None);
795+
}
796+
797+
#[cargo_test]
798+
fn public_dependency_skipping_in_backtracking_20() {
799+
// When backtracking due to a failed dependency, if Cargo is
800+
// trying to be clever and skip irrelevant dependencies, care must
801+
// the effects of pub dep must be accounted for.
802+
let input = vec![
803+
pkg!(("I", "0.0.0")),
804+
pkg!(("I", "0.0.1")),
805+
pkg!(("H", "0.0.0")),
806+
pkg!(("H", "0.0.1")),
807+
pkg!(("H", "0.0.2")),
808+
pkg!(("H", "5.0.0")),
809+
pkg!("E" => [dep("I"),]),
810+
pkg!("D" => [dep_req_kind("H", "<= 0.0.2", Kind::Normal, true),dep("E"),]),
811+
pkg!(("C", "0.0.1")),
812+
pkg!(("C", "0.0.2")),
813+
pkg!(("B", "0.0.1") => [dep("bad"),]),
814+
pkg!(("B", "0.0.2") => [dep("bad"),]),
815+
pkg!(("B", "0.0.3") => [dep_req_kind("H", "= 5.0.0", Kind::Normal, true),]),
816+
pkg!("A" => [dep("D"),dep("C"),dep("B"),]),
817+
];
818+
let reg = registry(input);
819+
let _ = resolve_and_validated(vec![dep("A")], &reg, None);
820+
}
821+
773822
#[cargo_test]
774823
fn public_sat_topological_order() {
775824
let input = vec![

tests/testsuite/support/resolver.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,27 @@ impl SatResolve {
441441

442442
self.solver.assume(&assumption);
443443

444-
self.solver
444+
let out = self
445+
.solver
445446
.solve()
446-
.expect("docs say it can't error in default config")
447+
.expect("docs say it can't error in default config");
448+
449+
// if let Some(lits) = self.solver.model() {
450+
// let lits: HashSet<_> = lits
451+
// .iter()
452+
// .filter(|l| l.is_positive())
453+
// .map(|l| l.var())
454+
// .collect();
455+
// println!("used:");
456+
// for (p, v) in self.var_for_is_packages_used.iter() {
457+
// if lits.contains(v) {
458+
// println!(" {}", p);
459+
// }
460+
// }
461+
// println!();
462+
// }
463+
464+
out
447465
}
448466
}
449467

0 commit comments

Comments
 (0)