diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs
index c6f71847df38..e7da702dbc6d 100644
--- a/src/cargo/ops/cargo_add/mod.rs
+++ b/src/cargo/ops/cargo_add/mod.rs
@@ -361,7 +361,9 @@ fn resolve_dependency(
};
selected_dep = populate_dependency(selected_dep, arg);
- let old_dep = get_existing_dependency(manifest, selected_dep.toml_key(), section)?;
+ let lookup = |dep_key: &_| get_existing_dependency(manifest, dep_key, section);
+ let old_dep = fuzzy_lookup(&mut selected_dep, lookup, gctx)?;
+
let mut dependency = if let Some(mut old_dep) = old_dep.clone() {
if old_dep.name != selected_dep.name {
// Assuming most existing keys are not relevant when the package changes
@@ -383,7 +385,8 @@ fn resolve_dependency(
if dependency.source().is_none() {
// Checking for a workspace dependency happens first since a member could be specified
// in the workspace dependencies table as a dependency
- if let Some(_dep) = find_workspace_dep(dependency.toml_key(), ws.root_manifest()).ok() {
+ let lookup = |toml_key: &_| Ok(find_workspace_dep(toml_key, ws.root_manifest()).ok());
+ if let Some(_dep) = fuzzy_lookup(&mut dependency, lookup, gctx)? {
dependency = dependency.set_source(WorkspaceSource::new());
} else if let Some(package) = ws.members().find(|p| p.name().as_str() == dependency.name) {
// Only special-case workspaces when the user doesn't provide any extra
@@ -449,6 +452,40 @@ fn resolve_dependency(
Ok(dependency)
}
+fn fuzzy_lookup(
+ dependency: &mut Dependency,
+ lookup: impl Fn(&str) -> CargoResult