Skip to content

Commit 3b4f146

Browse files
committed
publish: Read dependencies metadata from embedded Cargo.toml file
1 parent 0ad1d9d commit 3b4f146

File tree

4 files changed

+82
-6
lines changed

4 files changed

+82
-6
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ axum = { version = "=0.6.20", features = ["headers", "macros", "matched-path"] }
3838
axum-extra = { version = "=0.8.0", features = ["cookie-signed"] }
3939
base64 = "=0.21.4"
4040
bigdecimal = "=0.4.1"
41+
cargo-manifest = "=0.12.0"
4142
crates_io_index = { path = "crates_io_index" }
4243
crates_io_markdown = { path = "crates_io_markdown" }
4344
crates_io_tarball = { path = "crates_io_tarball" }
@@ -98,7 +99,6 @@ url = "=2.4.1"
9899

99100
[dev-dependencies]
100101
bytes = "=1.5.0"
101-
cargo-manifest = "=0.12.0"
102102
crates_io_index = { path = "crates_io_index", features = ["testing"] }
103103
crates_io_tarball = { path = "crates_io_tarball", features = ["builder"] }
104104
claims = "=0.7.1"

src/controllers/krate/publish.rs

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use crate::auth::AuthCheck;
44
use crate::background_jobs::{Job, PRIORITY_RENDER_README};
55
use axum::body::Bytes;
6+
use cargo_manifest::{Dependency, DepsSet, TargetDepsSet};
67
use crates_io_tarball::{process_tarball, TarballError};
78
use diesel::connection::DefaultLoadingMode;
89
use diesel::dsl::{exists, select};
@@ -284,12 +285,19 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
284285
VersionAction::Publish,
285286
)?;
286287

287-
for dep in &metadata.deps {
288+
let deps = convert_dependencies(
289+
tarball_info.manifest.dependencies.as_ref(),
290+
tarball_info.manifest.dev_dependencies.as_ref(),
291+
tarball_info.manifest.build_dependencies.as_ref(),
292+
tarball_info.manifest.target.as_ref()
293+
);
294+
295+
for dep in &deps {
288296
validate_dependency(dep)?;
289297
}
290298

291299
// Link this new version to all dependencies
292-
add_dependencies(conn, &metadata.deps, version.id)?;
300+
add_dependencies(conn, &deps, version.id)?;
293301

294302
// Update all keywords for this crate
295303
Keyword::update_crate(conn, &krate, &keywords)?;
@@ -434,6 +442,76 @@ fn missing_metadata_error_message(missing: &[&str]) -> String {
434442
)
435443
}
436444

445+
fn convert_dependencies(
446+
normal_deps: Option<&DepsSet>,
447+
dev_deps: Option<&DepsSet>,
448+
build_deps: Option<&DepsSet>,
449+
targets: Option<&TargetDepsSet>,
450+
) -> Vec<EncodableCrateDependency> {
451+
use DependencyKind as Kind;
452+
453+
let mut result = vec![];
454+
455+
let mut add = |deps_set: &DepsSet, kind: Kind, target: Option<&str>| {
456+
for (name, dep) in deps_set {
457+
result.push(convert_dependency(name, dep, kind, target));
458+
}
459+
};
460+
461+
if let Some(deps) = normal_deps {
462+
add(deps, Kind::Normal, None);
463+
}
464+
if let Some(deps) = dev_deps {
465+
add(deps, Kind::Dev, None);
466+
}
467+
if let Some(deps_set) = build_deps {
468+
add(deps_set, Kind::Build, None);
469+
}
470+
if let Some(target_deps_set) = targets {
471+
for (target, deps) in target_deps_set {
472+
add(&deps.dependencies, Kind::Normal, Some(target));
473+
add(&deps.dev_dependencies, Kind::Dev, Some(target));
474+
add(&deps.build_dependencies, Kind::Build, Some(target));
475+
}
476+
}
477+
478+
result
479+
}
480+
481+
fn convert_dependency(
482+
name: &str,
483+
dep: &Dependency,
484+
kind: DependencyKind,
485+
target: Option<&str>,
486+
) -> EncodableCrateDependency {
487+
let details = dep.detail();
488+
let req = dep.req();
489+
490+
let (crate_name, explicit_name_in_toml) = match details.and_then(|it| it.package.clone()) {
491+
None => (name.to_string(), None),
492+
Some(package) => (package, Some(name.to_string())),
493+
};
494+
495+
let optional = details.and_then(|it| it.optional).unwrap_or(false);
496+
let default_features = details.and_then(|it| it.default_features).unwrap_or(true);
497+
let features = details
498+
.and_then(|it| it.features.clone())
499+
.unwrap_or_default();
500+
let registry = details.and_then(|it| it.registry.clone());
501+
502+
EncodableCrateDependency {
503+
name: crate_name,
504+
version_req: req.to_string(),
505+
optional,
506+
default_features,
507+
features,
508+
target: target.map(ToString::to_string),
509+
kind: Some(kind),
510+
explicit_name_in_toml,
511+
registry,
512+
}
513+
}
514+
437515
pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> {
438516
if !Crate::valid_name(&dep.name) {
439517
return Err(cargo_err(&format_args!(

src/tests/builders/publish.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ impl PublishBuilder {
136136
let metadata = u::PublishMetadata {
137137
name: u::EncodableCrateName(self.krate_name.clone()),
138138
vers: u::EncodableCrateVersion(self.version.clone()),
139-
deps: self.deps.clone(),
140139
readme: self.readme,
141140
readme_file: None,
142141
};

src/views/krate_publish.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ use crate::models::DependencyKind;
1414
pub struct PublishMetadata {
1515
pub name: EncodableCrateName,
1616
pub vers: EncodableCrateVersion,
17-
pub deps: Vec<EncodableCrateDependency>,
1817
pub readme: Option<String>,
1918
pub readme_file: Option<String>,
2019
}
2120

22-
#[derive(Serialize, Deserialize, Clone, Debug)]
21+
#[derive(Debug)]
2322
pub struct EncodableCrateDependency {
2423
pub optional: bool,
2524
pub default_features: bool,

0 commit comments

Comments
 (0)