diff --git a/examples/unsat_root_message_no_version.rs b/examples/unsat_root_message_no_version.rs index 8b01bcf1..5b52358f 100644 --- a/examples/unsat_root_message_no_version.rs +++ b/examples/unsat_root_message_no_version.rs @@ -71,7 +71,7 @@ impl ReportFormatter, String> for CustomReportFo External::NotRoot(package, version) => { format!("we are solving dependencies of {package} {version}") } - External::NoVersions(package, set) => { + External::NoVersions(package, set, _) => { if set == &Range::full() { format!("there is no available version for {package}") } else { diff --git a/src/internal/incompatibility.rs b/src/internal/incompatibility.rs index 6c4d2417..1e4d2346 100644 --- a/src/internal/incompatibility.rs +++ b/src/internal/incompatibility.rs @@ -104,14 +104,14 @@ impl Incompatibilit } /// Create an incompatibility to remember that a given set does not contain any version. - pub fn no_versions(package: P, term: Term) -> Self { + pub fn no_versions(package: P, term: Term, reason: Option) -> Self { let set = match &term { Term::Positive(r) => r.clone(), Term::Negative(_) => panic!("No version should have a positive term"), }; Self { package_terms: SmallMap::One([(package.clone(), term)]), - kind: Kind::NoVersions(package, set), + kind: Kind::NoVersions(package, set, reason), } } diff --git a/src/report.rs b/src/report.rs index 944bd9f0..2a4f5b09 100644 --- a/src/report.rs +++ b/src/report.rs @@ -47,8 +47,8 @@ pub enum DerivationTree { /// Initial incompatibility aiming at picking the root package for the first decision. NotRoot(P, VS::V), - /// There are no versions in the given set for this package. - NoVersions(P, VS), + /// There are no versions in the given set for this package. A string reason is included. + NoVersions(P, VS, Option), /// Incompatibility coming from the dependencies of a given package. FromDependencyOf(P, VS, P, VS), /// The package is unusable for reasons outside pubgrub. @@ -82,7 +82,7 @@ impl DerivationTree packages.insert(p); packages.insert(p2); } - External::NoVersions(p, _) + External::NoVersions(p, _, _) | External::NotRoot(p, _) | External::Custom(p, _, _) => { packages.insert(p); @@ -112,14 +112,14 @@ impl DerivationTree Arc::make_mut(&mut derived.cause1), Arc::make_mut(&mut derived.cause2), ) { - (DerivationTree::External(External::NoVersions(p, r)), ref mut cause2) => { + (DerivationTree::External(External::NoVersions(p, r, _)), ref mut cause2) => { cause2.collapse_no_versions(); *self = cause2 .clone() .merge_no_versions(p.to_owned(), r.to_owned()) .unwrap_or_else(|| self.to_owned()); } - (ref mut cause1, DerivationTree::External(External::NoVersions(p, r))) => { + (ref mut cause1, DerivationTree::External(External::NoVersions(p, r, _))) => { cause1.collapse_no_versions(); *self = cause1 .clone() @@ -143,7 +143,6 @@ impl DerivationTree DerivationTree::External(External::NotRoot(_, _)) => { panic!("How did we end up with a NoVersions merged with a NotRoot?") } - // // Cannot be merged because the reason may not match DerivationTree::External(External::NoVersions(_, _)) => None, DerivationTree::External(External::Custom(_, r, reason)) => Some( @@ -178,7 +177,7 @@ impl fmt::Display Self::NotRoot(package, version) => { write!(f, "we are solving dependencies of {} {}", package, version) } - Self::NoVersions(package, set) => { + Self::NoVersions(package, set, _) => { if set == &VS::full() { write!(f, "there is no available version for {}", package) } else { diff --git a/src/solver.rs b/src/solver.rs index 52fef570..a18bacc9 100644 --- a/src/solver.rs +++ b/src/solver.rs @@ -120,7 +120,8 @@ pub fn resolve( // Pick the next compatible version. let v = match decision { None => { - let inc = Incompatibility::no_versions(next.clone(), term_intersection.clone()); + let inc = + Incompatibility::no_versions(next.clone(), term_intersection.clone(), None); state.add_incompatibility(inc); continue; }