Skip to content

Commit 71bb461

Browse files
committed
Bring back Graph::sort so we can use it in tests
This reverts commit a26676a
1 parent cccf817 commit 71bb461

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/cargo/core/resolver/resolve.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ unable to verify that `{0}` is the same as when the lockfile was generated
171171
self.graph.contains(k)
172172
}
173173

174+
pub fn sort(&self) -> Vec<PackageId> {
175+
self.graph.sort()
176+
}
177+
174178
pub fn iter(&self) -> impl Iterator<Item = &PackageId> {
175179
self.graph.iter()
176180
}

src/cargo/util/graph.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::borrow::Borrow;
2-
use std::collections::hash_map::HashMap;
2+
use std::collections::{HashMap, HashSet};
33
use std::fmt;
44
use std::hash::Hash;
55

@@ -42,6 +42,30 @@ impl<N: Eq + Hash + Clone, E: Default> Graph<N, E> {
4242
self.nodes.get(from).into_iter().flat_map(|x| x.iter())
4343
}
4444

45+
/// A topological sort of the `Graph`
46+
pub fn sort(&self) -> Vec<N> {
47+
let mut ret = Vec::new();
48+
let mut marks = HashSet::new();
49+
50+
for node in self.nodes.keys() {
51+
self.sort_inner_visit(node, &mut ret, &mut marks);
52+
}
53+
54+
ret
55+
}
56+
57+
fn sort_inner_visit(&self, node: &N, dst: &mut Vec<N>, marks: &mut HashSet<N>) {
58+
if !marks.insert(node.clone()) {
59+
return;
60+
}
61+
62+
for child in self.nodes[node].keys() {
63+
self.sort_inner_visit(child, dst, marks);
64+
}
65+
66+
dst.push(node.clone());
67+
}
68+
4569
pub fn iter(&self) -> impl Iterator<Item = &N> {
4670
self.nodes.keys()
4771
}

tests/testsuite/support/resolver.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn resolve_and_validated(
5050
}));
5151
}
5252
}
53-
let out: Vec<PackageId> = resolve.iter().cloned().collect();
53+
let out = resolve.sort();
5454
assert_eq!(out.len(), used.len());
5555
Ok(out)
5656
}
@@ -62,8 +62,7 @@ pub fn resolve_with_config(
6262
config: Option<&Config>,
6363
) -> CargoResult<Vec<PackageId>> {
6464
let resolve = resolve_with_config_raw(pkg, deps, registry, config)?;
65-
let out: Vec<PackageId> = resolve.iter().cloned().collect();
66-
Ok(out)
65+
Ok(resolve.sort())
6766
}
6867

6968
pub fn resolve_with_config_raw(

0 commit comments

Comments
 (0)