Skip to content

Commit c7baaeb

Browse files
committed
Add an UnusableDependencies incompatibility kind (#4)
1 parent fa65b1d commit c7baaeb

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

src/internal/incompatibility.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ pub enum Kind<P: Package, VS: VersionSet> {
4747
NoVersions(P, VS),
4848
/// Dependencies of the package are unavailable for versions in that range.
4949
UnavailableDependencies(P, VS),
50+
/// Dependencies of the package are unusable for versions in that range.
51+
UnusableDependencies(P, VS, Option<String>),
5052
/// Incompatibility coming from the dependencies of a given package.
5153
FromDependencyOf(P, VS, P, VS),
5254
/// Derived from two causes. Stores cause ids.
@@ -106,6 +108,17 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
106108
}
107109
}
108110

111+
/// Create an incompatibility to remember
112+
/// that a package version is not selectable
113+
/// because its dependencies are not usable.
114+
pub fn unusable_dependencies(package: P, version: VS::V, reason: Option<String>) -> Self {
115+
let set = VS::singleton(version);
116+
Self {
117+
package_terms: SmallMap::One([(package.clone(), Term::Positive(set.clone()))]),
118+
kind: Kind::UnusableDependencies(package, set, reason),
119+
}
120+
}
121+
109122
/// Build an incompatibility from a given dependency.
110123
pub fn from_dependency(package: P, versions: VS, dep: (&P, &VS)) -> Self {
111124
let (p2, set2) = dep;
@@ -249,6 +262,9 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
249262
Kind::UnavailableDependencies(package, set) => DerivationTree::External(
250263
External::UnavailableDependencies(package.clone(), set.clone()),
251264
),
265+
Kind::UnusableDependencies(package, set, reason) => DerivationTree::External(
266+
External::UnusableDependencies(package.clone(), set.clone(), reason.clone()),
267+
),
252268
Kind::FromDependencyOf(package, set, dep_package, dep_set) => {
253269
DerivationTree::External(External::FromDependencyOf(
254270
package.clone(),

src/range.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ impl<V> Range<V> {
118118
segments: SmallVec::one((Included(v1.into()), Excluded(v2.into()))),
119119
}
120120
}
121+
122+
pub fn is_empty(&self) -> bool {
123+
self.segments.is_empty()
124+
}
121125
}
122126

123127
impl<V: Clone> Range<V> {

src/report.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ pub enum External<P: Package, VS: VersionSet> {
4848
NoVersions(P, VS),
4949
/// Dependencies of the package are unavailable for versions in that set.
5050
UnavailableDependencies(P, VS),
51+
/// Dependencies of the package are unusable for versions in that set.
52+
UnusableDependencies(P, VS, Option<String>),
5153
/// Incompatibility coming from the dependencies of a given package.
5254
FromDependencyOf(P, VS, P, VS),
5355
}
@@ -120,6 +122,13 @@ impl<P: Package, VS: VersionSet> DerivationTree<P, VS> {
120122
DerivationTree::External(External::UnavailableDependencies(_, r)) => Some(
121123
DerivationTree::External(External::UnavailableDependencies(package, set.union(&r))),
122124
),
125+
DerivationTree::External(External::UnusableDependencies(_, r, reason)) => {
126+
Some(DerivationTree::External(External::UnusableDependencies(
127+
package,
128+
set.union(&r),
129+
reason,
130+
)))
131+
}
123132
DerivationTree::External(External::FromDependencyOf(p1, r1, p2, r2)) => {
124133
if p1 == package {
125134
Some(DerivationTree::External(External::FromDependencyOf(
@@ -165,6 +174,29 @@ impl<P: Package, VS: VersionSet> fmt::Display for External<P, VS> {
165174
)
166175
}
167176
}
177+
Self::UnusableDependencies(package, set, reason) => {
178+
if let Some(reason) = reason {
179+
if set == &VS::full() {
180+
write!(f, "dependencies of {} are unusable: {reason}", package)
181+
} else {
182+
write!(
183+
f,
184+
"dependencies of {} at version {} are unusable: {reason}",
185+
package, set
186+
)
187+
}
188+
} else {
189+
if set == &VS::full() {
190+
write!(f, "dependencies of {} are unusable", package)
191+
} else {
192+
write!(
193+
f,
194+
"dependencies of {} at version {} are unusable",
195+
package, set
196+
)
197+
}
198+
}
199+
}
168200
Self::FromDependencyOf(p, set_p, dep, set_dep) => {
169201
if set_p == &VS::full() && set_dep == &VS::full() {
170202
write!(f, "{} depends on {}", p, dep)

0 commit comments

Comments
 (0)