From 1f048121879eb6e357cc2fc18edaf6f5657b988c Mon Sep 17 00:00:00 2001 From: Jonas Dohse Date: Wed, 17 Apr 2024 08:40:43 +0200 Subject: [PATCH] Lookup translated names in workspace deps This fixes #13702 and #10680 --- src/cargo/ops/cargo_add/mod.rs | 45 ++++++++++++------- .../detect_workspace_inherit_fuzzy/mod.rs | 1 - .../testsuite/cargo_add/features_fuzzy/mod.rs | 1 - 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index 1781d4c93598..76567ef9370d 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -364,24 +364,28 @@ fn resolve_dependency( }; selected_dep = populate_dependency(selected_dep, arg); - let old_dep = get_existing_dependency(manifest, selected_dep.toml_key(), section)?; - 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 - if selected_dep.optional.is_none() { - selected_dep.optional = old_dep.optional; + let get_dependency = |mut selected_dep: Dependency| { + let old_dep = get_existing_dependency(manifest, selected_dep.toml_key(), section)?; + let 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 + if selected_dep.optional.is_none() { + selected_dep.optional = old_dep.optional; + } + selected_dep + } else { + if selected_dep.source().is_some() { + // Overwrite with `crate_spec` + old_dep.source = selected_dep.source; + } + populate_dependency(old_dep, arg) } - selected_dep } else { - if selected_dep.source().is_some() { - // Overwrite with `crate_spec` - old_dep.source = selected_dep.source; - } - populate_dependency(old_dep, arg) - } - } else { - selected_dep + selected_dep + }; + anyhow::Ok((old_dep, dependency)) }; + let (mut old_dep, mut dependency) = get_dependency(selected_dep)?; if dependency.source().is_none() { // Checking for a workspace dependency happens first since a member could be specified @@ -403,14 +407,23 @@ fn resolve_dependency( let latest = get_latest_dependency(spec, &dependency, honor_rust_version, gctx, registry)?; + dependency = dependency.set_source(latest.source.expect("latest always has a source")); + if dependency.name != latest.name { gctx.shell().warn(format!( "translating `{}` to `{}`", dependency.name, latest.name, ))?; dependency.name = latest.name; // Normalize the name + let (norm_old_dep, norm_dep) = get_dependency(dependency.clone())?; + + // Re-check workspace dependencies table with normalized name + if let Some(_dep) = find_workspace_dep(norm_dep.toml_key(), ws.root_manifest()).ok() + { + old_dep = norm_old_dep; + dependency = norm_dep.set_source(WorkspaceSource::new()); + } } - dependency = dependency.set_source(latest.source.expect("latest always has a source")); } } diff --git a/tests/testsuite/cargo_add/detect_workspace_inherit_fuzzy/mod.rs b/tests/testsuite/cargo_add/detect_workspace_inherit_fuzzy/mod.rs index d364e164083a..d37d3b929482 100644 --- a/tests/testsuite/cargo_add/detect_workspace_inherit_fuzzy/mod.rs +++ b/tests/testsuite/cargo_add/detect_workspace_inherit_fuzzy/mod.rs @@ -7,7 +7,6 @@ use cargo_test_support::str; use cargo_test_support::Project; #[cargo_test] -#[ignore] fn case() { cargo_test_support::registry::init(); diff --git a/tests/testsuite/cargo_add/features_fuzzy/mod.rs b/tests/testsuite/cargo_add/features_fuzzy/mod.rs index e39db7220578..dbab7d68c79d 100644 --- a/tests/testsuite/cargo_add/features_fuzzy/mod.rs +++ b/tests/testsuite/cargo_add/features_fuzzy/mod.rs @@ -6,7 +6,6 @@ use cargo_test_support::str; use cargo_test_support::Project; #[cargo_test] -#[ignore] fn case() { cargo_test_support::registry::init(); cargo_test_support::registry::Package::new("your_face", "99999.0.0+my-package")