Skip to content

Commit 80c1ad5

Browse files
committed
fix(embedded): Extend sanitization rules to cover cargo-new validation
1 parent dd69350 commit 80c1ad5

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

src/cargo/ops/cargo_new.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ fn get_name<'a>(path: &'a Path, opts: &'a NewOptions) -> CargoResult<&'a str> {
163163
})
164164
}
165165

166+
/// See also `util::toml::embedded::sanitize_name`
166167
fn check_name(
167168
name: &str,
168169
show_name_help: bool,

src/cargo/util/toml/embedded.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ fn write(
8787
// more common convention for CLIs
8888
'-'
8989
};
90-
let name = sanitize_package_name(file_name.as_ref(), separator);
90+
let name = sanitize_name(file_name.as_ref(), separator);
9191

9292
let mut workspace_root = target_dir.to_owned();
9393
workspace_root.push("eval");
@@ -154,7 +154,7 @@ fn expand_manifest_(script: &RawScript, config: &Config) -> CargoResult<toml::Ta
154154
// more common convention for CLIs
155155
'-'
156156
};
157-
let name = sanitize_package_name(file_name.as_ref(), separator);
157+
let name = sanitize_name(file_name.as_ref(), separator);
158158
let hash = hash(script);
159159
let bin_name = format!("{name}{separator}{hash}");
160160
package
@@ -207,8 +207,27 @@ fn expand_manifest_(script: &RawScript, config: &Config) -> CargoResult<toml::Ta
207207
Ok(manifest)
208208
}
209209

210-
fn sanitize_package_name(name: &str, placeholder: char) -> String {
211-
restricted_names::sanitize_package_name(name, placeholder)
210+
/// Ensure the package name matches the validation from `opt::cargo_new::check_name`
211+
fn sanitize_name(name: &str, placeholder: char) -> String {
212+
let mut name = restricted_names::sanitize_package_name(name, placeholder);
213+
214+
loop {
215+
if restricted_names::is_keyword(&name) {
216+
name.push(placeholder);
217+
} else if restricted_names::is_conflicting_artifact_name(&name) {
218+
// Being an embedded manifest, we always assume it is a `[[bin]]`
219+
name.push(placeholder);
220+
} else if name == "test" {
221+
name.push(placeholder);
222+
} else if restricted_names::is_windows_reserved(&name) {
223+
// Go ahead and be consistent across platforms
224+
name.push(placeholder);
225+
} else {
226+
break;
227+
}
228+
}
229+
230+
name
212231
}
213232

214233
fn hash(script: &RawScript) -> blake3::Hash {
@@ -443,12 +462,12 @@ mod test_expand {
443462
fn test_default() {
444463
snapbox::assert_eq(
445464
r#"[[bin]]
446-
name = "test-a472c7a31645d310613df407eab80844346938a3b8fe4f392cae059cb181aa85"
465+
name = "test--a472c7a31645d310613df407eab80844346938a3b8fe4f392cae059cb181aa85"
447466
path = "/home/me/test.rs"
448467
449468
[package]
450469
edition = "2021"
451-
name = "test"
470+
name = "test-"
452471
publish = false
453472
version = "0.0.0"
454473
@@ -465,15 +484,15 @@ strip = true
465484
fn test_dependencies() {
466485
snapbox::assert_eq(
467486
r#"[[bin]]
468-
name = "test-3a1fa07700654ea2e893f70bb422efa7884eb1021ccacabc5466efe545da8a0b"
487+
name = "test--3a1fa07700654ea2e893f70bb422efa7884eb1021ccacabc5466efe545da8a0b"
469488
path = "/home/me/test.rs"
470489
471490
[dependencies]
472491
time = "0.1.25"
473492
474493
[package]
475494
edition = "2021"
476-
name = "test"
495+
name = "test-"
477496
publish = false
478497
version = "0.0.0"
479498

0 commit comments

Comments
 (0)