|
1 | 1 | use std::cmp::PartialEq;
|
2 | 2 | use std::cmp::{max, min};
|
3 |
| -use std::collections::{BTreeMap, HashSet}; |
| 3 | +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; |
4 | 4 | use std::fmt;
|
5 | 5 | use std::time::Instant;
|
6 | 6 |
|
@@ -54,6 +54,34 @@ pub fn resolve_and_validated(
|
54 | 54 | }
|
55 | 55 | let out = resolve.sort();
|
56 | 56 | assert_eq!(out.len(), used.len());
|
| 57 | + |
| 58 | + let mut pub_deps: HashMap<PackageId, HashSet<_>> = HashMap::new(); |
| 59 | + for &p in out.iter() { |
| 60 | + // make the list of `p` public dependencies |
| 61 | + let mut self_pub_dep = HashSet::new(); |
| 62 | + self_pub_dep.insert(p); |
| 63 | + for (dp, deps) in resolve.deps(p) { |
| 64 | + if deps.iter().any(|d| d.is_public()) { |
| 65 | + self_pub_dep.extend(pub_deps[&dp].iter().cloned()) |
| 66 | + } |
| 67 | + } |
| 68 | + pub_deps.insert(p, self_pub_dep); |
| 69 | + |
| 70 | + // check if `p` has a public dependencies conflicts |
| 71 | + let seen_dep: BTreeSet<_> = resolve |
| 72 | + .deps(p) |
| 73 | + .flat_map(|(dp, _)| pub_deps[&dp].iter().cloned()) |
| 74 | + .collect(); |
| 75 | + let seen_dep: Vec<_> = seen_dep.iter().collect(); |
| 76 | + for a in seen_dep.windows(2) { |
| 77 | + if a[0].name() == a[1].name() { |
| 78 | + panic!( |
| 79 | + "the package {:?} can publicly see {:?} and {:?}", |
| 80 | + p, a[0], a[1] |
| 81 | + ) |
| 82 | + } |
| 83 | + } |
| 84 | + } |
57 | 85 | Ok(out)
|
58 | 86 | }
|
59 | 87 |
|
|
0 commit comments