Skip to content

Commit f9835bb

Browse files
zaniebkonstin
authored andcommitted
Consolidate UnusableDependencies into a generic Unavailable incompatibility (#20)
* Consolidate `UnusableDependencies` into a generic `Unavailable` incompatibility * Docs
1 parent aee1e86 commit f9835bb

File tree

8 files changed

+46
-99
lines changed

8 files changed

+46
-99
lines changed

examples/caching_dependency_provider.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,18 @@ impl<P: Package, VS: VersionSet, DP: DependencyProvider<P, VS>> DependencyProvid
3939
) -> Result<Dependencies<P, VS>, DP::Err> {
4040
let mut cache = self.cached_dependencies.borrow_mut();
4141
match cache.get_dependencies(package, version) {
42-
Ok(Dependencies::Unknown) => {
42+
Ok(Dependencies::Unavailable) => {
4343
let dependencies = self.remote_dependencies.get_dependencies(package, version);
4444
match dependencies {
45-
Ok(Dependencies::Known(dependencies)) => {
45+
Ok(Dependencies::Available(dependencies)) => {
4646
cache.add_dependencies(
4747
package.clone(),
4848
version.clone(),
4949
dependencies.clone(),
5050
);
51-
Ok(Dependencies::Known(dependencies))
51+
Ok(Dependencies::Available(dependencies))
5252
}
53-
Ok(Dependencies::Unknown) => Ok(Dependencies::Unknown),
53+
Ok(Dependencies::Unavailable) => Ok(Dependencies::Unavailable),
5454
error @ Err(_) => error,
5555
}
5656
}

examples/unsat_root_message_no_version.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,11 @@ impl ReportFormatter<Package, Range<SemanticVersion>> for CustomReportFormatter
7373
format!("there is no version of {package} in {set}")
7474
}
7575
}
76-
External::UnavailableDependencies(package, set) => {
76+
External::Unavailable(package, set, reason) => {
7777
if set == &Range::full() {
78-
format!("dependencies of {package} are unavailable")
78+
format!("dependencies of {package} are unavailable because {reason}")
7979
} else {
80-
format!("dependencies of {package} at version {set} are unavailable")
81-
}
82-
}
83-
External::UnusableDependencies(package, set, ..) => {
84-
if set == &Range::full() {
85-
format!("dependencies of {package} are unusable")
86-
} else {
87-
format!("dependencies of {package} at version {set} are unusable")
80+
format!("dependencies of {package} at version {set} are unavailable because {reason}")
8881
}
8982
}
9083
External::FromDependencyOf(package, package_set, dependency, dependency_set) => {

src/internal/incompatibility.rs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ pub enum Kind<P: Package, VS: VersionSet> {
4848
NotRoot(P, VS::V),
4949
/// There are no versions in the given range for this package.
5050
NoVersions(P, VS),
51-
/// Dependencies of the package are unavailable for versions in that range.
52-
UnavailableDependencies(P, VS),
53-
/// Dependencies of the package are unusable for versions in that range.
54-
UnusableDependencies(P, VS, Option<String>),
51+
/// The package is unavailable for versions in the range. A string reason is included.
52+
Unavailable(P, VS, String),
5553
/// Incompatibility coming from the dependencies of a given package.
5654
FromDependencyOf(P, VS, P, VS),
5755
/// Derived from two causes. Stores cause ids.
@@ -102,23 +100,11 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
102100

103101
/// Create an incompatibility to remember
104102
/// that a package version is not selectable
105-
/// because its list of dependencies is unavailable.
106-
pub fn unavailable_dependencies(package: P, version: VS::V) -> Self {
103+
pub fn unavailable(package: P, version: VS::V, reason: String) -> Self {
107104
let set = VS::singleton(version);
108105
Self {
109106
package_terms: SmallMap::One([(package.clone(), Term::Positive(set.clone()))]),
110-
kind: Kind::UnavailableDependencies(package, set),
111-
}
112-
}
113-
114-
/// Create an incompatibility to remember
115-
/// that a package version is not selectable
116-
/// because its dependencies are not usable.
117-
pub fn unusable_dependencies(package: P, version: VS::V, reason: Option<String>) -> Self {
118-
let set = VS::singleton(version);
119-
Self {
120-
package_terms: SmallMap::One([(package.clone(), Term::Positive(set.clone()))]),
121-
kind: Kind::UnusableDependencies(package, set, reason),
107+
kind: Kind::Unavailable(package, set, reason),
122108
}
123109
}
124110

@@ -271,11 +257,8 @@ impl<P: Package, VS: VersionSet> Incompatibility<P, VS> {
271257
Kind::NoVersions(package, set) => {
272258
DerivationTree::External(External::NoVersions(package, set))
273259
}
274-
Kind::UnavailableDependencies(package, set) => {
275-
DerivationTree::External(External::UnavailableDependencies(package, set))
276-
}
277-
Kind::UnusableDependencies(package, set, reason) => {
278-
DerivationTree::External(External::UnusableDependencies(package, set, reason))
260+
Kind::Unavailable(package, set, reason) => {
261+
DerivationTree::External(External::Unavailable(package, set, reason))
279262
}
280263
Kind::FromDependencyOf(package, set, dep_package, dep_set) => DerivationTree::External(
281264
External::FromDependencyOf(package, set, dep_package, dep_set),
@@ -346,12 +329,12 @@ pub mod tests {
346329
let mut store = Arena::new();
347330
let i1 = store.alloc(Incompatibility {
348331
package_terms: SmallMap::Two([("p1", t1.clone()), ("p2", t2.negate())]),
349-
kind: Kind::UnavailableDependencies("0", Range::full())
332+
kind: Kind::Unavailable("0", Range::full(), "foo".to_string())
350333
});
351334

352335
let i2 = store.alloc(Incompatibility {
353336
package_terms: SmallMap::Two([("p2", t2), ("p3", t3.clone())]),
354-
kind: Kind::UnavailableDependencies("0", Range::full())
337+
kind: Kind::Unavailable("0", Range::full(), "bar".to_string())
355338
});
356339

357340
let mut i3 = Map::default();

src/report.rs

Lines changed: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,8 @@ pub enum External<P: Package, VS: VersionSet> {
4949
NotRoot(P, VS::V),
5050
/// There are no versions in the given set for this package.
5151
NoVersions(P, VS),
52-
/// Dependencies of the package are unavailable for versions in that set.
53-
UnavailableDependencies(P, VS),
54-
/// Dependencies of the package are unusable for versions in that set.
55-
UnusableDependencies(P, VS, Option<String>),
52+
/// The package is unusable in the given set. A string reason is included.
53+
Unavailable(P, VS, String),
5654
/// Incompatibility coming from the dependencies of a given package.
5755
FromDependencyOf(P, VS, P, VS),
5856
}
@@ -86,8 +84,7 @@ impl<P: Package, VS: VersionSet> DerivationTree<P, VS> {
8684
}
8785
External::NoVersions(p, _)
8886
| External::NotRoot(p, _)
89-
| External::UnavailableDependencies(p, _)
90-
| External::UnusableDependencies(p, ..) => {
87+
| External::Unavailable(p, ..) => {
9188
packages.insert(p);
9289
}
9390
},
@@ -150,16 +147,8 @@ impl<P: Package, VS: VersionSet> DerivationTree<P, VS> {
150147
DerivationTree::External(External::NoVersions(_, r)) => Some(DerivationTree::External(
151148
External::NoVersions(package, set.union(&r)),
152149
)),
153-
DerivationTree::External(External::UnavailableDependencies(_, r)) => Some(
154-
DerivationTree::External(External::UnavailableDependencies(package, set.union(&r))),
155-
),
156-
DerivationTree::External(External::UnusableDependencies(_, r, reason)) => {
157-
Some(DerivationTree::External(External::UnusableDependencies(
158-
package,
159-
set.union(&r),
160-
reason,
161-
)))
162-
}
150+
// Cannot be merged because the reason may not match
151+
DerivationTree::External(External::Unavailable(_, _, _)) => None,
163152
DerivationTree::External(External::FromDependencyOf(p1, r1, p2, r2)) => {
164153
if p1 == package {
165154
Some(DerivationTree::External(External::FromDependencyOf(
@@ -194,40 +183,21 @@ impl<P: Package, VS: VersionSet> fmt::Display for External<P, VS> {
194183
write!(f, "there is no version of {} in {}", package, set)
195184
}
196185
}
197-
Self::UnavailableDependencies(package, set) => {
186+
Self::Unavailable(package, set, reason) => {
198187
if set == &VS::full() {
199-
write!(f, "dependencies of {} are unavailable", package)
188+
write!(
189+
f,
190+
"dependencies of {} are unavailable because {reason}",
191+
package
192+
)
200193
} else {
201194
write!(
202195
f,
203-
"dependencies of {} at version {} are unavailable",
196+
"dependencies of {} at version {} are unavailable because {reason}",
204197
package, set
205198
)
206199
}
207200
}
208-
Self::UnusableDependencies(package, set, reason) => {
209-
if let Some(reason) = reason {
210-
if set == &VS::full() {
211-
write!(f, "dependencies of {} are unusable: {reason}", package)
212-
} else {
213-
write!(
214-
f,
215-
"dependencies of {} at version {} are unusable: {reason}",
216-
package, set
217-
)
218-
}
219-
} else {
220-
if set == &VS::full() {
221-
write!(f, "dependencies of {} are unusable", package)
222-
} else {
223-
write!(
224-
f,
225-
"dependencies of {} at version {} are unusable",
226-
package, set
227-
)
228-
}
229-
}
230-
}
231201
Self::FromDependencyOf(p, set_p, dep, set_dep) => {
232202
if set_p == &VS::full() && set_dep == &VS::full() {
233203
write!(f, "{} depends on {}", p, dep)

src/solver.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,20 +158,21 @@ pub fn resolve<P: Package, VS: VersionSet, DP: DependencyProvider<P, VS>>(
158158
})?;
159159

160160
let known_dependencies = match dependencies {
161-
Dependencies::Unknown => {
162-
state.add_incompatibility(Incompatibility::unavailable_dependencies(
161+
Dependencies::Unavailable => {
162+
state.add_incompatibility(Incompatibility::unavailable(
163163
p.clone(),
164164
v.clone(),
165+
"its dependencies could not be determined".to_string(),
165166
));
166167
continue;
167168
}
168-
Dependencies::Known(x) if x.contains_key(p) => {
169+
Dependencies::Available(x) if x.contains_key(p) => {
169170
return Err(PubGrubError::SelfDependency {
170171
package: p.clone(),
171172
version: v,
172173
});
173174
}
174-
Dependencies::Known(x) => x,
175+
Dependencies::Available(x) => x,
175176
};
176177

177178
// Add that package and version if the dependencies are not problematic.
@@ -201,9 +202,9 @@ pub fn resolve<P: Package, VS: VersionSet, DP: DependencyProvider<P, VS>>(
201202
#[derive(Clone)]
202203
pub enum Dependencies<P: Package, VS: VersionSet> {
203204
/// Package dependencies are unavailable.
204-
Unknown,
205+
Unavailable,
205206
/// Container for all available package versions.
206-
Known(DependencyConstraints<P, VS>),
207+
Available(DependencyConstraints<P, VS>),
207208
}
208209

209210
/// Trait that allows the algorithm to retrieve available packages and their dependencies.
@@ -254,7 +255,7 @@ pub trait DependencyProvider<P: Package, VS: VersionSet> {
254255
fn choose_version(&self, package: &P, range: &VS) -> Result<Option<VS::V>, Self::Err>;
255256

256257
/// Retrieves the package dependencies.
257-
/// Return [Dependencies::Unknown] if its dependencies are unknown.
258+
/// Return [Dependencies::Unavailable] if its dependencies are not available.
258259
fn get_dependencies(
259260
&self,
260261
package: &P,
@@ -369,8 +370,8 @@ impl<P: Package, VS: VersionSet> DependencyProvider<P, VS> for OfflineDependency
369370
version: &VS::V,
370371
) -> Result<Dependencies<P, VS>, Infallible> {
371372
Ok(match self.dependencies(package, version) {
372-
None => Dependencies::Unknown,
373-
Some(dependencies) => Dependencies::Known(dependencies),
373+
None => Dependencies::Unavailable,
374+
Some(dependencies) => Dependencies::Available(dependencies),
374375
})
375376
}
376377
}

src/type_aliases.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub type SelectedDependencies<P, V> = Map<P, V>;
1414

1515
/// Holds information about all possible versions a given package can accept.
1616
/// There is a difference in semantics between an empty map
17-
/// inside [DependencyConstraints] and [Dependencies::Unknown](crate::solver::Dependencies::Unknown):
17+
/// inside [DependencyConstraints] and [Dependencies::Unavailable](crate::solver::Dependencies::Unavailable):
1818
/// the former means the package has no dependency and it is a known fact,
1919
/// while the latter means they could not be fetched by the [DependencyProvider](crate::solver::DependencyProvider).
2020
pub type DependencyConstraints<P, VS> = Map<P, VS>;

tests/proptest.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,8 @@ fn retain_versions<N: Package + Ord, VS: VersionSet>(
309309
continue;
310310
}
311311
let deps = match dependency_provider.get_dependencies(n, v).unwrap() {
312-
Dependencies::Unknown => panic!(),
313-
Dependencies::Known(deps) => deps,
312+
Dependencies::Unavailable => panic!(),
313+
Dependencies::Available(deps) => deps,
314314
};
315315
smaller_dependency_provider.add_dependencies(n.clone(), v.clone(), deps)
316316
}
@@ -333,8 +333,8 @@ fn retain_dependencies<N: Package + Ord, VS: VersionSet>(
333333
for n in dependency_provider.packages() {
334334
for v in dependency_provider.versions(n).unwrap() {
335335
let deps = match dependency_provider.get_dependencies(n, v).unwrap() {
336-
Dependencies::Unknown => panic!(),
337-
Dependencies::Known(deps) => deps,
336+
Dependencies::Unavailable => panic!(),
337+
Dependencies::Available(deps) => deps,
338338
};
339339
smaller_dependency_provider.add_dependencies(
340340
n.clone(),
@@ -504,8 +504,8 @@ proptest! {
504504
.get_dependencies(package, version)
505505
.unwrap()
506506
{
507-
Dependencies::Unknown => panic!(),
508-
Dependencies::Known(d) => d.into_iter().collect(),
507+
Dependencies::Unavailable => panic!(),
508+
Dependencies::Available(d) => d.into_iter().collect(),
509509
};
510510
if !dependencies.is_empty() {
511511
to_remove.insert((package, **version, dep_idx.get(&dependencies).0));

tests/sat_dependency_provider.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ impl<P: Package, VS: VersionSet> SatResolve<P, VS> {
6868
// active packages need each of there `deps` to be satisfied
6969
for (p, v, var) in &all_versions {
7070
let deps = match dp.get_dependencies(p, v).unwrap() {
71-
Dependencies::Unknown => panic!(),
72-
Dependencies::Known(d) => d,
71+
Dependencies::Unavailable => panic!(),
72+
Dependencies::Available(d) => d,
7373
};
7474
for (p1, range) in &deps {
7575
let empty_vec = vec![];

0 commit comments

Comments
 (0)