Skip to content

Commit ea31a2a

Browse files
committed
Add an UnusableDependencies incompatibility kind (#4)
1 parent 3347b6c commit ea31a2a

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
@@ -45,6 +45,8 @@ pub enum Kind<P: Package, VS: VersionSet> {
4545
NoVersions(P, VS),
4646
/// Dependencies of the package are unavailable for versions in that range.
4747
UnavailableDependencies(P, VS),
48+
/// Dependencies of the package are unusable for versions in that range.
49+
UnusableDependencies(P, VS, Option<String>),
4850
/// Incompatibility coming from the dependencies of a given package.
4951
FromDependencyOf(P, VS, P, VS),
5052
/// Derived from two causes. Stores cause ids.
@@ -104,6 +106,17 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
104106
}
105107
}
106108

109+
/// Create an incompatibility to remember
110+
/// that a package version is not selectable
111+
/// because its dependencies are not usable.
112+
pub fn unusable_dependencies(package: P, version: VS::V, reason: Option<String>) -> Self {
113+
let set = VS::singleton(version);
114+
Self {
115+
package_terms: SmallMap::One([(package.clone(), Term::Positive(set.clone()))]),
116+
kind: Kind::UnusableDependencies(package, set, reason),
117+
}
118+
}
119+
107120
/// Build an incompatibility from a given dependency.
108121
pub fn from_dependency(package: P, version: VS::V, dep: (&P, &VS)) -> Self {
109122
let set1 = VS::singleton(version);
@@ -206,6 +219,9 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
206219
Kind::UnavailableDependencies(package, set) => DerivationTree::External(
207220
External::UnavailableDependencies(package.clone(), set.clone()),
208221
),
222+
Kind::UnusableDependencies(package, set, reason) => DerivationTree::External(
223+
External::UnusableDependencies(package.clone(), set.clone(), reason.clone()),
224+
),
209225
Kind::FromDependencyOf(package, set, dep_package, dep_set) => {
210226
DerivationTree::External(External::FromDependencyOf(
211227
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
@@ -41,6 +41,8 @@ pub enum External<P: Package, VS: VersionSet> {
4141
NoVersions(P, VS),
4242
/// Dependencies of the package are unavailable for versions in that set.
4343
UnavailableDependencies(P, VS),
44+
/// Dependencies of the package are unusable for versions in that set.
45+
UnusableDependencies(P, VS, Option<String>),
4446
/// Incompatibility coming from the dependencies of a given package.
4547
FromDependencyOf(P, VS, P, VS),
4648
}
@@ -113,6 +115,13 @@ impl<P: Package, VS: VersionSet> DerivationTree<P, VS> {
113115
DerivationTree::External(External::UnavailableDependencies(_, r)) => Some(
114116
DerivationTree::External(External::UnavailableDependencies(package, set.union(&r))),
115117
),
118+
DerivationTree::External(External::UnusableDependencies(_, r, reason)) => {
119+
Some(DerivationTree::External(External::UnusableDependencies(
120+
package,
121+
set.union(&r),
122+
reason,
123+
)))
124+
}
116125
DerivationTree::External(External::FromDependencyOf(p1, r1, p2, r2)) => {
117126
if p1 == package {
118127
Some(DerivationTree::External(External::FromDependencyOf(
@@ -158,6 +167,29 @@ impl<P: Package, VS: VersionSet> fmt::Display for External<P, VS> {
158167
)
159168
}
160169
}
170+
Self::UnusableDependencies(package, set, reason) => {
171+
if let Some(reason) = reason {
172+
if set == &VS::full() {
173+
write!(f, "dependencies of {} are unusable: {reason}", package)
174+
} else {
175+
write!(
176+
f,
177+
"dependencies of {} at version {} are unusable: {reason}",
178+
package, set
179+
)
180+
}
181+
} else {
182+
if set == &VS::full() {
183+
write!(f, "dependencies of {} are unusable", package)
184+
} else {
185+
write!(
186+
f,
187+
"dependencies of {} at version {} are unusable",
188+
package, set
189+
)
190+
}
191+
}
192+
}
161193
Self::FromDependencyOf(p, set_p, dep, set_dep) => {
162194
if set_p == &VS::full() && set_dep == &VS::full() {
163195
write!(f, "{} depends on {}", p, dep)

0 commit comments

Comments
 (0)