Skip to content

Commit 1c5b1d1

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

File tree

1 file changed

+65
-9
lines changed

1 file changed

+65
-9
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,14 @@ impl TomlManifest {
18511851
}
18521852
}
18531853
let all = |_d: &TomlDependency| true;
1854+
let dependencies = map_deps(config, self.dependencies.as_ref(), all)?;
1855+
let dev_dependencies = map_deps(
1856+
config,
1857+
self.dev_dependencies
1858+
.as_ref()
1859+
.or_else(|| self.dev_dependencies2.as_ref()),
1860+
TomlDependency::is_version_specified,
1861+
)?;
18541862
return Ok(TomlManifest {
18551863
package: Some(package),
18561864
project: None,
@@ -1860,14 +1868,8 @@ impl TomlManifest {
18601868
example: self.example.clone(),
18611869
test: self.test.clone(),
18621870
bench: self.bench.clone(),
1863-
dependencies: map_deps(config, self.dependencies.as_ref(), all)?,
1864-
dev_dependencies: map_deps(
1865-
config,
1866-
self.dev_dependencies
1867-
.as_ref()
1868-
.or_else(|| self.dev_dependencies2.as_ref()),
1869-
TomlDependency::is_version_specified,
1870-
)?,
1871+
dependencies: dependencies.clone(),
1872+
dev_dependencies: dev_dependencies.clone(),
18711873
dev_dependencies2: None,
18721874
build_dependencies: map_deps(
18731875
config,
@@ -1877,7 +1879,7 @@ impl TomlManifest {
18771879
all,
18781880
)?,
18791881
build_dependencies2: None,
1880-
features: self.features.clone(),
1882+
features: map_features(dependencies,dev_dependencies, self.features.clone()),
18811883
target: match self.target.as_ref().map(|target_map| {
18821884
target_map
18831885
.iter()
@@ -1919,6 +1921,60 @@ impl TomlManifest {
19191921
lints: self.lints.clone(),
19201922
});
19211923

1924+
fn map_features(
1925+
deps: Option<BTreeMap<String, MaybeWorkspaceDependency>>,
1926+
dev_deps: Option<BTreeMap<String, MaybeWorkspaceDependency>>,
1927+
features: Option<BTreeMap<InternedString, Vec<InternedString>>>,
1928+
) -> Option<BTreeMap<InternedString, Vec<InternedString>>> {
1929+
if deps.is_none() && dev_deps.is_none(){
1930+
return None;
1931+
}
1932+
let all_deps = {
1933+
if deps.is_none(){
1934+
dev_deps?
1935+
}else{
1936+
let mut all_deps = deps?;
1937+
if let Some(dev_deps) = dev_deps{
1938+
all_deps.extend(dev_deps);
1939+
}
1940+
all_deps
1941+
}
1942+
};
1943+
1944+
let mut features = features.clone()?;
1945+
features.iter_mut().for_each(|(_name, features)| {
1946+
features.retain(|feature| {
1947+
if !feature.contains('/') {
1948+
return true;
1949+
}
1950+
let mut iter = feature.split('/');
1951+
let dep_name = iter.next().unwrap();
1952+
let feature_name = iter.next().unwrap();
1953+
for (i_dep_name, i_dep_detail) in all_deps.iter() {
1954+
if i_dep_name == dep_name {
1955+
return match i_dep_detail {
1956+
MaybeWorkspace::Defined(defined) => match defined {
1957+
TomlDependency::Simple(_) => false,
1958+
TomlDependency::Detailed(detail) => detail
1959+
.features
1960+
.as_ref()
1961+
.map(|v| v.contains(&feature_name.to_string()))
1962+
.is_some_and(|v| v),
1963+
},
1964+
MaybeWorkspace::Workspace(workspace) => workspace
1965+
.features
1966+
.as_ref()
1967+
.map(|v| v.contains(&feature_name.to_string()))
1968+
.is_some_and(|v| v),
1969+
};
1970+
}
1971+
}
1972+
false
1973+
})
1974+
});
1975+
Some(features)
1976+
}
1977+
19221978
fn map_deps(
19231979
config: &Config,
19241980
deps: Option<&BTreeMap<String, MaybeWorkspaceDependency>>,

0 commit comments

Comments
 (0)