diff --git a/src/bin/set-version/set_version.rs b/src/bin/set-version/set_version.rs
index bcf10a5a16..3812072e62 100644
--- a/src/bin/set-version/set_version.rs
+++ b/src/bin/set-version/set_version.rs
@@ -119,6 +119,23 @@ fn exec(args: VersionArgs) -> CargoResult<()> {
let root_manifest_path = ws_metadata.workspace_root.as_std_path().join("Cargo.toml");
let workspace_members = find_ws_members(&ws_metadata);
+ let mut missing = Vec::new();
+ for name in &pkgid {
+ let name = name.as_str();
+ if !workspace_members
+ .iter()
+ .any(|package| package.name.as_str() == name)
+ && !missing.contains(&name)
+ {
+ missing.push(name);
+ }
+ }
+ match missing.len() {
+ 0 => {}
+ 1 => anyhow::bail!("package {} doesn't exist", missing.join(", ")),
+ _ => anyhow::bail!("packages {} don't exist", missing.join(", ")),
+ }
+
if all {
shell_warn("The flag `--all` has been deprecated in favor of `--workspace`")?;
}
diff --git a/tests/cargo-set-version/main.rs b/tests/cargo-set-version/main.rs
index 0008434031..1dbb0df3ca 100644
--- a/tests/cargo-set-version/main.rs
+++ b/tests/cargo-set-version/main.rs
@@ -5,6 +5,10 @@
mod downgrade_error;
mod dry_run;
mod ignore_dependent;
+mod package_not_found;
+mod package_not_found_mixed;
+mod package_not_found_repeated;
+mod packages_not_found;
mod relative_absolute_conflict;
mod set_absolute_version;
mod set_absolute_workspace_version;
diff --git a/tests/cargo-set-version/package_not_found/in/Cargo.toml b/tests/cargo-set-version/package_not_found/in/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found/in/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found/mod.rs b/tests/cargo-set-version/package_not_found/mod.rs
new file mode 100644
index 0000000000..8a4c20fb91
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found/mod.rs
@@ -0,0 +1,24 @@
+use cargo_test_support::Project;
+use cargo_test_support::compare::assert_ui;
+use cargo_test_support::current_dir;
+use cargo_test_support::file;
+use cargo_test_support::prelude::*;
+
+use crate::CargoCommand;
+
+#[cargo_test]
+fn case() {
+ let project = Project::from_template(current_dir!().join("in"));
+ let project_root = project.root();
+
+ snapbox::cmd::Command::cargo_ui()
+ .arg("set-version")
+ .args(["2.0.0", "--package", "missing"])
+ .current_dir(&project_root)
+ .assert()
+ .code(1)
+ .stdout_eq(file!["stdout.term.svg"])
+ .stderr_eq(file!["stderr.term.svg"]);
+
+ assert_ui().subset_matches(current_dir!().join("out"), &project_root);
+}
diff --git a/tests/cargo-set-version/package_not_found/out/Cargo.toml b/tests/cargo-set-version/package_not_found/out/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found/out/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found/stderr.term.svg b/tests/cargo-set-version/package_not_found/stderr.term.svg
new file mode 100644
index 0000000000..ce1443ca8c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found/stderr.term.svg
@@ -0,0 +1,25 @@
+
diff --git a/tests/cargo-set-version/package_not_found/stdout.term.svg b/tests/cargo-set-version/package_not_found/stdout.term.svg
new file mode 100644
index 0000000000..824d5a945c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found/stdout.term.svg
@@ -0,0 +1,21 @@
+
diff --git a/tests/cargo-set-version/package_not_found_mixed/in/Cargo.toml b/tests/cargo-set-version/package_not_found_mixed/in/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_mixed/in/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found_mixed/mod.rs b/tests/cargo-set-version/package_not_found_mixed/mod.rs
new file mode 100644
index 0000000000..516f7b93b8
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_mixed/mod.rs
@@ -0,0 +1,24 @@
+use cargo_test_support::Project;
+use cargo_test_support::compare::assert_ui;
+use cargo_test_support::current_dir;
+use cargo_test_support::file;
+use cargo_test_support::prelude::*;
+
+use crate::CargoCommand;
+
+#[cargo_test]
+fn case() {
+ let project = Project::from_template(current_dir!().join("in"));
+ let project_root = project.root();
+
+ snapbox::cmd::Command::cargo_ui()
+ .arg("set-version")
+ .args(["2.0.0", "--package", "sample", "--package", "missing"])
+ .current_dir(&project_root)
+ .assert()
+ .code(1)
+ .stdout_eq(file!["stdout.term.svg"])
+ .stderr_eq(file!["stderr.term.svg"]);
+
+ assert_ui().subset_matches(current_dir!().join("out"), &project_root);
+}
diff --git a/tests/cargo-set-version/package_not_found_mixed/out/Cargo.toml b/tests/cargo-set-version/package_not_found_mixed/out/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_mixed/out/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found_mixed/stderr.term.svg b/tests/cargo-set-version/package_not_found_mixed/stderr.term.svg
new file mode 100644
index 0000000000..ce1443ca8c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_mixed/stderr.term.svg
@@ -0,0 +1,25 @@
+
diff --git a/tests/cargo-set-version/package_not_found_mixed/stdout.term.svg b/tests/cargo-set-version/package_not_found_mixed/stdout.term.svg
new file mode 100644
index 0000000000..824d5a945c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_mixed/stdout.term.svg
@@ -0,0 +1,21 @@
+
diff --git a/tests/cargo-set-version/package_not_found_repeated/in/Cargo.toml b/tests/cargo-set-version/package_not_found_repeated/in/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_repeated/in/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found_repeated/mod.rs b/tests/cargo-set-version/package_not_found_repeated/mod.rs
new file mode 100644
index 0000000000..d03d0f1e22
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_repeated/mod.rs
@@ -0,0 +1,24 @@
+use cargo_test_support::Project;
+use cargo_test_support::compare::assert_ui;
+use cargo_test_support::current_dir;
+use cargo_test_support::file;
+use cargo_test_support::prelude::*;
+
+use crate::CargoCommand;
+
+#[cargo_test]
+fn case() {
+ let project = Project::from_template(current_dir!().join("in"));
+ let project_root = project.root();
+
+ snapbox::cmd::Command::cargo_ui()
+ .arg("set-version")
+ .args(["2.0.0", "-p", "missing", "-p", "missing"])
+ .current_dir(&project_root)
+ .assert()
+ .code(1)
+ .stdout_eq(file!["stdout.term.svg"])
+ .stderr_eq(file!["stderr.term.svg"]);
+
+ assert_ui().subset_matches(current_dir!().join("out"), &project_root);
+}
diff --git a/tests/cargo-set-version/package_not_found_repeated/out/Cargo.toml b/tests/cargo-set-version/package_not_found_repeated/out/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_repeated/out/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/package_not_found_repeated/stderr.term.svg b/tests/cargo-set-version/package_not_found_repeated/stderr.term.svg
new file mode 100644
index 0000000000..ce1443ca8c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_repeated/stderr.term.svg
@@ -0,0 +1,25 @@
+
diff --git a/tests/cargo-set-version/package_not_found_repeated/stdout.term.svg b/tests/cargo-set-version/package_not_found_repeated/stdout.term.svg
new file mode 100644
index 0000000000..824d5a945c
--- /dev/null
+++ b/tests/cargo-set-version/package_not_found_repeated/stdout.term.svg
@@ -0,0 +1,21 @@
+
diff --git a/tests/cargo-set-version/packages_not_found/in/Cargo.toml b/tests/cargo-set-version/packages_not_found/in/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/packages_not_found/in/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/packages_not_found/mod.rs b/tests/cargo-set-version/packages_not_found/mod.rs
new file mode 100644
index 0000000000..8e3c10a728
--- /dev/null
+++ b/tests/cargo-set-version/packages_not_found/mod.rs
@@ -0,0 +1,30 @@
+use cargo_test_support::Project;
+use cargo_test_support::compare::assert_ui;
+use cargo_test_support::current_dir;
+use cargo_test_support::file;
+use cargo_test_support::prelude::*;
+
+use crate::CargoCommand;
+
+#[cargo_test]
+fn case() {
+ let project = Project::from_template(current_dir!().join("in"));
+ let project_root = project.root();
+
+ snapbox::cmd::Command::cargo_ui()
+ .arg("set-version")
+ .args([
+ "2.0.0",
+ "--package",
+ "first-missing",
+ "--package",
+ "second-missing",
+ ])
+ .current_dir(&project_root)
+ .assert()
+ .code(1)
+ .stdout_eq(file!["stdout.term.svg"])
+ .stderr_eq(file!["stderr.term.svg"]);
+
+ assert_ui().subset_matches(current_dir!().join("out"), &project_root);
+}
diff --git a/tests/cargo-set-version/packages_not_found/out/Cargo.toml b/tests/cargo-set-version/packages_not_found/out/Cargo.toml
new file mode 100644
index 0000000000..2d25724afe
--- /dev/null
+++ b/tests/cargo-set-version/packages_not_found/out/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+
+[package]
+name = "sample"
+version = "0.1.0"
+edition = "2015"
+
+[lib]
+path = "dummy.rs"
diff --git a/tests/cargo-set-version/packages_not_found/stderr.term.svg b/tests/cargo-set-version/packages_not_found/stderr.term.svg
new file mode 100644
index 0000000000..ec7dc79bb4
--- /dev/null
+++ b/tests/cargo-set-version/packages_not_found/stderr.term.svg
@@ -0,0 +1,25 @@
+
diff --git a/tests/cargo-set-version/packages_not_found/stdout.term.svg b/tests/cargo-set-version/packages_not_found/stdout.term.svg
new file mode 100644
index 0000000000..824d5a945c
--- /dev/null
+++ b/tests/cargo-set-version/packages_not_found/stdout.term.svg
@@ -0,0 +1,21 @@
+