diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 181e25b128b..26b1693ef6d 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -141,6 +141,24 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes format!("{} -> v{}", removed[0], added[0].version()) }; print_change("Updating", msg, Green)?; + } else if removed.len() == added.len() { + for (pre_package, tar_package) in removed.iter().zip(added.iter()) { + let msg = if pre_package.source_id().is_git() { + format!( + "{} -> #{}", + pre_package, + &tar_package.source_id().precise().unwrap()[..8] + ) + } else { + format!( + "{} v{} -> v{}", + pre_package.name(), + pre_package.version(), + tar_package.version() + ) + }; + print_change("Updating", msg, Green)?; + } } else { for package in removed.iter() { print_change("Removing", format!("{}", package), Red)?; diff --git a/tests/testsuite/update.rs b/tests/testsuite/update.rs index 33ca18c38b1..ef14548f820 100644 --- a/tests/testsuite/update.rs +++ b/tests/testsuite/update.rs @@ -678,3 +678,60 @@ fn workspace_only() { assert!(!lock1.contains("0.0.2")); assert!(!lock2.contains("0.0.1")); } + +#[cargo_test] +fn update_mulit_dependence_after_precise() { + Package::new("serde", "0.1.0").publish(); + Package::new("serde", "0.2.0").publish(); + Package::new("serde", "0.1.5").publish(); + Package::new("serde", "0.2.5").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + + [dependencies] + serde_1 = { package = "serde", version = "0.1.0" } + serde_2 = { package = "serde", version = "0.2.0" } + "#, + ) + .file( + "src/main.rs", + r#" + fn main() {} + "#, + ) + .build(); + + p.cargo("generate-lockfile").run(); + + p.cargo("update -p serde:0.1.5 --precise 0.1.0") + .with_stderr( + "\ +[UPDATING] `[..]` index +[UPDATING] serde v0.1.5 -> v0.1.0", + ) + .run(); + + p.cargo("update -p serde:0.2.5 --precise 0.2.0") + .with_stderr( + "\ +[UPDATING] `[..]` index +[UPDATING] serde v0.2.5 -> v0.2.0", + ) + .run(); + + p.cargo("update") + .with_stderr( + "\ +[UPDATING] `[..]` index +[UPDATING] serde v0.1.0 -> v0.1.5 +[UPDATING] serde v0.2.0 -> v0.2.5", + ) + .run(); +}