Skip to content

Commit ddde0a8

Browse files
committed
publish: Move dependency name validation to validate_dependencies() fn
1 parent 4abc0cf commit ddde0a8

File tree

4 files changed

+18
-8
lines changed

4 files changed

+18
-8
lines changed

src/controllers/krate/publish.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use tokio::runtime::Handle;
1414
use url::Url;
1515

1616
use crate::controllers::cargo_prelude::*;
17+
use crate::models::krate::MAX_NAME_LENGTH;
1718
use crate::models::{
1819
insert_version_owner_action, Category, Crate, DependencyKind, Keyword, NewCrate, NewVersion,
1920
Rights, VersionAction,
@@ -433,9 +434,18 @@ fn missing_metadata_error_message(missing: &[&str]) -> String {
433434
#[instrument(skip_all)]
434435
pub fn validate_dependencies(deps: &[EncodableCrateDependency]) -> AppResult<()> {
435436
for dep in deps {
437+
if !Crate::valid_name(&dep.name) {
438+
return Err(cargo_err(&format_args!(
439+
"\"{}\" is an invalid dependency name (dependency names must \
440+
start with a letter, contain only letters, numbers, hyphens, \
441+
or underscores and have at most {MAX_NAME_LENGTH} characters)",
442+
dep.name
443+
)));
444+
}
445+
436446
if let Some(registry) = &dep.registry {
437447
if !registry.is_empty() {
438-
return Err(cargo_err(&format_args!("Dependency `{}` is hosted on another registry. Cross-registry dependencies are not permitted on crates.io.", &*dep.name)));
448+
return Err(cargo_err(&format_args!("Dependency `{}` is hosted on another registry. Cross-registry dependencies are not permitted on crates.io.", dep.name)));
439449
}
440450
}
441451

@@ -444,7 +454,7 @@ pub fn validate_dependencies(deps: &[EncodableCrateDependency]) -> AppResult<()>
444454
return Err(cargo_err(&format_args!("wildcard (`*`) dependency constraints are not allowed \
445455
on crates.io. Crate with this problem: `{}` See https://doc.rust-lang.org/cargo/faq.html#can-\
446456
libraries-use--as-a-version-for-their-dependencies for more \
447-
information", &*dep.name)));
457+
information", dep.name)));
448458
}
449459
}
450460
}
@@ -462,18 +472,18 @@ pub fn add_dependencies(
462472

463473
let crate_ids = crates::table
464474
.select((crates::name, crates::id))
465-
.filter(crates::name.eq_any(deps.iter().map(|d| &d.name.0)))
475+
.filter(crates::name.eq_any(deps.iter().map(|d| &d.name)))
466476
.load_iter::<(String, i32), DefaultLoadingMode>(conn)?
467477
.collect::<QueryResult<HashMap<_, _>>>()?;
468478

469479
let new_dependencies = deps
470480
.iter()
471481
.map(|dep| {
472482
// Match only identical names to ensure the index always references the original crate name
473-
let Some(&crate_id) = crate_ids.get(&dep.name.0) else {
483+
let Some(&crate_id) = crate_ids.get(&dep.name) else {
474484
return Err(cargo_err(&format_args!(
475485
"no known crate named `{}`",
476-
&*dep.name
486+
dep.name
477487
)));
478488
};
479489

src/tests/builders/dependency.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl DependencyBuilder {
6060
.collect();
6161

6262
u::EncodableCrateDependency {
63-
name: u::EncodableCrateName(self.name),
63+
name: self.name,
6464
optional: false,
6565
default_features: true,
6666
features,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: response.into_json()
55
{
66
"errors": [
77
{
8-
"detail": "invalid upload request: invalid value: string \"🦀\", expected a valid crate name to start with a letter, contain only letters, numbers, hyphens, or underscores and have at most 64 characters at line 1 column 92"
8+
"detail": "\"🦀\" is an invalid dependency name (dependency names must start with a letter, contain only letters, numbers, hyphens, or underscores and have at most 64 characters)"
99
}
1010
]
1111
}

src/views/krate_publish.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub struct PublishMetadata {
2626
pub struct EncodableCrateDependency {
2727
pub optional: bool,
2828
pub default_features: bool,
29-
pub name: EncodableCrateName,
29+
pub name: String,
3030
pub features: Vec<EncodableFeature>,
3131
pub version_req: EncodableCrateVersionReq,
3232
pub target: Option<String>,

0 commit comments

Comments
 (0)