@@ -17,7 +17,7 @@ use uv_normalize::PackageName;
1717
1818use crate :: candidate_selector:: CandidateSelector ;
1919use crate :: python_requirement:: PythonRequirement ;
20- use crate :: resolver:: { IncompletePackage , UnavailablePackage } ;
20+ use crate :: resolver:: { IncompletePackage , UnavailablePackage , UnavailableReason } ;
2121
2222use super :: PubGrubPackage ;
2323
@@ -30,15 +30,20 @@ pub(crate) struct PubGrubReportFormatter<'a> {
3030 pub ( crate ) python_requirement : Option < & ' a PythonRequirement > ,
3131}
3232
33- impl ReportFormatter < PubGrubPackage , Range < Version > > for PubGrubReportFormatter < ' _ > {
33+ impl ReportFormatter < PubGrubPackage , Range < Version > , UnavailableReason >
34+ for PubGrubReportFormatter < ' _ >
35+ {
3436 type Output = String ;
3537
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 {
3742 match external {
3843 External :: NotRoot ( package, version) => {
3944 format ! ( "we are solving dependencies of {package} {version}" )
4045 }
41- External :: NoVersions ( package, set, reason ) => {
46+ External :: NoVersions ( package, set) => {
4247 if matches ! ( package, PubGrubPackage :: Python ( _) ) {
4348 if let Some ( python) = self . python_requirement {
4449 if python. target ( ) == python. installed ( ) {
@@ -79,16 +84,6 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
7984 }
8085 let set = self . simplify_set ( set, package) ;
8186
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-
9287 if set. as_ref ( ) == & Range :: full ( ) {
9388 format ! ( "there are no versions of {package}" )
9489 } else if set. as_singleton ( ) . is_some ( ) {
@@ -112,17 +107,26 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
112107 }
113108 }
114109 }
115- External :: Unavailable ( package, set, reason) => match package {
110+ External :: Custom ( package, set, reason) => match package {
116111 PubGrubPackage :: Root ( Some ( name) ) => {
117112 format ! ( "{name} cannot be used because {reason}" )
118113 }
119114 PubGrubPackage :: Root ( None ) => {
120115 format ! ( "your requirements cannot be used because {reason}" )
121116 }
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+ } ,
126130 } ,
127131 External :: FromDependencyOf ( package, package_set, dependency, dependency_set) => {
128132 let package_set = self . simplify_set ( package_set, package) ;
@@ -198,8 +202,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
198202 /// Simplest case, we just combine two external incompatibilities.
199203 fn explain_both_external (
200204 & 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 > ,
203207 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
204208 ) -> String {
205209 let external = self . format_both_external ( external1, external2) ;
@@ -216,9 +220,9 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
216220 fn explain_both_ref (
217221 & self ,
218222 ref_id1 : usize ,
219- derived1 : & Derived < PubGrubPackage , Range < Version > > ,
223+ derived1 : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
220224 ref_id2 : usize ,
221- derived2 : & Derived < PubGrubPackage , Range < Version > > ,
225+ derived2 : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
222226 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
223227 ) -> String {
224228 // TODO: order should be chosen to make it more logical.
@@ -243,8 +247,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
243247 fn explain_ref_and_external (
244248 & self ,
245249 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 > ,
248252 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
249253 ) -> String {
250254 // TODO: order should be chosen to make it more logical.
@@ -265,7 +269,7 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
265269 /// Add an external cause to the chain of explanations.
266270 fn and_explain_external (
267271 & self ,
268- external : & External < PubGrubPackage , Range < Version > > ,
272+ external : & External < PubGrubPackage , Range < Version > , UnavailableReason > ,
269273 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
270274 ) -> String {
271275 let external = self . format_external ( external) ;
@@ -282,7 +286,7 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
282286 fn and_explain_ref (
283287 & self ,
284288 ref_id : usize ,
285- derived : & Derived < PubGrubPackage , Range < Version > > ,
289+ derived : & Derived < PubGrubPackage , Range < Version > , UnavailableReason > ,
286290 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
287291 ) -> String {
288292 let derived = self . format_terms ( & derived. terms ) ;
@@ -299,8 +303,8 @@ impl ReportFormatter<PubGrubPackage, Range<Version>> for PubGrubReportFormatter<
299303 /// Add an already explained incompat to the chain of explanations.
300304 fn and_explain_prior_and_external (
301305 & 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 > ,
304308 current_terms : & Map < PubGrubPackage , Term < Range < Version > > > ,
305309 ) -> String {
306310 let external = self . format_both_external ( prior_external, external) ;
@@ -318,8 +322,8 @@ impl PubGrubReportFormatter<'_> {
318322 /// Format two external incompatibilities, combining them if possible.
319323 fn format_both_external (
320324 & 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 > ,
323327 ) -> String {
324328 match ( external1, external2) {
325329 (
@@ -387,7 +391,7 @@ impl PubGrubReportFormatter<'_> {
387391 /// their requirements.
388392 pub ( crate ) fn hints (
389393 & self ,
390- derivation_tree : & DerivationTree < PubGrubPackage , Range < Version > > ,
394+ derivation_tree : & DerivationTree < PubGrubPackage , Range < Version > , UnavailableReason > ,
391395 selector : & Option < CandidateSelector > ,
392396 index_locations : & Option < IndexLocations > ,
393397 unavailable_packages : & FxHashMap < PackageName , UnavailablePackage > ,
@@ -404,7 +408,7 @@ impl PubGrubReportFormatter<'_> {
404408 let mut hints = IndexSet :: default ( ) ;
405409 match derivation_tree {
406410 DerivationTree :: External ( external) => match external {
407- External :: Unavailable ( package, set, _) | External :: NoVersions ( package, set, _ ) => {
411+ External :: Custom ( package, set, _) | External :: NoVersions ( package, set) => {
408412 // Check for no versions due to pre-release options
409413 if let Some ( selector) = selector {
410414 let any_prerelease = set. iter ( ) . any ( |( start, end) | {
0 commit comments