|
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};
|
@@ -305,12 +306,19 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
|
305 | 306 | VersionAction::Publish,
|
306 | 307 | )?;
|
307 | 308 |
|
308 |
| - for dep in &metadata.deps { |
| 309 | + let deps = convert_dependencies( |
| 310 | + tarball_info.manifest.dependencies.as_ref(), |
| 311 | + tarball_info.manifest.dev_dependencies.as_ref(), |
| 312 | + tarball_info.manifest.build_dependencies.as_ref(), |
| 313 | + tarball_info.manifest.target.as_ref() |
| 314 | + ); |
| 315 | + |
| 316 | + for dep in &deps { |
309 | 317 | validate_dependency(dep)?;
|
310 | 318 | }
|
311 | 319 |
|
312 | 320 | // Link this new version to all dependencies
|
313 |
| - add_dependencies(conn, &metadata.deps, version.id)?; |
| 321 | + add_dependencies(conn, &deps, version.id)?; |
314 | 322 |
|
315 | 323 | // Update all keywords for this crate
|
316 | 324 | Keyword::update_crate(conn, &krate, &keywords)?;
|
@@ -455,6 +463,76 @@ fn missing_metadata_error_message(missing: &[&str]) -> String {
|
455 | 463 | )
|
456 | 464 | }
|
457 | 465 |
|
| 466 | +fn convert_dependencies( |
| 467 | + normal_deps: Option<&DepsSet>, |
| 468 | + dev_deps: Option<&DepsSet>, |
| 469 | + build_deps: Option<&DepsSet>, |
| 470 | + targets: Option<&TargetDepsSet>, |
| 471 | +) -> Vec<EncodableCrateDependency> { |
| 472 | + use DependencyKind as Kind; |
| 473 | + |
| 474 | + let mut result = vec![]; |
| 475 | + |
| 476 | + let mut add = |deps_set: &DepsSet, kind: Kind, target: Option<&str>| { |
| 477 | + for (name, dep) in deps_set { |
| 478 | + result.push(convert_dependency(name, dep, kind, target)); |
| 479 | + } |
| 480 | + }; |
| 481 | + |
| 482 | + if let Some(deps) = normal_deps { |
| 483 | + add(deps, Kind::Normal, None); |
| 484 | + } |
| 485 | + if let Some(deps) = dev_deps { |
| 486 | + add(deps, Kind::Dev, None); |
| 487 | + } |
| 488 | + if let Some(deps_set) = build_deps { |
| 489 | + add(deps_set, Kind::Build, None); |
| 490 | + } |
| 491 | + if let Some(target_deps_set) = targets { |
| 492 | + for (target, deps) in target_deps_set { |
| 493 | + add(&deps.dependencies, Kind::Normal, Some(target)); |
| 494 | + add(&deps.dev_dependencies, Kind::Dev, Some(target)); |
| 495 | + add(&deps.build_dependencies, Kind::Build, Some(target)); |
| 496 | + } |
| 497 | + } |
| 498 | + |
| 499 | + result |
| 500 | +} |
| 501 | + |
| 502 | +fn convert_dependency( |
| 503 | + name: &str, |
| 504 | + dep: &Dependency, |
| 505 | + kind: DependencyKind, |
| 506 | + target: Option<&str>, |
| 507 | +) -> EncodableCrateDependency { |
| 508 | + let details = dep.detail(); |
| 509 | + let req = dep.req(); |
| 510 | + |
| 511 | + let (crate_name, explicit_name_in_toml) = match details.and_then(|it| it.package.clone()) { |
| 512 | + None => (name.to_string(), None), |
| 513 | + Some(package) => (package, Some(name.to_string())), |
| 514 | + }; |
| 515 | + |
| 516 | + let optional = details.and_then(|it| it.optional).unwrap_or(false); |
| 517 | + let default_features = details.and_then(|it| it.default_features).unwrap_or(true); |
| 518 | + let features = details |
| 519 | + .and_then(|it| it.features.clone()) |
| 520 | + .unwrap_or_default(); |
| 521 | + let registry = details.and_then(|it| it.registry.clone()); |
| 522 | + |
| 523 | + EncodableCrateDependency { |
| 524 | + name: crate_name, |
| 525 | + version_req: req.to_string(), |
| 526 | + optional, |
| 527 | + default_features, |
| 528 | + features, |
| 529 | + target: target.map(ToString::to_string), |
| 530 | + kind: Some(kind), |
| 531 | + explicit_name_in_toml, |
| 532 | + registry, |
| 533 | + } |
| 534 | +} |
| 535 | + |
458 | 536 | pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> {
|
459 | 537 | if !Crate::valid_name(&dep.name) {
|
460 | 538 | return Err(cargo_err(&format_args!(
|
|
0 commit comments