From 3042ec68b6e5405ecdec73fc25f5fa99704d77e7 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Fri, 4 Sep 2020 01:27:46 +0800 Subject: [PATCH 1/5] Add --name hint for `new` when package name is retricted --- src/cargo/ops/cargo_new.rs | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index 9bbcc6d9f..a9b5938eb 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -154,7 +154,19 @@ fn get_name<'a>(path: &'a Path, opts: &'a NewOptions) -> CargoResult<&'a str> { }) } -fn check_name(name: &str, name_help: &str, has_bin: bool, shell: &mut Shell) -> CargoResult<()> { +fn check_name( + name: &str, + show_name_help: bool, + has_bin: bool, + shell: &mut Shell, +) -> CargoResult<()> { + // If --name is already used to override, no point in suggesting it + // again as a fix. + let name_help = if show_name_help { + "\nuse --name to override crate name" + } else { + "" + }; restricted_names::validate_package_name(name, "crate name", name_help)?; if restricted_names::is_keyword(name) { @@ -363,7 +375,12 @@ pub fn new(opts: &NewOptions, config: &Config) -> CargoResult<()> { } let name = get_name(path, opts)?; - check_name(name, "", opts.kind.is_bin(), &mut config.shell())?; + check_name( + name, + opts.name.is_none(), + opts.kind.is_bin(), + &mut config.shell(), + )?; let mkopts = MkOptions { version_control: opts.version_control, @@ -411,13 +428,7 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> { // user may mean "initialize for library, but also add binary target" } let has_bin = src_paths_types.iter().any(|x| x.bin); - // If --name is already used to override, no point in suggesting it - // again as a fix. - let name_help = match opts.name { - Some(_) => "", - None => "\nuse --name to override crate name", - }; - check_name(name, name_help, has_bin, &mut config.shell())?; + check_name(name, opts.name.is_none(), has_bin, &mut config.shell())?; let mut version_control = opts.version_control; From 9cda385ab327ff765f84193c85e4daf7e6d76b59 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Fri, 4 Sep 2020 08:39:13 +0800 Subject: [PATCH 2/5] Test for --name hint --- tests/testsuite/new.rs | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tests/testsuite/new.rs b/tests/testsuite/new.rs index 4cc14e1dd..0e6aa1187 100644 --- a/tests/testsuite/new.rs +++ b/tests/testsuite/new.rs @@ -116,7 +116,11 @@ fn existing() { fn invalid_characters() { cargo_process("new foo.rs") .with_status(101) - .with_stderr("[ERROR] invalid character `.` in crate name: `foo.rs`, [..]") + .with_stderr( + "\ +[ERROR] invalid character `.` in crate name: `foo.rs`, [..] +use --name to override crate name", + ) .run(); } @@ -124,7 +128,11 @@ fn invalid_characters() { fn reserved_name() { cargo_process("new test") .with_status(101) - .with_stderr("[ERROR] the name `test` cannot be used as a crate name, it conflicts [..]") + .with_stderr( + "\ +[ERROR] the name `test` cannot be used as a crate name, it conflicts [..] +use --name to override crate name", + ) .run(); } @@ -133,7 +141,9 @@ fn reserved_binary_name() { cargo_process("new --bin incremental") .with_status(101) .with_stderr( - "[ERROR] the name `incremental` cannot be used as a crate name, it conflicts [..]", + "\ +[ERROR] the name `incremental` cannot be used as a crate name, it conflicts [..] +use --name to override crate name", ) .run(); @@ -153,7 +163,11 @@ it conflicts with cargo's build directory names fn keyword_name() { cargo_process("new pub") .with_status(101) - .with_stderr("[ERROR] the name `pub` cannot be used as a crate name, it is a Rust keyword") + .with_stderr( + "\ +[ERROR] the name `pub` cannot be used as a crate name, it is a Rust keyword +use --name to override crate name", + ) .run(); } @@ -559,8 +573,10 @@ fn non_ascii_name_invalid() { .env("USER", "foo") .with_status(101) .with_stderr( - "[ERROR] invalid character `Ⓐ` in crate name: `ⒶⒷⒸ`, \ - the first character must be a Unicode XID start character (most letters or `_`)", + "\ +[ERROR] invalid character `Ⓐ` in crate name: `ⒶⒷⒸ`, \ +the first character must be a Unicode XID start character (most letters or `_`) +use --name to override crate name", ) .run(); @@ -568,8 +584,10 @@ fn non_ascii_name_invalid() { .env("USER", "foo") .with_status(101) .with_stderr( - "[ERROR] invalid character `¼` in crate name: `a¼`, \ - characters must be Unicode XID characters (numbers, `-`, `_`, or most letters)", + "\ +[ERROR] invalid character `¼` in crate name: `a¼`, \ +characters must be Unicode XID characters (numbers, `-`, `_`, or most letters) +use --name to override crate name", ) .run(); } From c00ad7922dee8882df1f39b93c0a56ce5ef20401 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Fri, 4 Sep 2020 09:18:47 +0800 Subject: [PATCH 3/5] Fix test for windows reserved filename error message --- tests/testsuite/new.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/testsuite/new.rs b/tests/testsuite/new.rs index 0e6aa1187..a0ac5eec4 100644 --- a/tests/testsuite/new.rs +++ b/tests/testsuite/new.rs @@ -536,7 +536,11 @@ fn restricted_windows_name() { cargo_process("new nul") .env("USER", "foo") .with_status(101) - .with_stderr("[ERROR] cannot use name `nul`, it is a reserved Windows filename") + .with_stderr( + "\ +[ERROR] cannot use name `nul`, it is a reserved Windows filename +use --name to override crate name", + ) .run(); } else { cargo_process("new nul") From 2fbce89dd625bcd49ce7fd75f02d793ce0e1b658 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Thu, 10 Sep 2020 20:52:43 +0800 Subject: [PATCH 4/5] Rephrase message of restricted crate name --- src/cargo/ops/cargo_new.rs | 2 +- tests/testsuite/init.rs | 5 +++-- tests/testsuite/new.rs | 22 +++++++++++++++------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index a9b5938eb..6108e30fd 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -163,7 +163,7 @@ fn check_name( // If --name is already used to override, no point in suggesting it // again as a fix. let name_help = if show_name_help { - "\nuse --name to override crate name" + "\nIf you need a crate name to not match the directory name, consider using --name flag." } else { "" }; diff --git a/tests/testsuite/init.rs b/tests/testsuite/init.rs index 9cbcdf068..aab8b2093 100644 --- a/tests/testsuite/init.rs +++ b/tests/testsuite/init.rs @@ -305,7 +305,8 @@ fn invalid_dir_name() { .with_stderr( "\ [ERROR] invalid character `.` in crate name: `foo.bar`, [..] -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); @@ -323,7 +324,7 @@ fn reserved_name() { .with_stderr( "\ [ERROR] the name `test` cannot be used as a crate name, it conflicts [..]\n\ -use --name to override crate name +If you need a crate name to not match the directory name, consider using --name flag. ", ) .run(); diff --git a/tests/testsuite/new.rs b/tests/testsuite/new.rs index a0ac5eec4..72b0c00bb 100644 --- a/tests/testsuite/new.rs +++ b/tests/testsuite/new.rs @@ -119,7 +119,8 @@ fn invalid_characters() { .with_stderr( "\ [ERROR] invalid character `.` in crate name: `foo.rs`, [..] -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); } @@ -131,7 +132,8 @@ fn reserved_name() { .with_stderr( "\ [ERROR] the name `test` cannot be used as a crate name, it conflicts [..] -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); } @@ -143,7 +145,8 @@ fn reserved_binary_name() { .with_stderr( "\ [ERROR] the name `incremental` cannot be used as a crate name, it conflicts [..] -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); @@ -166,7 +169,8 @@ fn keyword_name() { .with_stderr( "\ [ERROR] the name `pub` cannot be used as a crate name, it is a Rust keyword -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); } @@ -539,7 +543,9 @@ fn restricted_windows_name() { .with_stderr( "\ [ERROR] cannot use name `nul`, it is a reserved Windows filename -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name fla +g. +", ) .run(); } else { @@ -580,7 +586,8 @@ fn non_ascii_name_invalid() { "\ [ERROR] invalid character `Ⓐ` in crate name: `ⒶⒷⒸ`, \ the first character must be a Unicode XID start character (most letters or `_`) -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); @@ -591,7 +598,8 @@ use --name to override crate name", "\ [ERROR] invalid character `¼` in crate name: `a¼`, \ characters must be Unicode XID characters (numbers, `-`, `_`, or most letters) -use --name to override crate name", +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); } From c6fcb0e2efa74131cf456ddf8f3e26a5e65d5aad Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Fri, 11 Sep 2020 01:02:59 +0800 Subject: [PATCH 5/5] Fix unintenional newline in stderr assertion --- tests/testsuite/new.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/testsuite/new.rs b/tests/testsuite/new.rs index 72b0c00bb..32dbafe98 100644 --- a/tests/testsuite/new.rs +++ b/tests/testsuite/new.rs @@ -543,8 +543,7 @@ fn restricted_windows_name() { .with_stderr( "\ [ERROR] cannot use name `nul`, it is a reserved Windows filename -If you need a crate name to not match the directory name, consider using --name fla -g. +If you need a crate name to not match the directory name, consider using --name flag. ", ) .run();