Skip to content

Commit d466f77

Browse files
committed
Strip dev-dependencies owned features in cargo package
1 parent ece50fd commit d466f77

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,7 @@ impl TomlManifest {
18511851
}
18521852
}
18531853
let all = |_d: &TomlDependency| true;
1854+
let dependencies = map_deps(config, self.dependencies.as_ref(), all)?;
18541855
return Ok(TomlManifest {
18551856
package: Some(package),
18561857
project: None,
@@ -1860,7 +1861,7 @@ impl TomlManifest {
18601861
example: self.example.clone(),
18611862
test: self.test.clone(),
18621863
bench: self.bench.clone(),
1863-
dependencies: map_deps(config, self.dependencies.as_ref(), all)?,
1864+
dependencies: dependencies.clone(),
18641865
dev_dependencies: map_deps(
18651866
config,
18661867
self.dev_dependencies
@@ -1877,7 +1878,7 @@ impl TomlManifest {
18771878
all,
18781879
)?,
18791880
build_dependencies2: None,
1880-
features: self.features.clone(),
1881+
features: map_features(dependencies, self.features.clone()),
18811882
target: match self.target.as_ref().map(|target_map| {
18821883
target_map
18831884
.iter()
@@ -1919,6 +1920,45 @@ impl TomlManifest {
19191920
lints: self.lints.clone(),
19201921
});
19211922

1923+
fn map_features(
1924+
deps: Option<BTreeMap<String, MaybeWorkspaceDependency>>,
1925+
features: Option<BTreeMap<InternedString, Vec<InternedString>>>,
1926+
) -> Option<BTreeMap<InternedString, Vec<InternedString>>> {
1927+
let deps = deps?;
1928+
let mut features = features.clone()?;
1929+
features.iter_mut().for_each(|(_name, features)| {
1930+
features.retain(|feature| {
1931+
if !feature.contains('/') {
1932+
return true;
1933+
}
1934+
let mut iter = feature.split('/');
1935+
let dep_name = iter.next().unwrap();
1936+
let feature_name = iter.next().unwrap();
1937+
for (i_dep_name, i_dep_detail) in deps.iter() {
1938+
if i_dep_name == dep_name {
1939+
return match i_dep_detail {
1940+
MaybeWorkspace::Defined(defined) => match defined {
1941+
TomlDependency::Simple(_) => false,
1942+
TomlDependency::Detailed(detail) => detail
1943+
.features
1944+
.as_ref()
1945+
.map(|v| v.contains(&feature_name.to_string()))
1946+
.is_some_and(|v| v),
1947+
},
1948+
MaybeWorkspace::Workspace(workspace) => workspace
1949+
.features
1950+
.as_ref()
1951+
.map(|v| v.contains(&feature_name.to_string()))
1952+
.is_some_and(|v| v),
1953+
};
1954+
}
1955+
}
1956+
false
1957+
})
1958+
});
1959+
Some(features)
1960+
}
1961+
19221962
fn map_deps(
19231963
config: &Config,
19241964
deps: Option<&BTreeMap<String, MaybeWorkspaceDependency>>,

0 commit comments

Comments
 (0)