Skip to content

Commit f6d8f9c

Browse files
committed
refactor: exact [replace] locking to a function
1 parent ab95ab4 commit f6d8f9c

File tree

1 file changed

+36
-21
lines changed

1 file changed

+36
-21
lines changed

src/cargo/ops/resolve.rs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,14 @@ use crate::core::resolver::{
6464
self, HasDevUnits, Resolve, ResolveOpts, ResolveVersion, VersionOrdering, VersionPreferences,
6565
};
6666
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;
7075
use crate::ops;
7176
use crate::sources::PathSource;
7277
use 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

Comments
 (0)