Skip to content

Commit 6137d25

Browse files
committed
Add suggestions when cargo add multiple packages
Signed-off-by: hi-rustin <[email protected]>
1 parent c71f344 commit 6137d25

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/cargo/ops/cargo_add/mod.rs

Lines changed: 25 additions & 4 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(packages, &src, true)?;
293293
Dependency::from(package.summary())
294294
};
295295
selected
@@ -314,7 +314,7 @@ fn resolve_dependency(
314314
} else {
315315
let source = crate::sources::PathSource::new(&path, src.source_id()?, config);
316316
let packages = source.read_packages()?;
317-
let package = infer_package(packages, &src)?;
317+
let package = infer_package(packages, &src, false)?;
318318
Dependency::from(package.summary())
319319
};
320320
selected
@@ -599,7 +599,11 @@ fn select_package(
599599
}
600600
}
601601

602-
fn infer_package(mut packages: Vec<Package>, src: &dyn std::fmt::Display) -> CargoResult<Package> {
602+
fn infer_package(
603+
mut packages: Vec<Package>,
604+
src: &dyn std::fmt::Display,
605+
is_git_source: bool,
606+
) -> CargoResult<Package> {
603607
let package = match packages.len() {
604608
0 => {
605609
anyhow::bail!("no packages found at `{src}`");
@@ -611,7 +615,24 @@ fn infer_package(mut packages: Vec<Package>, src: &dyn std::fmt::Display) -> Car
611615
.map(|p| p.name().as_str().to_owned())
612616
.collect();
613617
names.sort_unstable();
614-
anyhow::bail!("multiple packages found at `{src}`: {}", names.join(", "));
618+
anyhow::bail!(
619+
"multiple packages found at `{src}`:\n {}{}",
620+
names
621+
.iter()
622+
.map(|s| s.to_string())
623+
.coalesce(|x, y| if x.len() + y.len() < 78 {
624+
Ok(format!("{x}, {y}"))
625+
} else {
626+
Err((x, y))
627+
})
628+
.into_iter()
629+
.format("\n "),
630+
if is_git_source {
631+
format!("\nTo disambiguate, run `cargo add --git {src} <crate>`")
632+
} else {
633+
"".to_owned()
634+
}
635+
);
615636
}
616637
};
617638
Ok(package)

0 commit comments

Comments
 (0)