From 76e9e1b55f2e67de739d5aa8e59a50db2ca0871b Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Fri, 23 Sep 2022 09:17:31 -0600 Subject: [PATCH] fix(cargo): Add a warning on package and project in the same Cargo.toml --- src/cargo/util/toml/mod.rs | 15 +++++++++++++-- tests/testsuite/check.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index e4c3655bfa87..f12eef29c318 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1578,8 +1578,19 @@ impl TomlManifest { let cargo_features = me.cargo_features.as_ref().unwrap_or(&empty); let features = Features::new(cargo_features, config, &mut warnings, source_id.is_path())?; - let package = me.project.clone().or_else(|| me.package.clone()); - let package = &mut package.ok_or_else(|| anyhow!("no `package` section found"))?; + let mut package = match (&me.package, &me.project) { + (Some(_), Some(project)) => { + config.shell().warn(format!( + "manifest at `{}` contains both `project` and `package`, \ + this could become a hard error in the future", + package_root.display() + ))?; + project.clone() + } + (Some(package), None) => package.clone(), + (None, Some(project)) => project.clone(), + (None, None) => bail!("no `package` section found"), + }; let workspace_config = match (me.workspace.as_ref(), package.workspace.as_ref()) { (Some(toml_config), None) => { diff --git a/tests/testsuite/check.rs b/tests/testsuite/check.rs index 390e5551632b..9918e3c182ab 100644 --- a/tests/testsuite/check.rs +++ b/tests/testsuite/check.rs @@ -1024,3 +1024,33 @@ fn rustc_workspace_wrapper_excludes_published_deps() { .with_stdout_does_not_contain("WRAPPER CALLED: rustc --crate-name baz [..]") .run(); } + +#[cargo_test] +fn warn_manifest_package_and_project() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + + [project] + name = "foo" + version = "0.0.1" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("check") + .with_status(0) + .with_stderr( + "\ +[WARNING] manifest at `[CWD]` contains both `project` and `package`, this could become a hard error in the future +[CHECKING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +", + ) + .run(); +}