diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index dff545f38a0..dff93e91b02 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -312,6 +312,10 @@ fn resolve_dependency( } } + if let Some(Source::Workspace(_)) = dependency.source() { + check_invalid_ws_keys(dependency.toml_key(), arg)?; + } + let version_required = dependency.source().and_then(|s| s.as_registry()).is_some(); let version_optional_in_section = section.kind() == DepKind::Development; let preserve_existing_version = old_dep @@ -328,6 +332,40 @@ fn resolve_dependency( Ok(dependency) } +/// When { workspace = true } you cannot define other keys that configure +/// the source of the dependency such as `version`, `registry`, `registry-index`, +/// `path`, `git`, `branch`, `tag`, `rev`, or `package`. You can also not define +/// `default-features`. +/// +/// Only `default-features`, `registry` and `rename` need to be checked +/// for currently. This is because `git` and its associated keys, `path`, and +/// `version` should all bee checked before this is called. `rename` is checked +/// for as it turns into `package` +fn check_invalid_ws_keys(toml_key: &str, arg: &DepOp) -> CargoResult<()> { + fn err_msg(toml_key: &str, flag: &str, field: &str) -> String { + format!( + "cannot override workspace dependency with `{flag}`, \ + either change `workspace.dependencies.{toml_key}.{field}` \ + or define the dependency exclusively in the package's manifest" + ) + } + + if arg.default_features.is_some() { + anyhow::bail!( + "{}", + err_msg(toml_key, "--default-features", "default-features") + ) + } + if arg.registry.is_some() { + anyhow::bail!("{}", err_msg(toml_key, "--registry", "registry")) + } + // rename is `package` + if arg.rename.is_some() { + anyhow::bail!("{}", err_msg(toml_key, "--rename", "package")) + } + Ok(()) +} + /// Provide the existing dependency for the target table /// /// If it doesn't exist but exists in another table, let's use that as most likely users diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.in/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.in/Cargo.toml new file mode 100644 index 00000000000..afd30d446e0 --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.in/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.in/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.in/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.in/dependency/src/lib.rs b/tests/snapshots/add/invalid_key_inherit_dependency.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.in/primary/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.in/primary/Cargo.toml new file mode 100644 index 00000000000..668cbd854db --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.in/primary/Cargo.toml @@ -0,0 +1,5 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.in/primary/src/lib.rs b/tests/snapshots/add/invalid_key_inherit_dependency.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.out/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.out/Cargo.toml new file mode 100644 index 00000000000..afd30d446e0 --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.out/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.out/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.out/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.out/primary/Cargo.toml b/tests/snapshots/add/invalid_key_inherit_dependency.out/primary/Cargo.toml new file mode 100644 index 00000000000..668cbd854db --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.out/primary/Cargo.toml @@ -0,0 +1,5 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.stderr b/tests/snapshots/add/invalid_key_inherit_dependency.stderr new file mode 100644 index 00000000000..85bd8da0a82 --- /dev/null +++ b/tests/snapshots/add/invalid_key_inherit_dependency.stderr @@ -0,0 +1 @@ +error: cannot override workspace dependency with `--default-features`, either change `workspace.dependencies.foo.default-features` or define the dependency exclusively in the package's manifest diff --git a/tests/snapshots/add/invalid_key_inherit_dependency.stdout b/tests/snapshots/add/invalid_key_inherit_dependency.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/Cargo.toml new file mode 100644 index 00000000000..afd30d446e0 --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/dependency/src/lib.rs b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/primary/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/primary/Cargo.toml new file mode 100644 index 00000000000..c97da880af7 --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo.workspace = true diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/primary/src/lib.rs b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/Cargo.toml new file mode 100644 index 00000000000..afd30d446e0 --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/primary/Cargo.toml b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/primary/Cargo.toml new file mode 100644 index 00000000000..c97da880af7 --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo.workspace = true diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stderr b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stderr new file mode 100644 index 00000000000..85bd8da0a82 --- /dev/null +++ b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stderr @@ -0,0 +1 @@ +error: cannot override workspace dependency with `--default-features`, either change `workspace.dependencies.foo.default-features` or define the dependency exclusively in the package's manifest diff --git a/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stdout b/tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/Cargo.toml new file mode 100644 index 00000000000..12c6ee5fed1 --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency", "dependency-alt"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency-alt/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency-alt/Cargo.toml new file mode 100644 index 00000000000..bb647290158 --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency-alt/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo-alt" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency-alt/src/lib.rs b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency-alt/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency/src/lib.rs b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/primary/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/primary/Cargo.toml new file mode 100644 index 00000000000..668cbd854db --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/primary/Cargo.toml @@ -0,0 +1,5 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/primary/src/lib.rs b/tests/snapshots/add/invalid_key_rename_inherit_dependency.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/Cargo.toml new file mode 100644 index 00000000000..12c6ee5fed1 --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency", "dependency-alt"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency-alt/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency-alt/Cargo.toml new file mode 100644 index 00000000000..bb647290158 --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency-alt/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo-alt" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/primary/Cargo.toml b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/primary/Cargo.toml new file mode 100644 index 00000000000..668cbd854db --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.out/primary/Cargo.toml @@ -0,0 +1,5 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.stderr b/tests/snapshots/add/invalid_key_rename_inherit_dependency.stderr new file mode 100644 index 00000000000..35bcdb6946b --- /dev/null +++ b/tests/snapshots/add/invalid_key_rename_inherit_dependency.stderr @@ -0,0 +1 @@ +error: cannot override workspace dependency with `--rename`, either change `workspace.dependencies.foo.package` or define the dependency exclusively in the package's manifest diff --git a/tests/snapshots/add/invalid_key_rename_inherit_dependency.stdout b/tests/snapshots/add/invalid_key_rename_inherit_dependency.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_add.rs b/tests/testsuite/cargo_add.rs index e7e8d79c4a7..6e23c7e5416 100644 --- a/tests/testsuite/cargo_add.rs +++ b/tests/testsuite/cargo_add.rs @@ -1091,6 +1091,72 @@ fn invalid_git_external() { ); } +#[cargo_test] +fn invalid_key_inherit_dependency() { + let project_root = + project_from_template("tests/snapshots/add/invalid_key_inherit_dependency.in"); + let cwd = &project_root; + + cargo_command() + .masquerade_as_nightly_cargo() + .arg("add") + .args(["foo", "--default-features", "-p", "bar"]) + .current_dir(cwd) + .assert() + .failure() + .stdout_matches_path("tests/snapshots/add/invalid_key_inherit_dependency.stdout") + .stderr_matches_path("tests/snapshots/add/invalid_key_inherit_dependency.stderr"); + + assert().subset_matches( + "tests/snapshots/add/invalid_key_inherit_dependency.out", + &project_root, + ); +} + +#[cargo_test] +fn invalid_key_rename_inherit_dependency() { + let project_root = + project_from_template("tests/snapshots/add/invalid_key_rename_inherit_dependency.in"); + let cwd = &project_root; + + cargo_command() + .masquerade_as_nightly_cargo() + .arg("add") + .args(["--rename", "foo", "foo-alt", "-p", "bar"]) + .current_dir(cwd) + .assert() + .failure() + .stdout_matches_path("tests/snapshots/add/invalid_key_rename_inherit_dependency.stdout") + .stderr_matches_path("tests/snapshots/add/invalid_key_rename_inherit_dependency.stderr"); + + assert().subset_matches( + "tests/snapshots/add/invalid_key_rename_inherit_dependency.out", + &project_root, + ); +} + +#[cargo_test] +fn invalid_key_overwrite_inherit_dependency() { + let project_root = + project_from_template("tests/snapshots/add/invalid_key_overwrite_inherit_dependency.in"); + let cwd = &project_root; + + cargo_command() + .masquerade_as_nightly_cargo() + .arg("add") + .args(["foo", "--default-features", "-p", "bar"]) + .current_dir(cwd) + .assert() + .failure() + .stdout_matches_path("tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stdout") + .stderr_matches_path("tests/snapshots/add/invalid_key_overwrite_inherit_dependency.stderr"); + + assert().subset_matches( + "tests/snapshots/add/invalid_key_overwrite_inherit_dependency.out", + &project_root, + ); +} + #[cargo_test] fn invalid_path() { init_registry();