Skip to content

Commit f6e0c2f

Browse files
committed
Don't use Resolve.root when checking for cycles
1 parent 261cfa7 commit f6e0c2f

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

src/cargo/core/resolver/mod.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -980,15 +980,24 @@ impl<'a> Context<'a> {
980980
fn check_cycles(resolve: &Resolve,
981981
activations: &HashMap<(String, SourceId), Vec<Rc<Summary>>>)
982982
-> CargoResult<()> {
983-
let mut summaries = HashMap::new();
984-
for summary in activations.values().flat_map(|v| v) {
985-
summaries.insert(summary.package_id(), &**summary);
983+
let summaries: HashMap<&PackageId, &Summary> = activations.values()
984+
.flat_map(|v| v)
985+
.map(|s| (s.package_id(), &**s))
986+
.collect();
987+
988+
// Sort packages to produce user friendly deterministic errors.
989+
let all_packages = resolve.iter().collect::<BinaryHeap<_>>().into_sorted_vec();
990+
let mut checked = HashSet::new();
991+
for pkg in all_packages {
992+
if !checked.contains(pkg) {
993+
try!(visit(resolve,
994+
pkg,
995+
&summaries,
996+
&mut HashSet::new(),
997+
&mut checked))
998+
}
986999
}
987-
return visit(resolve,
988-
resolve.root(),
989-
&summaries,
990-
&mut HashSet::new(),
991-
&mut HashSet::new());
1000+
return Ok(());
9921001

9931002
fn visit<'a>(resolve: &'a Resolve,
9941003
id: &'a PackageId,

tests/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1887,7 +1887,7 @@ fn cyclic_deps_rejected() {
18871887
assert_that(p.cargo_process("build").arg("-v"),
18881888
execs().with_status(101)
18891889
.with_stderr("\
1890-
[ERROR] cyclic package dependency: package `foo v0.0.1 ([..])` depends on itself
1890+
[ERROR] cyclic package dependency: package `a v0.0.1 ([..])` depends on itself
18911891
"));
18921892
}
18931893

0 commit comments

Comments
 (0)