@@ -17,7 +17,7 @@ use uv_normalize::PackageName;
17
17
18
18
use crate :: candidate_selector:: CandidateSelector ;
19
19
use crate :: python_requirement:: PythonRequirement ;
20
- use crate :: resolver:: { IncompletePackage , UnavailablePackage } ;
20
+ use crate :: resolver:: { IncompletePackage , UnavailablePackage , UnavailableReason } ;
21
21
22
22
use super :: PubGrubPackage ;
23
23
@@ -30,15 +30,20 @@ pub(crate) struct PubGrubReportFormatter<'a> {
30
30
pub ( crate ) python_requirement : Option < & ' a PythonRequirement > ,
31
31
}
32
32
33
- impl ReportFormatter < PubGrubPackage , Range < Version > > for PubGrubReportFormatter < ' _ > {
33
+ impl ReportFormatter < PubGrubPackage , Range < Version > , UnavailableReason >
34
+ for PubGrubReportFormatter < ' _ >
35
+ {
34
36
type Output = String ;
35
37
36
- fn format_external ( & self , external : & External < PubGrubPackage , Range < Version > > ) -> Self :: Output {
38
+ fn format_external (
39
+ & self ,
40
+ external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
41
+ ) -> Self :: Output {
37
42
match external {
38
43
External :: NotRoot ( package, version) => {
39
44
format ! ( "we are solving dependencies of {package} {version}" )
40
45
}
41
- External :: NoVersions ( package, set, reason ) => {
46
+ External :: NoVersions ( package, set) => {
42
47
if matches ! ( package, PubGrubPackage :: Python ( _) ) {
43
48
if let Some ( python) = self . python_requirement {
44
49
if python. target ( ) == python. installed ( ) {
@@ -79,16 +84,6 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
79
84
}
80
85
let set = self . simplify_set ( set, package) ;
81
86
82
- // Check for a reason
83
- if let Some ( reason) = reason {
84
- let formatted = if set. as_ref ( ) == & Range :: full ( ) {
85
- format ! ( "{package} {reason}" )
86
- } else {
87
- format ! ( "{package}{set} {reason}" )
88
- } ;
89
- return formatted;
90
- }
91
-
92
87
if set. as_ref ( ) == & Range :: full ( ) {
93
88
format ! ( "there are no versions of {package}" )
94
89
} else if set. as_singleton ( ) . is_some ( ) {
@@ -112,17 +107,26 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
112
107
}
113
108
}
114
109
}
115
- External :: Unavailable ( package, set, reason) => match package {
110
+ External :: Custom ( package, set, reason) => match package {
116
111
PubGrubPackage :: Root ( Some ( name) ) => {
117
112
format ! ( "{name} cannot be used because {reason}" )
118
113
}
119
114
PubGrubPackage :: Root ( None ) => {
120
115
format ! ( "your requirements cannot be used because {reason}" )
121
116
}
122
- _ => format ! (
123
- "{}is unusable because {reason}" ,
124
- Padded :: new( "" , & PackageRange :: compatibility( package, set) , " " )
125
- ) ,
117
+ _ => match reason {
118
+ UnavailableReason :: Package ( reason) => {
119
+ // While there may be a term attached, this error applies to the entire
120
+ // package, so we show it for the entire package
121
+ format ! ( "{}{reason}" , Padded :: new( "" , & package, " " ) )
122
+ }
123
+ UnavailableReason :: Version ( reason) => {
124
+ format ! (
125
+ "{}{reason}" ,
126
+ Padded :: new( "" , & PackageRange :: compatibility( package, set) , " " )
127
+ )
128
+ }
129
+ } ,
126
130
} ,
127
131
External :: FromDependencyOf ( package, package_set, dependency, dependency_set) => {
128
132
let package_set = self . simplify_set ( package_set, package) ;
@@ -198,8 +202,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
198
202
/// Simplest case, we just combine two external incompatibilities.
199
203
fn explain_both_external (
200
204
& self ,
201
- external1 : & External < PubGrubPackage , Range < Version > > ,
202
- external2 : & External < PubGrubPackage , Range < Version > > ,
205
+ external1 : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
206
+ external2 : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
203
207
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
204
208
) -> String {
205
209
let external = self . format_both_external ( external1, external2) ;
@@ -216,9 +220,9 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
216
220
fn explain_both_ref (
217
221
& self ,
218
222
ref_id1 : usize ,
219
- derived1 : & Derived < PubGrubPackage , Range < Version > > ,
223
+ derived1 : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
220
224
ref_id2 : usize ,
221
- derived2 : & Derived < PubGrubPackage , Range < Version > > ,
225
+ derived2 : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
222
226
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
223
227
) -> String {
224
228
// TODO: order should be chosen to make it more logical.
@@ -243,8 +247,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
243
247
fn explain_ref_and_external (
244
248
& self ,
245
249
ref_id : usize ,
246
- derived : & Derived < PubGrubPackage , Range < Version > > ,
247
- external : & External < PubGrubPackage , Range < Version > > ,
250
+ derived : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
251
+ external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
248
252
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
249
253
) -> String {
250
254
// TODO: order should be chosen to make it more logical.
@@ -265,7 +269,7 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
265
269
/// Add an external cause to the chain of explanations.
266
270
fn and_explain_external (
267
271
& self ,
268
- external : & External < PubGrubPackage , Range < Version > > ,
272
+ external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
269
273
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
270
274
) -> String {
271
275
let external = self . format_external ( external) ;
@@ -282,7 +286,7 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
282
286
fn and_explain_ref (
283
287
& self ,
284
288
ref_id : usize ,
285
- derived : & Derived < PubGrubPackage , Range < Version > > ,
289
+ derived : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
286
290
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
287
291
) -> String {
288
292
let derived = self . format_terms ( & derived. terms ) ;
@@ -299,8 +303,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
299
303
/// Add an already explained incompat to the chain of explanations.
300
304
fn and_explain_prior_and_external (
301
305
& self ,
302
- prior_external : & External < PubGrubPackage , Range < Version > > ,
303
- external : & External < PubGrubPackage , Range < Version > > ,
306
+ prior_external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
307
+ external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
304
308
current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
305
309
) -> String {
306
310
let external = self . format_both_external ( prior_external, external) ;
@@ -318,8 +322,8 @@ impl PubGrubReportFormatter<'_> {
318
322
/// Format two external incompatibilities, combining them if possible.
319
323
fn format_both_external (
320
324
& self ,
321
- external1 : & External < PubGrubPackage , Range < Version > > ,
322
- external2 : & External < PubGrubPackage , Range < Version > > ,
325
+ external1 : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
326
+ external2 : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
323
327
) -> String {
324
328
match ( external1, external2) {
325
329
(
@@ -387,7 +391,7 @@ impl PubGrubReportFormatter<'_> {
387
391
/// their requirements.
388
392
pub ( crate ) fn hints (
389
393
& self ,
390
- derivation_tree : & DerivationTree < PubGrubPackage , Range < Version > > ,
394
+ derivation_tree : & DerivationTree < PubGrubPackage , Range < Version > , UnavailableReason > ,
391
395
selector : & Option < CandidateSelector > ,
392
396
index_locations : & Option < IndexLocations > ,
393
397
unavailable_packages : & FxHashMap < PackageName , UnavailablePackage > ,
@@ -404,7 +408,7 @@ impl PubGrubReportFormatter<'_> {
404
408
let mut hints = IndexSet :: default ( ) ;
405
409
match derivation_tree {
406
410
DerivationTree :: External ( external) => match external {
407
- External :: Unavailable ( package, set, _) | External :: NoVersions ( package, set, _ ) => {
411
+ External :: Custom ( package, set, _) | External :: NoVersions ( package, set) => {
408
412
// Check for no versions due to pre-release options
409
413
if let Some ( selector) = selector {
410
414
let any_prerelease = set. iter ( ) . any ( |( start, end) | {
0 commit comments