@@ -229,9 +229,7 @@ impl NoSolutionError {
229
229
/// The `[max]` sentinel is used to represent the maximum local version of a package, to
230
230
/// implement PEP 440 semantics for local version equality. For example, `1.0.0+foo` needs to
231
231
/// satisfy `==1.0.0`.
232
- pub ( crate ) fn simplify_local_version_segments (
233
- mut derivation_tree : ErrorTree ,
234
- ) -> Option < ErrorTree > {
232
+ pub ( crate ) fn collapse_local_version_segments ( derivation_tree : ErrorTree ) -> ErrorTree {
235
233
/// Remove local versions sentinels (`+[max]`) from the given version ranges.
236
234
fn strip_sentinel ( versions : & mut Ranges < Version > ) {
237
235
versions. iter_mut ( ) . for_each ( |( lower, upper) | {
@@ -321,58 +319,62 @@ impl NoSolutionError {
321
319
} )
322
320
}
323
321
324
- match derivation_tree {
325
- DerivationTree :: External ( External :: NotRoot ( _, _) ) => Some ( derivation_tree) ,
326
- DerivationTree :: External ( External :: NoVersions ( _, ref mut versions) ) => {
327
- if is_sentinel ( versions) {
328
- None
329
- } else {
322
+ fn collapse ( mut derivation_tree : ErrorTree ) -> Option < ErrorTree > {
323
+ match derivation_tree {
324
+ DerivationTree :: External ( External :: NotRoot ( _, _) ) => Some ( derivation_tree) ,
325
+ DerivationTree :: External ( External :: NoVersions ( _, ref mut versions) ) => {
326
+ if is_sentinel ( versions) {
327
+ return None ;
328
+ }
329
+
330
330
strip_sentinel ( versions) ;
331
331
Some ( derivation_tree)
332
332
}
333
- }
334
- DerivationTree :: External ( External :: FromDependencyOf (
335
- _ ,
336
- ref mut versions1 ,
337
- _ ,
338
- ref mut versions2 ,
339
- ) ) => {
340
- strip_sentinel ( versions1 ) ;
341
- strip_sentinel ( versions2 ) ;
342
- Some ( derivation_tree )
343
- }
344
- DerivationTree :: External ( External :: Custom ( _ , ref mut versions , _ ) ) => {
345
- strip_sentinel ( versions ) ;
346
- Some ( derivation_tree )
347
- }
348
- DerivationTree :: Derived ( mut derived ) => {
349
- let cause1 = Self :: simplify_local_version_segments ( ( * derived. cause1 ) . clone ( ) ) ;
350
- let cause2 = Self :: simplify_local_version_segments ( ( * derived . cause2 ) . clone ( ) ) ;
351
- match ( cause1, cause2) {
352
- ( Some ( cause1 ) , Some ( cause2 ) ) => Some ( DerivationTree :: Derived ( Derived {
353
- cause1 : Arc :: new ( cause1 ) ,
354
- cause2 : Arc :: new ( cause2 ) ,
355
- terms : std :: mem :: take ( & mut derived . terms )
356
- . into_iter ( )
357
- . map ( | ( pkg , mut term) | {
358
- match & mut term {
359
- Term :: Positive ( versions) => {
360
- strip_sentinel ( versions ) ;
361
- }
362
- Term :: Negative ( versions) => {
363
- strip_sentinel ( versions ) ;
333
+ DerivationTree :: External ( External :: FromDependencyOf (
334
+ _ ,
335
+ ref mut versions1 ,
336
+ _ ,
337
+ ref mut versions2 ,
338
+ ) ) => {
339
+ strip_sentinel ( versions1 ) ;
340
+ strip_sentinel ( versions2 ) ;
341
+ Some ( derivation_tree )
342
+ }
343
+ DerivationTree :: External ( External :: Custom ( _ , ref mut versions , _ ) ) => {
344
+ strip_sentinel ( versions ) ;
345
+ Some ( derivation_tree )
346
+ }
347
+ DerivationTree :: Derived ( mut derived ) => {
348
+ let cause1 = collapse ( ( * derived . cause1 ) . clone ( ) ) ;
349
+ let cause2 = collapse ( ( * derived. cause2 ) . clone ( ) ) ;
350
+ match ( cause1 , cause2) {
351
+ ( Some ( cause1) , Some ( cause2) ) => Some ( DerivationTree :: Derived ( Derived {
352
+ cause1 : Arc :: new ( cause1 ) ,
353
+ cause2 : Arc :: new ( cause2 ) ,
354
+ terms : std :: mem :: take ( & mut derived . terms )
355
+ . into_iter ( )
356
+ . map ( | ( pkg , mut term ) | {
357
+ match & mut term {
358
+ Term :: Positive ( versions ) => {
359
+ strip_sentinel ( versions) ;
360
+ }
361
+ Term :: Negative ( versions ) => {
362
+ strip_sentinel ( versions) ;
363
+ }
364
364
}
365
- }
366
- ( pkg , term )
367
- } )
368
- . collect ( ) ,
369
- shared_id : derived . shared_id ,
370
- } ) ) ,
371
- ( Some ( cause ) , None ) | ( None , Some ( cause ) ) => Some ( cause ) ,
372
- _ => None ,
365
+ ( pkg , term )
366
+ } )
367
+ . collect ( ) ,
368
+ shared_id : derived . shared_id ,
369
+ } ) ) ,
370
+ ( Some ( cause ) , None ) | ( None , Some ( cause ) ) => Some ( cause ) ,
371
+ _ => None ,
372
+ }
373
373
}
374
374
}
375
375
}
376
+
377
+ collapse ( derivation_tree) . expect ( "derivation tree should contain at least one term" )
376
378
}
377
379
378
380
/// Initialize a [`NoSolutionHeader`] for this error.
@@ -403,7 +405,6 @@ impl std::fmt::Display for NoSolutionError {
403
405
display_tree ( & tree, "Resolver derivation tree before reduction" ) ;
404
406
}
405
407
406
- // simplify_local_version_segments(&mut tree);
407
408
collapse_no_versions_of_workspace_members ( & mut tree, & self . workspace_members ) ;
408
409
409
410
if self . workspace_members . len ( ) == 1 {
0 commit comments