Skip to content

Commit dc2f54c

Browse files
committed
refactor: map feature with published deps
1 parent c9f71bd commit dc2f54c

File tree

1 file changed

+77
-56
lines changed

1 file changed

+77
-56
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ use cargo_platform::Platform;
1111
use cargo_util::paths;
1212
use cargo_util_schemas::core::PartialVersion;
1313
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+
};
1517
use itertools::Itertools;
1618
use lazycell::LazyCell;
1719
use pathdiff::diff_paths;
@@ -315,15 +317,12 @@ pub fn prepare_for_publish(
315317
manifest::StringOrBool::Bool(_) => {}
316318
}
317319
}
318-
let all = |_d: &manifest::TomlDependency| true;
319320

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)?;
327326
return Ok(manifest::TomlManifest {
328327
package: Some(package),
329328
project: None,
@@ -333,35 +332,74 @@ pub fn prepare_for_publish(
333332
example: me.example.clone(),
334333
test: me.test.clone(),
335334
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,
342337
dev_dependencies2: None,
343-
build_dependencies: map_deps(gctx, me.build_dependencies(), all)?,
338+
build_dependencies,
344339
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| {
351381
target_map
352382
.iter()
353383
.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());
354396
Ok((
355397
k.clone(),
356398
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,
363401
dev_dependencies2: None,
364-
build_dependencies: map_deps(gctx, v.build_dependencies(), all)?,
402+
build_dependencies,
365403
build_dependencies2: None,
366404
},
367405
))
@@ -371,19 +409,16 @@ pub fn prepare_for_publish(
371409
Some(Ok(v)) => Some(v),
372410
Some(Err(e)) => return Err(e),
373411
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+
}
382418

383419
fn map_feature(
384420
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>,
387422
) -> CargoResult<Option<BTreeMap<manifest::FeatureName, Vec<String>>>> {
388423
let Some(features) = features else {
389424
return Ok(None);
@@ -400,21 +435,7 @@ pub fn prepare_for_publish(
400435
| FeatureValue::DepFeature { dep_name, .. } => {
401436
let k = &manifest::PackageName::new(dep_name.to_string()).unwrap();
402437

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()
418439
}
419440
_ => true,
420441
}
@@ -832,8 +853,8 @@ pub fn to_real_manifest(
832853
{
833854
d.public = None;
834855
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+
))
837858
}
838859
} else {
839860
d.public = None;

0 commit comments

Comments
 (0)