@@ -11,7 +11,9 @@ use cargo_platform::Platform;
11
11
use cargo_util:: paths;
12
12
use cargo_util_schemas:: core:: PartialVersion ;
13
13
use cargo_util_schemas:: manifest;
14
- use cargo_util_schemas:: manifest:: RustVersion ;
14
+ use cargo_util_schemas:: manifest:: {
15
+ InheritableDependency , PackageName , RustVersion , TomlManifest , TomlPlatform ,
16
+ } ;
15
17
use itertools:: Itertools ;
16
18
use lazycell:: LazyCell ;
17
19
use pathdiff:: diff_paths;
@@ -315,15 +317,12 @@ pub fn prepare_for_publish(
315
317
manifest:: StringOrBool :: Bool ( _) => { }
316
318
}
317
319
}
318
- let all = |_d : & manifest:: TomlDependency | true ;
319
320
320
- let target_dep = me. target . as_ref ( ) . map ( |target_map| {
321
- target_map
322
- . iter ( )
323
- . filter_map ( |( _k, v) | v. dev_dependencies . clone ( ) )
324
- . flatten ( )
325
- . collect :: < BTreeMap < _ , _ > > ( )
326
- } ) ;
321
+ let mut published_deps = BTreeSet :: new ( ) ;
322
+ let ( dependencies, dev_dependencies, build_dependencies, target) =
323
+ build_published_deps ( gctx, me, & mut published_deps) ?;
324
+
325
+ let features = map_feature ( me. features . as_ref ( ) , & published_deps) ?;
327
326
return Ok ( manifest:: TomlManifest {
328
327
package : Some ( package) ,
329
328
project : None ,
@@ -333,35 +332,74 @@ pub fn prepare_for_publish(
333
332
example : me. example . clone ( ) ,
334
333
test : me. test . clone ( ) ,
335
334
bench : me. bench . clone ( ) ,
336
- dependencies : map_deps ( gctx, me. dependencies . as_ref ( ) , all) ?,
337
- dev_dependencies : map_deps (
338
- gctx,
339
- me. dev_dependencies ( ) ,
340
- manifest:: TomlDependency :: is_version_specified,
341
- ) ?,
335
+ dependencies,
336
+ dev_dependencies,
342
337
dev_dependencies2 : None ,
343
- build_dependencies : map_deps ( gctx , me . build_dependencies ( ) , all ) ? ,
338
+ build_dependencies,
344
339
build_dependencies2 : None ,
345
- features : map_feature (
346
- me. features . as_ref ( ) ,
347
- me. dev_dependencies ( ) ,
348
- target_dep. as_ref ( ) ,
349
- ) ?,
350
- target : match me. target . as_ref ( ) . map ( |target_map| {
340
+ features,
341
+ target,
342
+ replace : None ,
343
+ patch : None ,
344
+ workspace : None ,
345
+ badges : me. badges . clone ( ) ,
346
+ cargo_features : me. cargo_features . clone ( ) ,
347
+ lints : me. lints . clone ( ) ,
348
+ } ) ;
349
+
350
+ fn build_published_deps (
351
+ gctx : & GlobalContext ,
352
+ me : & TomlManifest ,
353
+ published_deps : & mut BTreeSet < manifest:: PackageName > ,
354
+ ) -> CargoResult < (
355
+ Option < BTreeMap < PackageName , InheritableDependency > > ,
356
+ Option < BTreeMap < PackageName , InheritableDependency > > ,
357
+ Option < BTreeMap < PackageName , InheritableDependency > > ,
358
+ Option < BTreeMap < String , TomlPlatform > > ,
359
+ ) > {
360
+ fn insert_deps (
361
+ published_dep : & mut BTreeSet < manifest:: PackageName > ,
362
+ deps : Option < & BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
363
+ ) {
364
+ if let Some ( deps) = deps {
365
+ for ( dep_name, _dep) in deps {
366
+ if published_dep. get ( dep_name) . is_none ( ) {
367
+ published_dep. insert ( dep_name. clone ( ) ) ;
368
+ }
369
+ }
370
+ } ;
371
+ }
372
+ let all = |_d : & manifest:: TomlDependency | true ;
373
+ let dependencies = map_deps ( gctx, me. dependencies . as_ref ( ) , all) ?;
374
+ let dev_dependencies = map_deps (
375
+ gctx,
376
+ me. dev_dependencies . as_ref ( ) ,
377
+ manifest:: TomlDependency :: is_version_specified,
378
+ ) ?;
379
+ let build_dependencies = map_deps ( gctx, me. build_dependencies ( ) , all) ?;
380
+ let target = match me. target . as_ref ( ) . map ( |target_map| {
351
381
target_map
352
382
. iter ( )
353
383
. map ( |( k, v) | {
384
+ let dependencies = map_deps ( gctx, v. dependencies . as_ref ( ) , all) ?;
385
+
386
+ let dev_dependencies = map_deps (
387
+ gctx,
388
+ v. dev_dependencies . as_ref ( ) ,
389
+ manifest:: TomlDependency :: is_version_specified,
390
+ ) ?;
391
+ let build_dependencies = map_deps ( gctx, v. build_dependencies ( ) , all) ?;
392
+
393
+ insert_deps ( published_deps, dependencies. as_ref ( ) ) ;
394
+ insert_deps ( published_deps, dev_dependencies. as_ref ( ) ) ;
395
+ insert_deps ( published_deps, build_dependencies. as_ref ( ) ) ;
354
396
Ok ( (
355
397
k. clone ( ) ,
356
398
manifest:: TomlPlatform {
357
- dependencies : map_deps ( gctx, v. dependencies . as_ref ( ) , all) ?,
358
- dev_dependencies : map_deps (
359
- gctx,
360
- v. dev_dependencies ( ) ,
361
- manifest:: TomlDependency :: is_version_specified,
362
- ) ?,
399
+ dependencies,
400
+ dev_dependencies,
363
401
dev_dependencies2 : None ,
364
- build_dependencies : map_deps ( gctx , v . build_dependencies ( ) , all ) ? ,
402
+ build_dependencies,
365
403
build_dependencies2 : None ,
366
404
} ,
367
405
) )
@@ -371,19 +409,16 @@ pub fn prepare_for_publish(
371
409
Some ( Ok ( v) ) => Some ( v) ,
372
410
Some ( Err ( e) ) => return Err ( e) ,
373
411
None => None ,
374
- } ,
375
- replace : None ,
376
- patch : None ,
377
- workspace : None ,
378
- badges : me. badges . clone ( ) ,
379
- cargo_features : me. cargo_features . clone ( ) ,
380
- lints : me. lints . clone ( ) ,
381
- } ) ;
412
+ } ;
413
+ insert_deps ( published_deps, dependencies. as_ref ( ) ) ;
414
+ insert_deps ( published_deps, dev_dependencies. as_ref ( ) ) ;
415
+ insert_deps ( published_deps, build_dependencies. as_ref ( ) ) ;
416
+ Ok ( ( dependencies, dev_dependencies, build_dependencies, target) )
417
+ }
382
418
383
419
fn map_feature (
384
420
features : Option < & BTreeMap < manifest:: FeatureName , Vec < String > > > ,
385
- dev_deps : Option < & BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
386
- target_deps : Option < & BTreeMap < manifest:: PackageName , manifest:: InheritableDependency > > ,
421
+ published_deps : & BTreeSet < PackageName > ,
387
422
) -> CargoResult < Option < BTreeMap < manifest:: FeatureName , Vec < String > > > > {
388
423
let Some ( features) = features else {
389
424
return Ok ( None ) ;
@@ -400,21 +435,7 @@ pub fn prepare_for_publish(
400
435
| FeatureValue :: DepFeature { dep_name, .. } => {
401
436
let k = & manifest:: PackageName :: new ( dep_name. to_string ( ) ) . unwrap ( ) ;
402
437
403
- if let Some ( dev_deps) = dev_deps {
404
- if let Some ( dep) = dev_deps. get ( k) {
405
- if let manifest:: InheritableDependency :: Value ( def) = dep {
406
- return def. is_version_specified ( ) ;
407
- }
408
- }
409
- } ;
410
- if let Some ( target_deps) = target_deps {
411
- if let Some ( dep) = target_deps. get ( k) {
412
- if let manifest:: InheritableDependency :: Value ( def) = dep {
413
- return def. is_version_specified ( ) ;
414
- }
415
- }
416
- }
417
- true
438
+ published_deps. get ( k) . is_some ( )
418
439
}
419
440
_ => true ,
420
441
}
@@ -832,8 +853,8 @@ pub fn to_real_manifest(
832
853
{
833
854
d. public = None ;
834
855
manifest_ctx. warnings . push ( format ! (
835
- "Ignoring `public` on dependency {name}. Pass `-Zpublic-dependency` to enable support for it" , name = & dep. name_in_toml( )
836
- ) )
856
+ "Ignoring `public` on dependency {name}. Pass `-Zpublic-dependency` to enable support for it" , name = & dep. name_in_toml( )
857
+ ) )
837
858
}
838
859
} else {
839
860
d. public = None ;
0 commit comments