Skip to content

Commit e591b0e

Browse files
committed
Auto merge of #13836 - epage:default_features, r=Muscraft
fix(toml): Don't lose 'public' when inheriting a dep ### What does this PR try to resolve? When inheriting a simple dep, we preserved the package dep's `public` field but lost it when inheriting a detailed dep. This was done by consolidating the code paths. This also reduces the risk of us doing this again in the future. ### How should we test and review this PR? I didn't write tests for this specific case because I refactored the root cause away. ### Additional information
2 parents ed20c34 + 1fc3668 commit e591b0e

File tree

1 file changed

+53
-56
lines changed

1 file changed

+53
-56
lines changed

src/cargo/util/toml/mod.rs

+53-56
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ fn dependency_inherit_with<'a>(
964964
}
965965

966966
fn inner_dependency_inherit_with<'a>(
967-
dependency: manifest::TomlInheritedDependency,
967+
pkg_dep: manifest::TomlInheritedDependency,
968968
name: &str,
969969
inherit: &dyn Fn() -> CargoResult<&'a InheritableFields>,
970970
package_root: &Path,
@@ -982,64 +982,61 @@ fn inner_dependency_inherit_with<'a>(
982982
this could become a hard error in the future"
983983
))
984984
}
985-
inherit()?.get_dependency(name, package_root).map(|d| {
986-
match d {
987-
manifest::TomlDependency::Simple(s) => {
988-
if let Some(false) = dependency.default_features() {
989-
default_features_msg(name, None, warnings);
990-
}
991-
if dependency.optional.is_some()
992-
|| dependency.features.is_some()
993-
|| dependency.public.is_some()
994-
{
995-
manifest::TomlDependency::Detailed(manifest::TomlDetailedDependency {
996-
version: Some(s),
997-
optional: dependency.optional,
998-
features: dependency.features.clone(),
999-
public: dependency.public,
1000-
..Default::default()
1001-
})
1002-
} else {
1003-
manifest::TomlDependency::Simple(s)
1004-
}
985+
inherit()?.get_dependency(name, package_root).map(|ws_dep| {
986+
let mut merged_dep = match ws_dep {
987+
manifest::TomlDependency::Simple(ws_version) => manifest::TomlDetailedDependency {
988+
version: Some(ws_version),
989+
..Default::default()
990+
},
991+
manifest::TomlDependency::Detailed(ws_dep) => ws_dep.clone(),
992+
};
993+
let manifest::TomlInheritedDependency {
994+
workspace: _,
995+
996+
features,
997+
optional,
998+
default_features,
999+
default_features2,
1000+
public,
1001+
1002+
_unused_keys: _,
1003+
} = &pkg_dep;
1004+
let default_features = default_features.or(*default_features2);
1005+
1006+
match (default_features, merged_dep.default_features()) {
1007+
// member: default-features = true and
1008+
// workspace: default-features = false should turn on
1009+
// default-features
1010+
(Some(true), Some(false)) => {
1011+
merged_dep.default_features = Some(true);
10051012
}
1006-
manifest::TomlDependency::Detailed(d) => {
1007-
let mut d = d.clone();
1008-
match (dependency.default_features(), d.default_features()) {
1009-
// member: default-features = true and
1010-
// workspace: default-features = false should turn on
1011-
// default-features
1012-
(Some(true), Some(false)) => {
1013-
d.default_features = Some(true);
1014-
}
1015-
// member: default-features = false and
1016-
// workspace: default-features = true should ignore member
1017-
// default-features
1018-
(Some(false), Some(true)) => {
1019-
default_features_msg(name, Some(true), warnings);
1020-
}
1021-
// member: default-features = false and
1022-
// workspace: dep = "1.0" should ignore member default-features
1023-
(Some(false), None) => {
1024-
default_features_msg(name, None, warnings);
1025-
}
1026-
_ => {}
1027-
}
1028-
d.features = match (d.features.clone(), dependency.features.clone()) {
1029-
(Some(dep_feat), Some(inherit_feat)) => Some(
1030-
dep_feat
1031-
.into_iter()
1032-
.chain(inherit_feat)
1033-
.collect::<Vec<String>>(),
1034-
),
1035-
(Some(dep_fet), None) => Some(dep_fet),
1036-
(None, Some(inherit_feat)) => Some(inherit_feat),
1037-
(None, None) => None,
1038-
};
1039-
d.optional = dependency.optional;
1040-
manifest::TomlDependency::Detailed(d)
1013+
// member: default-features = false and
1014+
// workspace: default-features = true should ignore member
1015+
// default-features
1016+
(Some(false), Some(true)) => {
1017+
default_features_msg(name, Some(true), warnings);
1018+
}
1019+
// member: default-features = false and
1020+
// workspace: dep = "1.0" should ignore member default-features
1021+
(Some(false), None) => {
1022+
default_features_msg(name, None, warnings);
10411023
}
1024+
_ => {}
10421025
}
1026+
merged_dep.features = match (merged_dep.features.clone(), features.clone()) {
1027+
(Some(dep_feat), Some(inherit_feat)) => Some(
1028+
dep_feat
1029+
.into_iter()
1030+
.chain(inherit_feat)
1031+
.collect::<Vec<String>>(),
1032+
),
1033+
(Some(dep_fet), None) => Some(dep_fet),
1034+
(None, Some(inherit_feat)) => Some(inherit_feat),
1035+
(None, None) => None,
1036+
};
1037+
merged_dep.optional = *optional;
1038+
merged_dep.public = *public;
1039+
manifest::TomlDependency::Detailed(merged_dep)
10431040
})
10441041
}
10451042

0 commit comments

Comments
 (0)