@@ -64,9 +64,14 @@ use crate::core::resolver::{
6464 self , HasDevUnits , Resolve , ResolveOpts , ResolveVersion , VersionOrdering , VersionPreferences ,
6565} ;
6666use 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 ;
7075use crate :: ops;
7176use crate :: sources:: PathSource ;
7277use crate :: util:: cache_lock:: CacheLockMode ;
@@ -397,24 +402,7 @@ pub fn resolve_with_previous<'gctx>(
397402 } )
398403 . collect ( ) ;
399404
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) ;
418406
419407 let mut resolved = resolver:: resolve (
420408 & summaries,
@@ -909,3 +897,30 @@ fn register_patch_entries(
909897
910898 Ok ( avoid_patch_ids)
911899}
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