@@ -64,9 +64,14 @@ use crate::core::resolver::{
64
64
self , HasDevUnits , Resolve , ResolveOpts , ResolveVersion , VersionOrdering , VersionPreferences ,
65
65
} ;
66
66
use crate :: core:: summary:: Summary ;
67
- use crate :: core:: {
68
- GitReference , PackageId , PackageIdSpec , PackageIdSpecQuery , PackageSet , SourceId , Workspace ,
69
- } ;
67
+ use crate :: core:: Dependency ;
68
+ use crate :: core:: GitReference ;
69
+ use crate :: core:: PackageId ;
70
+ use crate :: core:: PackageIdSpec ;
71
+ use crate :: core:: PackageIdSpecQuery ;
72
+ use crate :: core:: PackageSet ;
73
+ use crate :: core:: SourceId ;
74
+ use crate :: core:: Workspace ;
70
75
use crate :: ops;
71
76
use crate :: sources:: PathSource ;
72
77
use crate :: util:: cache_lock:: CacheLockMode ;
@@ -397,24 +402,7 @@ pub fn resolve_with_previous<'gctx>(
397
402
} )
398
403
. collect ( ) ;
399
404
400
- let root_replace = ws. root_replace ( ) ;
401
-
402
- let replace = match previous {
403
- Some ( r) => root_replace
404
- . iter ( )
405
- . map ( |( spec, dep) | {
406
- for ( & key, & val) in r. replacements ( ) . iter ( ) {
407
- if spec. matches ( key) && dep. matches_id ( val) && keep ( & val) {
408
- let mut dep = dep. clone ( ) ;
409
- dep. lock_to ( val) ;
410
- return ( spec. clone ( ) , dep) ;
411
- }
412
- }
413
- ( spec. clone ( ) , dep. clone ( ) )
414
- } )
415
- . collect :: < Vec < _ > > ( ) ,
416
- None => root_replace. to_vec ( ) ,
417
- } ;
405
+ let replace = lock_replacements ( ws, previous, & keep) ;
418
406
419
407
let mut resolved = resolver:: resolve (
420
408
& summaries,
@@ -909,3 +897,30 @@ fn register_patch_entries(
909
897
910
898
Ok ( avoid_patch_ids)
911
899
}
900
+
901
+ /// Locks each `[replace]` entry to a specific Package ID
902
+ /// if the lockfile contains any correspoding previous replacement.
903
+ fn lock_replacements (
904
+ ws : & Workspace < ' _ > ,
905
+ previous : Option < & Resolve > ,
906
+ keep : & dyn Fn ( & PackageId ) -> bool ,
907
+ ) -> Vec < ( PackageIdSpec , Dependency ) > {
908
+ let root_replace = ws. root_replace ( ) ;
909
+ let replace = match previous {
910
+ Some ( r) => root_replace
911
+ . iter ( )
912
+ . map ( |( spec, dep) | {
913
+ for ( & key, & val) in r. replacements ( ) . iter ( ) {
914
+ if spec. matches ( key) && dep. matches_id ( val) && keep ( & val) {
915
+ let mut dep = dep. clone ( ) ;
916
+ dep. lock_to ( val) ;
917
+ return ( spec. clone ( ) , dep) ;
918
+ }
919
+ }
920
+ ( spec. clone ( ) , dep. clone ( ) )
921
+ } )
922
+ . collect :: < Vec < _ > > ( ) ,
923
+ None => root_replace. to_vec ( ) ,
924
+ } ;
925
+ replace
926
+ }
0 commit comments