|
3 | 3 | use crate::auth::AuthCheck;
|
4 | 4 | use crate::background_jobs::{Job, PRIORITY_RENDER_README};
|
5 | 5 | use axum::body::Bytes;
|
| 6 | +use cargo_manifest::{Dependency, DepsSet, TargetDepsSet}; |
6 | 7 | use crates_io_tarball::{process_tarball, TarballError};
|
7 | 8 | use diesel::connection::DefaultLoadingMode;
|
8 | 9 | use diesel::dsl::{exists, select};
|
@@ -284,12 +285,19 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
|
284 | 285 | VersionAction::Publish,
|
285 | 286 | )?;
|
286 | 287 |
|
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 { |
288 | 296 | validate_dependency(dep)?;
|
289 | 297 | }
|
290 | 298 |
|
291 | 299 | // Link this new version to all dependencies
|
292 |
| - add_dependencies(conn, &metadata.deps, version.id)?; |
| 300 | + add_dependencies(conn, &deps, version.id)?; |
293 | 301 |
|
294 | 302 | // Update all keywords for this crate
|
295 | 303 | Keyword::update_crate(conn, &krate, &keywords)?;
|
@@ -434,6 +442,76 @@ fn missing_metadata_error_message(missing: &[&str]) -> String {
|
434 | 442 | )
|
435 | 443 | }
|
436 | 444 |
|
| 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 | + |
437 | 515 | pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> {
|
438 | 516 | if !Crate::valid_name(&dep.name) {
|
439 | 517 | return Err(cargo_err(&format_args!(
|
|
0 commit comments