diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index a65120507de..3ba55fc2ae7 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -970,33 +970,34 @@ fn update_manifest_with_new_member( // in the array already includes the new package's relative path. // - Add the relative path if the members don't match the new package's path. // - Create a new members array if there are no members element in the workspace yet. - if let Some(members) = workspace_document - .get_mut("workspace") - .and_then(|workspace| workspace.get_mut("members")) - .and_then(|members| members.as_array_mut()) - { - for member in members.iter() { - let pat = member - .as_str() - .with_context(|| format!("invalid non-string member `{}`", member))?; - let pattern = glob::Pattern::new(pat) - .with_context(|| format!("cannot build glob pattern from `{}`", pat))?; + if let Some(workspace) = workspace_document.get_mut("workspace") { + if let Some(members) = workspace + .get_mut("members") + .and_then(|members| members.as_array_mut()) + { + for member in members.iter() { + let pat = member + .as_str() + .with_context(|| format!("invalid non-string member `{}`", member))?; + let pattern = glob::Pattern::new(pat) + .with_context(|| format!("cannot build glob pattern from `{}`", pat))?; + + if pattern.matches(&display_path) { + return Ok(()); + } + } - if pattern.matches(&display_path) { - return Ok(()); + let was_sorted = is_sorted(members.iter().map(Value::as_str)); + members.push(display_path); + if was_sorted { + members.sort_by(|lhs, rhs| lhs.as_str().cmp(&rhs.as_str())); } - } + } else { + let mut array = Array::new(); + array.push(display_path); - let was_sorted = is_sorted(members.iter().map(Value::as_str)); - members.push(display_path); - if was_sorted { - members.sort_by(|lhs, rhs| lhs.as_str().cmp(&rhs.as_str())); + workspace["members"] = toml_edit::value(array); } - } else { - let mut array = Array::new(); - array.push(display_path); - - workspace_document["workspace"]["members"] = toml_edit::value(array); } write_atomic( diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/in/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_non_workspace/in/Cargo.toml new file mode 100644 index 00000000000..878c6729147 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/in/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "foo" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/in/src/main.rs b/tests/testsuite/cargo_new/add_members_to_non_workspace/in/src/main.rs new file mode 100644 index 00000000000..f328e4d9d04 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/in/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/mod.rs b/tests/testsuite/cargo_new/add_members_to_non_workspace/mod.rs new file mode 100644 index 00000000000..c70b97ca723 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/mod.rs @@ -0,0 +1,22 @@ +use cargo_test_support::compare::assert_ui; +use cargo_test_support::curr_dir; +use cargo_test_support::CargoCommand; +use cargo_test_support::Project; + +#[cargo_test] +fn case() { + let project = Project::from_template(curr_dir!().join("in")); + let project_root = project.root(); + let cwd = &project_root; + + snapbox::cmd::Command::cargo_ui() + .arg("new") + .args(["bar", "--lib"]) + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); + + assert_ui().subset_matches(curr_dir!().join("out"), &project_root); +} diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/out/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/Cargo.toml new file mode 100644 index 00000000000..878c6729147 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "foo" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/Cargo.toml new file mode 100644 index 00000000000..fe23452f35a --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "bar" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/src/lib.rs b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/src/lib.rs new file mode 100644 index 00000000000..7d12d9af819 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/bar/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/out/src/main.rs b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/src/main.rs new file mode 100644 index 00000000000..f328e4d9d04 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/out/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/stderr.log b/tests/testsuite/cargo_new/add_members_to_non_workspace/stderr.log new file mode 100644 index 00000000000..25556c9505a --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_non_workspace/stderr.log @@ -0,0 +1,2 @@ + Creating library `bar` package +note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tests/testsuite/cargo_new/add_members_to_non_workspace/stdout.log b/tests/testsuite/cargo_new/add_members_to_non_workspace/stdout.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/Cargo.toml new file mode 100644 index 00000000000..005ee0dc477 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] + +[package] +name = "foo" +version = "0.1.0" +edition = "2021" \ No newline at end of file diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/src/main.rs b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/src/main.rs new file mode 100644 index 00000000000..f328e4d9d04 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/in/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/mod.rs b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/mod.rs new file mode 100644 index 00000000000..c70b97ca723 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/mod.rs @@ -0,0 +1,22 @@ +use cargo_test_support::compare::assert_ui; +use cargo_test_support::curr_dir; +use cargo_test_support::CargoCommand; +use cargo_test_support::Project; + +#[cargo_test] +fn case() { + let project = Project::from_template(curr_dir!().join("in")); + let project_root = project.root(); + let cwd = &project_root; + + snapbox::cmd::Command::cargo_ui() + .arg("new") + .args(["bar", "--lib"]) + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); + + assert_ui().subset_matches(curr_dir!().join("out"), &project_root); +} diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/Cargo.toml new file mode 100644 index 00000000000..8af198f51e9 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/Cargo.toml @@ -0,0 +1,7 @@ +[workspace] +members = ["bar"] + +[package] +name = "foo" +version = "0.1.0" +edition = "2021" diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/Cargo.toml b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/Cargo.toml new file mode 100644 index 00000000000..fe23452f35a --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "bar" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/src/lib.rs b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/src/lib.rs new file mode 100644 index 00000000000..7d12d9af819 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/bar/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/src/main.rs b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/src/main.rs new file mode 100644 index 00000000000..f328e4d9d04 --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/out/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/stderr.log b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/stderr.log new file mode 100644 index 00000000000..25556c9505a --- /dev/null +++ b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/stderr.log @@ -0,0 +1,2 @@ + Creating library `bar` package +note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tests/testsuite/cargo_new/add_members_to_workspace_without_members/stdout.log b/tests/testsuite/cargo_new/add_members_to_workspace_without_members/stdout.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_new/mod.rs b/tests/testsuite/cargo_new/mod.rs index 806bd2ec375..ca8ee0f9cd5 100644 --- a/tests/testsuite/cargo_new/mod.rs +++ b/tests/testsuite/cargo_new/mod.rs @@ -1,9 +1,11 @@ +mod add_members_to_non_workspace; mod add_members_to_workspace_format_previous_items; mod add_members_to_workspace_format_sorted; mod add_members_to_workspace_with_absolute_package_path; mod add_members_to_workspace_with_empty_members; mod add_members_to_workspace_with_exclude_list; mod add_members_to_workspace_with_members_glob; +mod add_members_to_workspace_without_members; mod empty_name; mod help; mod inherit_workspace_lints;