Skip to content

Commit c495ff4

Browse files
committed
Do not allow create name starts with _
Signed-off-by: hi-rustin <rustin.liu@gmail.com>
1 parent b23fe07 commit c495ff4

File tree

3 files changed

+55
-14
lines changed

3 files changed

+55
-14
lines changed

src/models/krate.rs

+53-12
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,48 @@ impl Crate {
199199
name, MAX_NAME_LENGTH
200200
)));
201201
}
202-
Crate::valid_ident(name, "crate name")
202+
Crate::valid_create_ident(name)
203+
}
204+
205+
// Checks that the name is a valid crate name.
206+
// 1. The name must be non-empty.
207+
// 2. The first character must be an ASCII character.
208+
// 3. The remaining characters must be ASCII alphanumerics or `-` or `_`.
209+
// Note: This is different from `valid_dependency_name` because it allows
210+
// `_` as the first character.
211+
fn valid_create_ident(name: &str) -> AppResult<()> {
212+
if name.is_empty() {
213+
return Err(cargo_err("the crate name cannot be an empty"));
214+
}
215+
let mut chars = name.chars();
216+
if let Some(ch) = chars.next() {
217+
if ch.is_ascii_digit() {
218+
return Err(cargo_err(&format!(
219+
"the name `{}` cannot be used as a crate name, \
220+
the name cannot start with a digit",
221+
name,
222+
)));
223+
}
224+
if !ch.is_ascii_alphabetic() {
225+
return Err(cargo_err(&format!(
226+
"invalid character `{}` in crate name: `{}`, \
227+
the first character must be an ASCII character",
228+
ch, name
229+
)));
230+
}
231+
}
232+
233+
for ch in chars {
234+
if !(ch.is_ascii_alphanumeric() || ch == '-' || ch == '_') {
235+
return Err(cargo_err(&format!(
236+
"invalid character `{}` in crate name: `{}`, \
237+
characters must be an ASCII alphanumeric characters, `-`, or `_`",
238+
ch, name
239+
)));
240+
}
241+
}
242+
243+
Ok(())
203244
}
204245

205246
pub fn valid_dependency_name(name: &str) -> AppResult<()> {
@@ -209,41 +250,41 @@ impl Crate {
209250
name, MAX_NAME_LENGTH
210251
)));
211252
}
212-
Crate::valid_ident(name, "dependency name")
253+
Crate::valid_dependency_ident(name)
213254
}
214255

215-
// Checks that the name is a valid identifier.
256+
// Checks that the name is a valid dependency name.
216257
// 1. The name must be non-empty.
217258
// 2. The first character must be an ASCII character or `_`.
218259
// 3. The remaining characters must be ASCII alphanumerics or `-` or `_`.
219-
fn valid_ident(name: &str, what: &str) -> AppResult<()> {
260+
fn valid_dependency_ident(name: &str) -> AppResult<()> {
220261
if name.is_empty() {
221-
return Err(cargo_err(&format!("the {} cannot be an empty", what)));
262+
return Err(cargo_err("the dependency name cannot be an empty"));
222263
}
223264
let mut chars = name.chars();
224265
if let Some(ch) = chars.next() {
225266
if ch.is_ascii_digit() {
226267
return Err(cargo_err(&format!(
227-
"the name `{}` cannot be used as a {}, \
268+
"the name `{}` cannot be used as a dependency name, \
228269
the name cannot start with a digit",
229-
name, what,
270+
name,
230271
)));
231272
}
232273
if !(ch.is_ascii_alphabetic() || ch == '_') {
233274
return Err(cargo_err(&format!(
234-
"invalid character `{}` in {}: `{}`, \
275+
"invalid character `{}` in dependency name: `{}`, \
235276
the first character must be an ASCII character, or `_`",
236-
ch, what, name
277+
ch, name
237278
)));
238279
}
239280
}
240281

241282
for ch in chars {
242283
if !(ch.is_ascii_alphanumeric() || ch == '-' || ch == '_') {
243284
return Err(cargo_err(&format!(
244-
"invalid character `{}` in {}: `{}`, \
285+
"invalid character `{}` in dependency name: `{}`, \
245286
characters must be an ASCII alphanumeric characters, `-`, or `_`",
246-
ch, what, name
287+
ch, name
247288
)));
248289
}
249290
}
@@ -549,7 +590,7 @@ mod tests {
549590
assert!(Crate::valid_name("foo_underscore").is_ok());
550591
assert!(Crate::valid_name("foo-dash").is_ok());
551592
assert!(Crate::valid_name("foo+plus").is_err());
552-
assert!(Crate::valid_name("_foo").is_ok());
593+
assert!(Crate::valid_name("_foo").is_err());
553594
assert!(Crate::valid_name("-foo").is_err());
554595
}
555596

src/tests/krate/publish/snapshots/all__krate__publish__dependencies__invalid_dependency_name.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: response.into_json()
55
{
66
"errors": [
77
{
8-
"detail": "invalid character `🦀` in crate name: `🦀`, the first character must be an ASCII character, or `_`"
8+
"detail": "invalid character `🦀` in crate name: `🦀`, the first character must be an ASCII character"
99
}
1010
]
1111
}

src/tests/krate/publish/snapshots/all__krate__publish__validation__invalid_names-5.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: response.into_json()
55
{
66
"errors": [
77
{
8-
"detail": "invalid character `á` in crate name: `áccênts`, the first character must be an ASCII character, or `_`"
8+
"detail": "invalid character `á` in crate name: `áccênts`, the first character must be an ASCII character"
99
}
1010
]
1111
}

0 commit comments

Comments
 (0)