Skip to content

Commit f38ebbe

Browse files
committed
Auto merge of #13036 - epage:defenestrate, r=Eh2406
fix(resolver): Remove unused public-deps error handling To implement rust-lang/rfcs#3516, we need to decouple the resolver's behavior from the unstable flag. Since the code path is now dead, I went ahead and removed it.
2 parents 430effa + a43e090 commit f38ebbe

File tree

5 files changed

+22
-628
lines changed

5 files changed

+22
-628
lines changed

crates/resolver-tests/src/lib.rs

Lines changed: 12 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::cell::RefCell;
44
use std::cmp::PartialEq;
55
use std::cmp::{max, min};
6-
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
6+
use std::collections::{BTreeMap, HashMap, HashSet};
77
use std::fmt;
88
use std::fmt::Write;
99
use std::rc::Rc;
@@ -18,7 +18,7 @@ use cargo::core::{Dependency, PackageId, Registry, Summary};
1818
use cargo::core::{GitReference, SourceId};
1919
use cargo::sources::source::QueryKind;
2020
use cargo::sources::IndexSummary;
21-
use cargo::util::{CargoResult, Config, Graph, IntoUrl, RustVersion};
21+
use cargo::util::{CargoResult, Config, IntoUrl, RustVersion};
2222

2323
use proptest::collection::{btree_map, vec};
2424
use proptest::prelude::*;
@@ -70,33 +70,6 @@ pub fn resolve_and_validated(
7070
let out = resolve.sort();
7171
assert_eq!(out.len(), used.len());
7272

73-
let mut pub_deps: HashMap<PackageId, HashSet<_>> = HashMap::new();
74-
for &p in out.iter() {
75-
// make the list of `p` public dependencies
76-
let mut self_pub_dep = HashSet::new();
77-
self_pub_dep.insert(p);
78-
for (dp, deps) in resolve.deps(p) {
79-
if deps.iter().any(|d| d.is_public()) {
80-
self_pub_dep.extend(pub_deps[&dp].iter().cloned())
81-
}
82-
}
83-
pub_deps.insert(p, self_pub_dep);
84-
85-
// check if `p` has a public dependencies conflicts
86-
let seen_dep: BTreeSet<_> = resolve
87-
.deps(p)
88-
.flat_map(|(dp, _)| pub_deps[&dp].iter().cloned())
89-
.collect();
90-
let seen_dep: Vec<_> = seen_dep.iter().collect();
91-
for a in seen_dep.windows(2) {
92-
if a[0].name() == a[1].name() {
93-
panic!(
94-
"the package {:?} can publicly see {:?} and {:?}",
95-
p, a[0], a[1]
96-
)
97-
}
98-
}
99-
}
10073
let sat_resolve = sat_resolve.unwrap_or_else(|| SatResolve::new(registry));
10174
if !sat_resolve.sat_is_valid_solution(&out) {
10275
panic!(
@@ -201,7 +174,6 @@ pub fn resolve_with_config_raw(
201174
&mut registry,
202175
&version_prefs,
203176
Some(config),
204-
true,
205177
);
206178

207179
// The largest test in our suite takes less then 30 sec.
@@ -295,7 +267,7 @@ impl SatResolve {
295267
);
296268

297269
// no two semver compatible versions of the same package
298-
let by_activations_keys = sat_at_most_one_by_key(
270+
sat_at_most_one_by_key(
299271
&mut cnf,
300272
var_for_is_packages_used
301273
.iter()
@@ -313,119 +285,22 @@ impl SatResolve {
313285

314286
let empty_vec = vec![];
315287

316-
let mut graph: Graph<PackageId, ()> = Graph::new();
317-
318-
let mut version_selected_for: HashMap<
319-
PackageId,
320-
HashMap<Dependency, HashMap<_, varisat::Var>>,
321-
> = HashMap::new();
322288
// active packages need each of there `deps` to be satisfied
323289
for p in registry.iter() {
324-
graph.add(p.package_id());
325290
for dep in p.dependencies() {
326-
// This can more easily be written as:
327-
// !is_active(p) or one of the things that match dep is_active
328-
// All the complexity, from here to the end, is to support public and private dependencies!
329-
let mut by_key: HashMap<_, Vec<varisat::Lit>> = HashMap::new();
330-
for &m in by_name
291+
let mut matches: Vec<varisat::Lit> = by_name
331292
.get(dep.package_name().as_str())
332293
.unwrap_or(&empty_vec)
333294
.iter()
334295
.filter(|&p| dep.matches_id(*p))
335-
{
336-
graph.link(p.package_id(), m);
337-
by_key
338-
.entry(m.as_activations_key())
339-
.or_default()
340-
.push(var_for_is_packages_used[&m].positive());
341-
}
342-
let keys: HashMap<_, _> = by_key.keys().map(|&k| (k, cnf.new_var())).collect();
343-
344-
// if `p` is active then we need to select one of the keys
345-
let matches: Vec<_> = keys
346-
.values()
347-
.map(|v| v.positive())
348-
.chain(Some(var_for_is_packages_used[&p.package_id()].negative()))
296+
.map(|p| var_for_is_packages_used[&p].positive())
349297
.collect();
298+
// ^ the `dep` is satisfied or `p` is not active
299+
matches.push(var_for_is_packages_used[&p.package_id()].negative());
350300
cnf.add_clause(&matches);
351-
352-
// if a key is active then we need to select one of the versions
353-
for (key, vars) in by_key.iter() {
354-
let mut matches = vars.clone();
355-
matches.push(keys[key].negative());
356-
cnf.add_clause(&matches);
357-
}
358-
359-
version_selected_for
360-
.entry(p.package_id())
361-
.or_default()
362-
.insert(dep.clone(), keys);
363301
}
364302
}
365303

366-
let topological_order = graph.sort();
367-
368-
// we already ensure there is only one version for each `activations_key` so we can think of
369-
// `publicly_exports` as being in terms of a set of `activations_key`s
370-
let mut publicly_exports: HashMap<_, HashMap<_, varisat::Var>> = HashMap::new();
371-
372-
for &key in by_activations_keys.keys() {
373-
// everything publicly depends on itself
374-
let var = publicly_exports
375-
.entry(key)
376-
.or_default()
377-
.entry(key)
378-
.or_insert_with(|| cnf.new_var());
379-
cnf.add_clause(&[var.positive()]);
380-
}
381-
382-
// if a `dep` is public then `p` `publicly_exports` all the things that the selected version `publicly_exports`
383-
for &p in topological_order.iter() {
384-
if let Some(deps) = version_selected_for.get(&p) {
385-
let mut p_exports = publicly_exports.remove(&p.as_activations_key()).unwrap();
386-
for (_, versions) in deps.iter().filter(|(d, _)| d.is_public()) {
387-
for (ver, sel) in versions {
388-
for (&export_pid, &export_var) in publicly_exports[ver].iter() {
389-
let our_var =
390-
p_exports.entry(export_pid).or_insert_with(|| cnf.new_var());
391-
cnf.add_clause(&[
392-
sel.negative(),
393-
export_var.negative(),
394-
our_var.positive(),
395-
]);
396-
}
397-
}
398-
}
399-
publicly_exports.insert(p.as_activations_key(), p_exports);
400-
}
401-
}
402-
403-
// we already ensure there is only one version for each `activations_key` so we can think of
404-
// `can_see` as being in terms of a set of `activations_key`s
405-
// and if `p` `publicly_exports` `export` then it `can_see` `export`
406-
let mut can_see: HashMap<_, HashMap<_, varisat::Var>> = HashMap::new();
407-
408-
// if `p` has a `dep` that selected `ver` then it `can_see` all the things that the selected version `publicly_exports`
409-
for (&p, deps) in version_selected_for.iter() {
410-
let p_can_see = can_see.entry(p).or_default();
411-
for (_, versions) in deps.iter() {
412-
for (&ver, sel) in versions {
413-
for (&export_pid, &export_var) in publicly_exports[&ver].iter() {
414-
let our_var = p_can_see.entry(export_pid).or_insert_with(|| cnf.new_var());
415-
cnf.add_clause(&[
416-
sel.negative(),
417-
export_var.negative(),
418-
our_var.positive(),
419-
]);
420-
}
421-
}
422-
}
423-
}
424-
425-
// a package `can_see` only one version by each name
426-
for (_, see) in can_see.iter() {
427-
sat_at_most_one_by_key(&mut cnf, see.iter().map(|((name, _, _), &v)| (name, v)));
428-
}
429304
let mut solver = varisat::Solver::new();
430305
solver.add_formula(&cnf);
431306

@@ -644,10 +519,9 @@ pub fn dep(name: &str) -> Dependency {
644519
pub fn dep_req(name: &str, req: &str) -> Dependency {
645520
Dependency::parse(name, Some(req), registry_loc()).unwrap()
646521
}
647-
pub fn dep_req_kind(name: &str, req: &str, kind: DepKind, public: bool) -> Dependency {
522+
pub fn dep_req_kind(name: &str, req: &str, kind: DepKind) -> Dependency {
648523
let mut dep = dep_req(name, req);
649524
dep.set_kind(kind);
650-
dep.set_public(public);
651525
dep
652526
}
653527

@@ -740,8 +614,8 @@ fn meta_test_deep_pretty_print_registry() {
740614
pkg!(("bar", "2.0.0") => [dep_req("baz", "=1.0.1")]),
741615
pkg!(("baz", "1.0.2") => [dep_req("other", "2")]),
742616
pkg!(("baz", "1.0.1")),
743-
pkg!(("cat", "1.0.2") => [dep_req_kind("other", "2", DepKind::Build, false)]),
744-
pkg!(("cat", "1.0.3") => [dep_req_kind("other", "2", DepKind::Development, false)]),
617+
pkg!(("cat", "1.0.2") => [dep_req_kind("other", "2", DepKind::Build)]),
618+
pkg!(("cat", "1.0.3") => [dep_req_kind("other", "2", DepKind::Development)]),
745619
pkg!(("dep_req", "1.0.0")),
746620
pkg!(("dep_req", "2.0.0")),
747621
])
@@ -804,14 +678,7 @@ pub fn registry_strategy(
804678
let max_deps = max_versions * (max_crates * (max_crates - 1)) / shrinkage;
805679

806680
let raw_version_range = (any::<Index>(), any::<Index>());
807-
let raw_dependency = (
808-
any::<Index>(),
809-
any::<Index>(),
810-
raw_version_range,
811-
0..=1,
812-
Just(false),
813-
// TODO: ^ this needs to be set back to `any::<bool>()` and work before public & private dependencies can stabilize
814-
);
681+
let raw_dependency = (any::<Index>(), any::<Index>(), raw_version_range, 0..=1);
815682

816683
fn order_index(a: Index, b: Index, size: usize) -> (usize, usize) {
817684
let (a, b) = (a.index(size), b.index(size));
@@ -838,7 +705,7 @@ pub fn registry_strategy(
838705
.collect();
839706
let len_all_pkgid = list_of_pkgid.len();
840707
let mut dependency_by_pkgid = vec![vec![]; len_all_pkgid];
841-
for (a, b, (c, d), k, p) in raw_dependencies {
708+
for (a, b, (c, d), k) in raw_dependencies {
842709
let (a, b) = order_index(a, b, len_all_pkgid);
843710
let (a, b) = if reverse_alphabetical { (b, a) } else { (a, b) };
844711
let ((dep_name, _), _) = list_of_pkgid[a];
@@ -868,7 +735,6 @@ pub fn registry_strategy(
868735
// => DepKind::Development, // Development has no impact so don't gen
869736
_ => panic!("bad index for DepKind"),
870737
},
871-
p && k == 0,
872738
))
873739
}
874740

0 commit comments

Comments
 (0)