diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 04d4010f45e..b18c338f6c7 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -36,6 +36,25 @@ pub fn generate_lockfile(ws: &Workspace<'_>) -> CargoResult<()> { } pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoResult<()> { + // Currently this is only a warning, but after a transition period this will become + // a hard error. + // See https://github.com/rust-lang/cargo/issues/10919#issuecomment-1214464756. + // We should declare the `precise` and `aggressive` arguments + // require the `package` argument in the clap. + if opts.aggressive && opts.to_update.is_empty() { + ws.config().shell().warn( + "aggressive is only supported with \"--package \", \ + this will become a hard error in a future release.", + )?; + } + + if opts.precise.is_some() && opts.to_update.is_empty() { + ws.config().shell().warn( + "precise is only supported with \"--package \", \ + this will become a hard error in a future release.", + )?; + } + if opts.aggressive && opts.precise.is_some() { anyhow::bail!("cannot specify both aggressive and precise simultaneously") } diff --git a/tests/testsuite/update.rs b/tests/testsuite/update.rs index 6a3f2fe78e1..f7eb0f5bb64 100644 --- a/tests/testsuite/update.rs +++ b/tests/testsuite/update.rs @@ -392,6 +392,77 @@ fn update_precise() { .run(); } +#[cargo_test] +fn update_precise_without_package() { + Package::new("serde", "0.2.0").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + + [dependencies] + serde = "0.2" + "#, + ) + .file("src/lib.rs", "") + .build(); + + p.cargo("build").run(); + + Package::new("serde", "0.2.1").publish(); + Package::new("serde", "0.3.0").publish(); + + p.cargo("update --precise 0.3.0") + .with_stderr( + "\ +[WARNING] precise is only supported with \"--package \", this will become a hard error in a future release. +[UPDATING] `[..]` index +[UPDATING] serde v0.2.0 -> v0.2.1 +", + ) + .run(); +} + +#[cargo_test] +fn update_aggressive_without_package() { + Package::new("serde", "0.2.0").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + + [dependencies] + serde = "0.2" + "#, + ) + .file("src/lib.rs", "") + .build(); + + p.cargo("build").run(); + + Package::new("serde", "0.2.1").publish(); + + p.cargo("update --aggressive") + .with_stderr( + "\ +[WARNING] aggressive is only supported with \"--package \", this will become a hard error in a future release. +[UPDATING] `[..]` index +[UPDATING] serde v0.2.0 -> v0.2.1 +", + ) + .run(); +} + // cargo update should respect its arguments even without a lockfile. // See issue "Running cargo update without a Cargo.lock ignores arguments" // at .