Skip to content

Commit 0ae2062

Browse files
committed
fix(toml): Add default-features to TomlWorkspaceDependency
1 parent abc6abe commit 0ae2062

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ impl<'de, P: Deserialize<'de> + Clone> de::Deserialize<'de> for TomlDependency<P
273273
Ok(TomlDependency::Workspace(TomlWorkspaceDependency {
274274
workspace: true,
275275
features: details.features,
276+
default_features: details.default_features,
277+
default_features2: details.default_features2,
276278
optional: details.optional,
277279
}))
278280
} else {
@@ -349,9 +351,13 @@ pub struct IntermediateDependency<P = String> {
349351
}
350352

351353
#[derive(Deserialize, Serialize, Clone, Debug)]
354+
#[serde(rename_all = "kebab-case")]
352355
pub struct TomlWorkspaceDependency {
353356
workspace: bool,
354357
features: Option<Vec<String>>,
358+
default_features: Option<bool>,
359+
#[serde(rename = "default_features")]
360+
default_features2: Option<bool>,
355361
optional: Option<bool>,
356362
}
357363

@@ -2546,21 +2552,41 @@ impl TomlDependency {
25462552
cx: &mut Context<'_, '_>,
25472553
get_inheritable: impl FnOnce() -> CargoResult<&'a InheritableFields>,
25482554
) -> CargoResult<TomlDependency> {
2555+
fn default_features_msg(label: &str, ws_def_feat: Option<bool>, cx: &mut Context<'_, '_>) {
2556+
let ws_def_feat = match ws_def_feat {
2557+
Some(true) => "true",
2558+
Some(false) => "false",
2559+
None => "not specified",
2560+
};
2561+
cx.warnings.push(format!(
2562+
"`default-features` is ignored for {label}, since `default-features` was \
2563+
{ws_def_feat} for `workspace.dependencies.{label}`, \
2564+
this could become a hard error in the future"
2565+
))
2566+
}
25492567
match self {
25502568
TomlDependency::Detailed(d) => Ok(TomlDependency::Detailed(d)),
25512569
TomlDependency::Simple(s) => Ok(TomlDependency::Simple(s)),
25522570
TomlDependency::Workspace(TomlWorkspaceDependency {
25532571
workspace: true,
25542572
features,
25552573
optional,
2574+
default_features,
2575+
default_features2,
25562576
}) => {
2577+
if default_features.is_some() && default_features2.is_some() {
2578+
warn_on_deprecated("default-features", label, "dependency", cx.warnings);
2579+
}
25572580
let inheritable = get_inheritable()?;
25582581
inheritable.get_dependency(label).context(format!(
25592582
"error reading `dependencies.{}` from workspace root manifest's `workspace.dependencies.{}`",
25602583
label, label
25612584
)).map(|dep| {
25622585
match dep {
25632586
TomlDependency::Simple(s) => {
2587+
if let Some(false) = default_features.or(default_features2) {
2588+
default_features_msg(label, None, cx);
2589+
}
25642590
if optional.is_some() || features.is_some() {
25652591
Ok(TomlDependency::Detailed(DetailedTomlDependency {
25662592
version: Some(s),
@@ -2574,6 +2600,29 @@ impl TomlDependency {
25742600
},
25752601
TomlDependency::Detailed(d) => {
25762602
let mut dep = d.clone();
2603+
match (
2604+
default_features.or(default_features2),
2605+
d.default_features.or(d.default_features2)
2606+
) {
2607+
// member: default-features = true and
2608+
// workspace: default-features = false should turn on
2609+
// default-features
2610+
(Some(true), Some(false)) => {
2611+
dep.default_features = Some(true);
2612+
}
2613+
// member: default-features = false and
2614+
// workspace: default-features = true should ignore member
2615+
// default-features
2616+
(Some(false), Some(true)) => {
2617+
default_features_msg(label, Some(true), cx);
2618+
}
2619+
// member: default-features = false and
2620+
// workspace: dep = "1.0" should ignore member default-features
2621+
(Some(false), None) => {
2622+
default_features_msg(label, None, cx);
2623+
}
2624+
_ => {}
2625+
}
25772626
dep.add_features(features);
25782627
dep.update_optional(optional);
25792628
dep.resolve_path(label,inheritable.ws_root(), cx.root)?;

tests/testsuite/inheritable_workspace_fields.rs

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,3 +1356,145 @@ Caused by:
13561356
)
13571357
.run();
13581358
}
1359+
1360+
#[cargo_test]
1361+
fn warn_inherit_def_feat_true_member_def_feat_false() {
1362+
Package::new("dep", "0.1.0")
1363+
.feature("default", &["fancy_dep"])
1364+
.add_dep(Dependency::new("fancy_dep", "0.2").optional(true))
1365+
.file("src/lib.rs", "")
1366+
.publish();
1367+
1368+
Package::new("fancy_dep", "0.2.4").publish();
1369+
1370+
let p = project()
1371+
.file(
1372+
"Cargo.toml",
1373+
r#"
1374+
[package]
1375+
name = "bar"
1376+
version = "0.2.0"
1377+
authors = []
1378+
[dependencies]
1379+
dep = { workspace = true, default-features = false }
1380+
1381+
[workspace]
1382+
members = []
1383+
[workspace.dependencies]
1384+
dep = { version = "0.1.0", default-features = true }
1385+
"#,
1386+
)
1387+
.file("src/main.rs", "fn main() {}")
1388+
.build();
1389+
1390+
p.cargo("check")
1391+
.with_stderr(
1392+
"\
1393+
[WARNING] [CWD]/Cargo.toml: `default-features` is ignored for dep, since `default-features` was \
1394+
true for `workspace.dependencies.dep`, this could become a hard error in the future
1395+
[UPDATING] `dummy-registry` index
1396+
[DOWNLOADING] crates ...
1397+
[DOWNLOADED] fancy_dep v0.2.4 ([..])
1398+
[DOWNLOADED] dep v0.1.0 ([..])
1399+
[CHECKING] fancy_dep v0.2.4
1400+
[CHECKING] dep v0.1.0
1401+
[CHECKING] bar v0.2.0 ([CWD])
1402+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
1403+
",
1404+
)
1405+
.run();
1406+
}
1407+
1408+
#[cargo_test]
1409+
fn warn_inherit_simple_member_def_feat_false() {
1410+
Package::new("dep", "0.1.0")
1411+
.feature("default", &["fancy_dep"])
1412+
.add_dep(Dependency::new("fancy_dep", "0.2").optional(true))
1413+
.file("src/lib.rs", "")
1414+
.publish();
1415+
1416+
Package::new("fancy_dep", "0.2.4").publish();
1417+
1418+
let p = project()
1419+
.file(
1420+
"Cargo.toml",
1421+
r#"
1422+
[package]
1423+
name = "bar"
1424+
version = "0.2.0"
1425+
authors = []
1426+
[dependencies]
1427+
dep = { workspace = true, default-features = false }
1428+
1429+
[workspace]
1430+
members = []
1431+
[workspace.dependencies]
1432+
dep = "0.1.0"
1433+
"#,
1434+
)
1435+
.file("src/main.rs", "fn main() {}")
1436+
.build();
1437+
1438+
p.cargo("check")
1439+
.with_stderr(
1440+
"\
1441+
[WARNING] [CWD]/Cargo.toml: `default-features` is ignored for dep, since `default-features` was \
1442+
not specified for `workspace.dependencies.dep`, this could become a hard error in the future
1443+
[UPDATING] `dummy-registry` index
1444+
[DOWNLOADING] crates ...
1445+
[DOWNLOADED] fancy_dep v0.2.4 ([..])
1446+
[DOWNLOADED] dep v0.1.0 ([..])
1447+
[CHECKING] fancy_dep v0.2.4
1448+
[CHECKING] dep v0.1.0
1449+
[CHECKING] bar v0.2.0 ([CWD])
1450+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
1451+
",
1452+
)
1453+
.run();
1454+
}
1455+
1456+
#[cargo_test]
1457+
fn inherit_def_feat_false_member_def_feat_true() {
1458+
Package::new("dep", "0.1.0")
1459+
.feature("default", &["fancy_dep"])
1460+
.add_dep(Dependency::new("fancy_dep", "0.2").optional(true))
1461+
.file("src/lib.rs", "")
1462+
.publish();
1463+
1464+
Package::new("fancy_dep", "0.2.4").publish();
1465+
1466+
let p = project()
1467+
.file(
1468+
"Cargo.toml",
1469+
r#"
1470+
[package]
1471+
name = "bar"
1472+
version = "0.2.0"
1473+
authors = []
1474+
[dependencies]
1475+
dep = { workspace = true, default-features = true }
1476+
1477+
[workspace]
1478+
members = []
1479+
[workspace.dependencies]
1480+
dep = { version = "0.1.0", default-features = false }
1481+
"#,
1482+
)
1483+
.file("src/main.rs", "fn main() {}")
1484+
.build();
1485+
1486+
p.cargo("check")
1487+
.with_stderr(
1488+
"\
1489+
[UPDATING] `dummy-registry` index
1490+
[DOWNLOADING] crates ...
1491+
[DOWNLOADED] fancy_dep v0.2.4 ([..])
1492+
[DOWNLOADED] dep v0.1.0 ([..])
1493+
[CHECKING] fancy_dep v0.2.4
1494+
[CHECKING] dep v0.1.0
1495+
[CHECKING] bar v0.2.0 ([CWD])
1496+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
1497+
",
1498+
)
1499+
.run();
1500+
}

0 commit comments

Comments
 (0)