From 08a7a8993f0204364488fc82e975fc7ac0262ecc Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 3 Oct 2023 16:25:34 +0200 Subject: [PATCH] publish: Read dependencies metadata from embedded `Cargo.toml` file --- Cargo.toml | 2 +- src/controllers/krate/publish.rs | 82 +++++++++++++++++++++++++++++++- src/tests/builders/publish.rs | 1 - src/views/krate_publish.rs | 3 +- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 24b4209ea05..fd25af28ed3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ axum = { version = "=0.6.20", features = ["headers", "macros", "matched-path"] } axum-extra = { version = "=0.8.0", features = ["cookie-signed"] } base64 = "=0.21.4" bigdecimal = "=0.4.1" +cargo-manifest = "=0.12.0" crates_io_index = { path = "crates_io_index" } crates_io_markdown = { path = "crates_io_markdown" } crates_io_tarball = { path = "crates_io_tarball" } @@ -98,7 +99,6 @@ url = "=2.4.1" [dev-dependencies] bytes = "=1.5.0" -cargo-manifest = "=0.12.0" crates_io_index = { path = "crates_io_index", features = ["testing"] } crates_io_tarball = { path = "crates_io_tarball", features = ["builder"] } claims = "=0.7.1" diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index e5f3e27763c..43b0592e9ae 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -3,6 +3,7 @@ use crate::auth::AuthCheck; use crate::background_jobs::{Job, PRIORITY_RENDER_README}; use axum::body::Bytes; +use cargo_manifest::{Dependency, DepsSet, TargetDepsSet}; use crates_io_tarball::{process_tarball, TarballError}; use diesel::connection::DefaultLoadingMode; use diesel::dsl::{exists, select}; @@ -305,12 +306,19 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult String { ) } +fn convert_dependencies( + normal_deps: Option<&DepsSet>, + dev_deps: Option<&DepsSet>, + build_deps: Option<&DepsSet>, + targets: Option<&TargetDepsSet>, +) -> Vec { + use DependencyKind as Kind; + + let mut result = vec![]; + + let mut add = |deps_set: &DepsSet, kind: Kind, target: Option<&str>| { + for (name, dep) in deps_set { + result.push(convert_dependency(name, dep, kind, target)); + } + }; + + if let Some(deps) = normal_deps { + add(deps, Kind::Normal, None); + } + if let Some(deps) = dev_deps { + add(deps, Kind::Dev, None); + } + if let Some(deps_set) = build_deps { + add(deps_set, Kind::Build, None); + } + if let Some(target_deps_set) = targets { + for (target, deps) in target_deps_set { + add(&deps.dependencies, Kind::Normal, Some(target)); + add(&deps.dev_dependencies, Kind::Dev, Some(target)); + add(&deps.build_dependencies, Kind::Build, Some(target)); + } + } + + result +} + +fn convert_dependency( + name: &str, + dep: &Dependency, + kind: DependencyKind, + target: Option<&str>, +) -> EncodableCrateDependency { + let details = dep.detail(); + let req = dep.req(); + + let (crate_name, explicit_name_in_toml) = match details.and_then(|it| it.package.clone()) { + None => (name.to_string(), None), + Some(package) => (package, Some(name.to_string())), + }; + + let optional = details.and_then(|it| it.optional).unwrap_or(false); + let default_features = details.and_then(|it| it.default_features).unwrap_or(true); + let features = details + .and_then(|it| it.features.clone()) + .unwrap_or_default(); + let registry = details.and_then(|it| it.registry.clone()); + + EncodableCrateDependency { + name: crate_name, + version_req: req.to_string(), + optional, + default_features, + features, + target: target.map(ToString::to_string), + kind: Some(kind), + explicit_name_in_toml, + registry, + } +} + pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> { if !Crate::valid_name(&dep.name) { return Err(cargo_err(&format_args!( diff --git a/src/tests/builders/publish.rs b/src/tests/builders/publish.rs index 2c491b9e457..cc31a739650 100644 --- a/src/tests/builders/publish.rs +++ b/src/tests/builders/publish.rs @@ -136,7 +136,6 @@ impl PublishBuilder { let metadata = u::PublishMetadata { name: self.krate_name.clone(), vers: self.version.to_string(), - deps: self.deps.clone(), readme: self.readme, readme_file: None, }; diff --git a/src/views/krate_publish.rs b/src/views/krate_publish.rs index 66c9dc97494..bb38e5376b2 100644 --- a/src/views/krate_publish.rs +++ b/src/views/krate_publish.rs @@ -11,12 +11,11 @@ use crate::models::DependencyKind; pub struct PublishMetadata { pub name: String, pub vers: String, - pub deps: Vec, pub readme: Option, pub readme_file: Option, } -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Debug)] pub struct EncodableCrateDependency { pub optional: bool, pub default_features: bool,