diff --git a/src/cargo/util/restricted_names.rs b/src/cargo/util/restricted_names.rs index f61249775d3..df0152ecb1e 100644 --- a/src/cargo/util/restricted_names.rs +++ b/src/cargo/util/restricted_names.rs @@ -43,6 +43,10 @@ pub fn is_conflicting_artifact_name(name: &str) -> bool { /// elsewhere. `cargo new` has a few restrictions, such as checking for /// reserved names. crates.io has even more restrictions. pub fn validate_package_name(name: &str, what: &str, help: &str) -> CargoResult<()> { + if name.is_empty() { + bail!("{what} cannot be empty"); + } + let mut chars = name.chars(); if let Some(ch) = chars.next() { if ch.is_digit(10) { diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 6824cb5f5c7..9439ca9179e 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -480,10 +480,6 @@ pub fn to_real_manifest( }; let package_name = package.name.trim(); - if package_name.is_empty() { - bail!("package name cannot be an empty string") - } - validate_package_name(package_name, "package name", "")?; let resolved_path = package_root.join("Cargo.toml"); diff --git a/src/cargo/util_schemas/core/package_id_spec.rs b/src/cargo/util_schemas/core/package_id_spec.rs index b5d2a3db223..07d1fb5ee9b 100644 --- a/src/cargo/util_schemas/core/package_id_spec.rs +++ b/src/cargo/util_schemas/core/package_id_spec.rs @@ -97,9 +97,6 @@ impl PackageIdSpec { Some(version) => Some(version.parse::()?), None => None, }; - if name.is_empty() { - bail!("package ID specification must have a name: `{spec}`"); - } validate_package_name(name, "pkgid", "")?; Ok(PackageIdSpec { name: String::from(name), @@ -185,9 +182,6 @@ impl PackageIdSpec { None => (String::from(path_name), None), } }; - if name.is_empty() { - bail!("package ID specification must have a name: `{url}`"); - } validate_package_name(name.as_str(), "pkgid", "")?; Ok(PackageIdSpec { name, diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index d6d7dd531cc..8982b1941a7 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -1546,3 +1546,79 @@ or use environment variable CARGO_REGISTRY_TOKEN", ) .run(); } + +#[cargo_test] +fn config_empty_registry_name() { + let _ = RegistryBuilder::new() + .no_configure_token() + .alternative() + .build(); + let p = project() + .file("src/lib.rs", "") + .file( + ".cargo/config.toml", + "[registry.''] + ", + ) + .build(); + + p.cargo("publish") + .arg("--registry") + .arg("") + .with_status(101) + .with_stderr( + "\ +[ERROR] registry name cannot be empty", + ) + .run(); +} + +#[cargo_test] +fn empty_registry_flag() { + let p = project().file("src/lib.rs", "").build(); + + p.cargo("publish") + .arg("--registry") + .arg("") + .with_status(101) + .with_stderr( + "\ +[ERROR] registry name cannot be empty", + ) + .run(); +} + +#[cargo_test] +fn empty_dependency_registry() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + + [dependencies] + bar = { version = "0.1.0", registry = "" } + "#, + ) + .file( + "src/lib.rs", + " + extern crate bar; + pub fn f() { bar::bar(); } + ", + ) + .build(); + + p.cargo("check") + .with_status(101) + .with_stderr( + "\ +[ERROR] failed to parse manifest at `[CWD]/Cargo.toml` + +Caused by: + registry name cannot be empty", + ) + .run(); +} diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs index 250aeb08512..13553671e3c 100644 --- a/tests/testsuite/build.rs +++ b/tests/testsuite/build.rs @@ -460,7 +460,7 @@ fn cargo_compile_with_empty_package_name() { [ERROR] failed to parse manifest at `[..]` Caused by: - package name cannot be an empty string + package name cannot be empty ", ) .run(); diff --git a/tests/testsuite/cargo_add/empty_dep_name/in b/tests/testsuite/cargo_add/empty_dep_name/in new file mode 120000 index 00000000000..6c6a27fcfb5 --- /dev/null +++ b/tests/testsuite/cargo_add/empty_dep_name/in @@ -0,0 +1 @@ +../add-basic.in \ No newline at end of file diff --git a/tests/testsuite/cargo_add/empty_dep_name/mod.rs b/tests/testsuite/cargo_add/empty_dep_name/mod.rs new file mode 100644 index 00000000000..d7044ee1178 --- /dev/null +++ b/tests/testsuite/cargo_add/empty_dep_name/mod.rs @@ -0,0 +1,24 @@ +use cargo_test_support::compare::assert_ui; +use cargo_test_support::prelude::*; +use cargo_test_support::Project; + +use cargo_test_support::curr_dir; + +#[cargo_test] +fn case() { + cargo_test_support::registry::init(); + let project = Project::from_template(curr_dir!().join("in")); + let project_root = project.root(); + let cwd = &project_root; + + snapbox::cmd::Command::cargo_ui() + .arg("add") + .arg_line("@1.2.3") + .current_dir(cwd) + .assert() + .failure() + .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_add/empty_dep_name/out/Cargo.toml b/tests/testsuite/cargo_add/empty_dep_name/out/Cargo.toml new file mode 100644 index 00000000000..3ecdb668167 --- /dev/null +++ b/tests/testsuite/cargo_add/empty_dep_name/out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] + +[package] +name = "cargo-list-test-fixture" +version = "0.0.0" diff --git a/tests/testsuite/cargo_add/empty_dep_name/stderr.log b/tests/testsuite/cargo_add/empty_dep_name/stderr.log new file mode 100644 index 00000000000..1bb057cd14d --- /dev/null +++ b/tests/testsuite/cargo_add/empty_dep_name/stderr.log @@ -0,0 +1 @@ +error: dependency name cannot be empty diff --git a/tests/testsuite/cargo_add/empty_dep_name/stdout.log b/tests/testsuite/cargo_add/empty_dep_name/stdout.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_add/mod.rs b/tests/testsuite/cargo_add/mod.rs index 47f5ba0e574..653c2db94cb 100644 --- a/tests/testsuite/cargo_add/mod.rs +++ b/tests/testsuite/cargo_add/mod.rs @@ -17,6 +17,7 @@ mod dev; mod dev_build_conflict; mod dev_prefer_existing_version; mod dry_run; +mod empty_dep_name; mod empty_dep_table; mod features; mod features_activated_over_limit; diff --git a/tests/testsuite/cargo_new/empty_name/in/.keep b/tests/testsuite/cargo_new/empty_name/in/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_new/empty_name/mod.rs b/tests/testsuite/cargo_new/empty_name/mod.rs new file mode 100644 index 00000000000..a7d56630fb5 --- /dev/null +++ b/tests/testsuite/cargo_new/empty_name/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(["foo", "--name", ""]) + .current_dir(cwd) + .assert() + .failure() + .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/empty_name/out/.keep b/tests/testsuite/cargo_new/empty_name/out/.keep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_new/empty_name/stderr.log b/tests/testsuite/cargo_new/empty_name/stderr.log new file mode 100644 index 00000000000..d9547a42acf --- /dev/null +++ b/tests/testsuite/cargo_new/empty_name/stderr.log @@ -0,0 +1 @@ +error: package name cannot be empty diff --git a/tests/testsuite/cargo_new/empty_name/stdout.log b/tests/testsuite/cargo_new/empty_name/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 da030440975..806bd2ec375 100644 --- a/tests/testsuite/cargo_new/mod.rs +++ b/tests/testsuite/cargo_new/mod.rs @@ -4,6 +4,7 @@ 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 empty_name; mod help; mod inherit_workspace_lints; mod inherit_workspace_package_table; diff --git a/tests/testsuite/patch.rs b/tests/testsuite/patch.rs index a467f60b5a2..a4522e82219 100644 --- a/tests/testsuite/patch.rs +++ b/tests/testsuite/patch.rs @@ -2700,3 +2700,86 @@ perhaps a crate was updated and forgotten to be re-vendored?"#, ) .run(); } + +#[cargo_test] +fn from_config_empty() { + Package::new("bar", "0.1.0").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [dependencies] + bar = "0.1.0" + "#, + ) + .file( + ".cargo/config.toml", + r#" + [patch.''] + bar = { path = 'bar' } + "#, + ) + .file("src/lib.rs", "") + .file("bar/Cargo.toml", &basic_manifest("bar", "0.1.1")) + .file("bar/src/lib.rs", r#""#) + .build(); + + p.cargo("check") + .with_status(101) + .with_stderr( + "\ +[ERROR] [patch] entry `` should be a URL or registry name + +Caused by: + invalid url ``: relative URL without a base +", + ) + .run(); +} + +#[cargo_test] +fn from_manifest_empty() { + Package::new("bar", "0.1.0").publish(); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [dependencies] + bar = "0.1.0" + + [patch.''] + bar = { path = 'bar' } + "#, + ) + .file("src/lib.rs", "") + .file("bar/Cargo.toml", &basic_manifest("bar", "0.1.1")) + .file("bar/src/lib.rs", r#""#) + .build(); + + p.cargo("check") + .with_status(101) + .with_stderr( + "\ +[ERROR] failed to parse manifest at `[CWD]/Cargo.toml` + +Caused by: + [patch] entry `` should be a URL or registry name + +Caused by: + invalid url ``: relative URL without a base +", + ) + .run(); +}