Skip to content

Commit 995f5ef

Browse files
committed
Auto merge of #11186 - hi-rustin:rustin-patch-add-suggestion, r=epage
Add suggestions when `cargo add` multiple packages ### What does this PR try to resolve? close #11173 Add suggestions when `cargo add` multiple packages. See #11173 (comment) ### How should we test and review this PR? - [x] unit test
2 parents 6553589 + db3ebb6 commit 995f5ef

File tree

3 files changed

+65
-9
lines changed

3 files changed

+65
-9
lines changed

src/cargo/ops/cargo_add/mod.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ fn resolve_dependency(
289289
} else {
290290
let mut source = crate::sources::GitSource::new(src.source_id()?, config)?;
291291
let packages = source.read_packages()?;
292-
let package = infer_package(packages, &src)?;
292+
let package = infer_package_for_git_source(packages, &src)?;
293293
Dependency::from(package.summary())
294294
};
295295
selected
@@ -313,8 +313,10 @@ fn resolve_dependency(
313313
selected
314314
} else {
315315
let source = crate::sources::PathSource::new(&path, src.source_id()?, config);
316-
let packages = source.read_packages()?;
317-
let package = infer_package(packages, &src)?;
316+
let package = source
317+
.read_packages()?
318+
.pop()
319+
.expect("read_packages errors when no packages");
318320
Dependency::from(package.summary())
319321
};
320322
selected
@@ -599,19 +601,35 @@ fn select_package(
599601
}
600602
}
601603

602-
fn infer_package(mut packages: Vec<Package>, src: &dyn std::fmt::Display) -> CargoResult<Package> {
604+
fn infer_package_for_git_source(
605+
mut packages: Vec<Package>,
606+
src: &dyn std::fmt::Display,
607+
) -> CargoResult<Package> {
603608
let package = match packages.len() {
604-
0 => {
605-
anyhow::bail!("no packages found at `{src}`");
606-
}
609+
0 => unreachable!(
610+
"this function should only be called with packages from `GitSource::read_packages` \
611+
and that call should error for us when there are no packages"
612+
),
607613
1 => packages.pop().expect("match ensured element is present"),
608614
_ => {
609615
let mut names: Vec<_> = packages
610616
.iter()
611617
.map(|p| p.name().as_str().to_owned())
612618
.collect();
613619
names.sort_unstable();
614-
anyhow::bail!("multiple packages found at `{src}`: {}", names.join(", "));
620+
anyhow::bail!(
621+
"multiple packages found at `{src}`:\n {}\nTo disambiguate, run `cargo add --git {src} <package>`",
622+
names
623+
.iter()
624+
.map(|s| s.to_string())
625+
.coalesce(|x, y| if x.len() + y.len() < 78 {
626+
Ok(format!("{x}, {y}"))
627+
} else {
628+
Err((x, y))
629+
})
630+
.into_iter()
631+
.format("\n "),
632+
);
615633
}
616634
};
617635
Ok(package)

tests/testsuite/cargo_add/git_inferred_name_multiple/mod.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,41 @@ fn git_inferred_name_multiple() {
2323
&cargo_test_support::basic_manifest("my-package2", "0.3.0+my-package2"),
2424
)
2525
.file("p2/src/lib.rs", "")
26+
.file(
27+
"p3/Cargo.toml",
28+
&cargo_test_support::basic_manifest("my-package3", "0.3.0+my-package2"),
29+
)
30+
.file("p3/src/lib.rs", "")
31+
.file(
32+
"p4/Cargo.toml",
33+
&cargo_test_support::basic_manifest("my-package4", "0.3.0+my-package2"),
34+
)
35+
.file("p4/src/lib.rs", "")
36+
.file(
37+
"p5/Cargo.toml",
38+
&cargo_test_support::basic_manifest("my-package5", "0.3.0+my-package2"),
39+
)
40+
.file("p5/src/lib.rs", "")
41+
.file(
42+
"p6/Cargo.toml",
43+
&cargo_test_support::basic_manifest("my-package6", "0.3.0+my-package2"),
44+
)
45+
.file("p6/src/lib.rs", "")
46+
.file(
47+
"p7/Cargo.toml",
48+
&cargo_test_support::basic_manifest("my-package7", "0.3.0+my-package2"),
49+
)
50+
.file("p7/src/lib.rs", "")
51+
.file(
52+
"p8/Cargo.toml",
53+
&cargo_test_support::basic_manifest("my-package8", "0.3.0+my-package2"),
54+
)
55+
.file("p8/src/lib.rs", "")
56+
.file(
57+
"p9/Cargo.toml",
58+
&cargo_test_support::basic_manifest("my-package9", "0.3.0+my-package2"),
59+
)
60+
.file("p9/src/lib.rs", "")
2661
});
2762
let git_url = git_dep.url().to_string();
2863

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
Updating git repository `[ROOTURL]/git-package`
2-
error: multiple packages found at `[ROOTURL]/git-package`: my-package1, my-package2
2+
error: multiple packages found at `[ROOTURL]/git-package`:
3+
my-package1, my-package2, my-package3, my-package4, my-package5, my-package6
4+
my-package7, my-package8, my-package9
5+
To disambiguate, run `cargo add --git [ROOTURL]/git-package <package>`

0 commit comments

Comments
 (0)