diff --git a/crates/cargo-util-schemas/manifest.schema.json b/crates/cargo-util-schemas/manifest.schema.json index 5bc43e49d..bbf854559 100644 --- a/crates/cargo-util-schemas/manifest.schema.json +++ b/crates/cargo-util-schemas/manifest.schema.json @@ -241,7 +241,10 @@ ] }, "name": { - "type": "string" + "type": [ + "string", + "null" + ] }, "version": { "anyOf": [ @@ -475,10 +478,7 @@ } ] } - }, - "required": [ - "name" - ] + } }, "InheritableField_for_string": { "description": "An enum that allows for inheriting keys from a workspace in a Cargo.toml.", diff --git a/crates/cargo-util-schemas/src/manifest/mod.rs b/crates/cargo-util-schemas/src/manifest/mod.rs index 906ff3d43..d3706407a 100644 --- a/crates/cargo-util-schemas/src/manifest/mod.rs +++ b/crates/cargo-util-schemas/src/manifest/mod.rs @@ -178,8 +178,8 @@ pub struct TomlPackage { pub edition: Option, #[cfg_attr(feature = "unstable-schema", schemars(with = "Option"))] pub rust_version: Option, - #[cfg_attr(feature = "unstable-schema", schemars(with = "String"))] - pub name: PackageName, + #[cfg_attr(feature = "unstable-schema", schemars(with = "Option"))] + pub name: Option, pub version: Option, pub authors: Option, pub build: Option, @@ -226,7 +226,7 @@ pub struct TomlPackage { impl TomlPackage { pub fn new(name: PackageName) -> Self { Self { - name, + name: Some(name), edition: None, rust_version: None, @@ -263,6 +263,10 @@ impl TomlPackage { } } + pub fn normalized_name(&self) -> Result<&PackageName, UnresolvedError> { + self.name.as_ref().ok_or(UnresolvedError) + } + pub fn normalized_edition(&self) -> Result, UnresolvedError> { self.edition.as_ref().map(|v| v.normalized()).transpose() } diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 8491e2ae7..d341874fd 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -322,7 +322,10 @@ fn normalize_toml( if let Some(original_package) = original_toml.package() { let normalized_package = normalize_package_toml(original_package, manifest_file, is_embedded, gctx, &inherit)?; - let package_name = &normalized_package.name.clone(); + let package_name = &normalized_package + .normalized_name() + .expect("previously normalized") + .clone(); let edition = normalized_package .normalized_edition() .expect("previously normalized") @@ -582,7 +585,12 @@ fn normalize_package_toml<'a>( .map(|value| field_inherit_with(value, "rust-version", || inherit()?.rust_version())) .transpose()? .map(manifest::InheritableField::Value); - let name = original_package.name.clone(); + let name = Some( + original_package + .name + .clone() + .ok_or_else(|| anyhow::format_err!("missing field `package.name`"))?, + ); let version = original_package .version .clone() @@ -1198,7 +1206,9 @@ pub fn to_real_manifest( let normalized_package = normalized_toml .package() .expect("previously verified to have a `[package]`"); - let package_name = &normalized_package.name; + let package_name = normalized_package + .normalized_name() + .expect("previously normalized"); if package_name.contains(':') { features.require(Feature::open_namespaces())?; } diff --git a/src/cargo/util/toml/targets.rs b/src/cargo/util/toml/targets.rs index 3fe018433..9c71b4d76 100644 --- a/src/cargo/util/toml/targets.rs +++ b/src/cargo/util/toml/targets.rs @@ -117,7 +117,7 @@ pub(super) fn to_targets( targets.push(Target::metabuild_target(&format!( "metabuild-{}", - package.name + package.normalized_name().expect("previously normalized") ))); } diff --git a/tests/testsuite/bad_config.rs b/tests/testsuite/bad_config.rs index 5ac8c1216..8e7316dd2 100644 --- a/tests/testsuite/bad_config.rs +++ b/tests/testsuite/bad_config.rs @@ -484,12 +484,10 @@ fn cargo_toml_missing_package_name() { p.cargo("check") .with_status(101) .with_stderr_data(str![[r#" -[ERROR] missing field `name` - --> Cargo.toml:2:16 - | -2 | [package] - | ^^^^^^^^^ - | +[ERROR] failed to parse manifest at `[ROOT]/foo/Cargo.toml` + +Caused by: + missing field `package.name` "#]]) .run();