diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index 9bbcc6d9f54..6108e30fd6d 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 { + "\nIf you need a crate name to not match the directory name, consider using --name flag." + } 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; diff --git a/tests/testsuite/init.rs b/tests/testsuite/init.rs index 9cbcdf0686a..aab8b2093e5 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 4cc14e1dd14..32dbafe9814 100644 --- a/tests/testsuite/new.rs +++ b/tests/testsuite/new.rs @@ -116,7 +116,12 @@ 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`, [..] +If you need a crate name to not match the directory name, consider using --name flag. +", + ) .run(); } @@ -124,7 +129,12 @@ 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 [..] +If you need a crate name to not match the directory name, consider using --name flag. +", + ) .run(); } @@ -133,7 +143,10 @@ 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 [..] +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); @@ -153,7 +166,12 @@ 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 +If you need a crate name to not match the directory name, consider using --name flag. +", + ) .run(); } @@ -522,7 +540,12 @@ 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 +If you need a crate name to not match the directory name, consider using --name flag. +", + ) .run(); } else { cargo_process("new nul") @@ -559,8 +582,11 @@ 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 `_`) +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); @@ -568,8 +594,11 @@ 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) +If you need a crate name to not match the directory name, consider using --name flag. +", ) .run(); }