diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index ecb2324cbaa..256d2413d7f 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -64,9 +64,14 @@ use crate::core::resolver::{ self, HasDevUnits, Resolve, ResolveOpts, ResolveVersion, VersionOrdering, VersionPreferences, }; use crate::core::summary::Summary; -use crate::core::{ - GitReference, PackageId, PackageIdSpec, PackageIdSpecQuery, PackageSet, SourceId, Workspace, -}; +use crate::core::Dependency; +use crate::core::GitReference; +use crate::core::PackageId; +use crate::core::PackageIdSpec; +use crate::core::PackageIdSpecQuery; +use crate::core::PackageSet; +use crate::core::SourceId; +use crate::core::Workspace; use crate::ops; use crate::sources::PathSource; use crate::util::cache_lock::CacheLockMode; @@ -397,24 +402,7 @@ pub fn resolve_with_previous<'gctx>( }) .collect(); - let root_replace = ws.root_replace(); - - let replace = match previous { - Some(r) => root_replace - .iter() - .map(|(spec, dep)| { - for (&key, &val) in r.replacements().iter() { - if spec.matches(key) && dep.matches_id(val) && keep(&val) { - let mut dep = dep.clone(); - dep.lock_to(val); - return (spec.clone(), dep); - } - } - (spec.clone(), dep.clone()) - }) - .collect::>(), - None => root_replace.to_vec(), - }; + let replace = lock_replacements(ws, previous, &keep); let mut resolved = resolver::resolve( &summaries, @@ -909,3 +897,30 @@ fn register_patch_entries( Ok(avoid_patch_ids) } + +/// Locks each `[replace]` entry to a specific Package ID +/// if the lockfile contains any correspoding previous replacement. +fn lock_replacements( + ws: &Workspace<'_>, + previous: Option<&Resolve>, + keep: &dyn Fn(&PackageId) -> bool, +) -> Vec<(PackageIdSpec, Dependency)> { + let root_replace = ws.root_replace(); + let replace = match previous { + Some(r) => root_replace + .iter() + .map(|(spec, dep)| { + for (&key, &val) in r.replacements().iter() { + if spec.matches(key) && dep.matches_id(val) && keep(&val) { + let mut dep = dep.clone(); + dep.lock_to(val); + return (spec.clone(), dep); + } + } + (spec.clone(), dep.clone()) + }) + .collect::>(), + None => root_replace.to_vec(), + }; + replace +}