Skip to content

Commit 4365507

Browse files
committed
fix(toml): Add default-features to TomlWorkspaceDependency
1 parent 995f5ef commit 4365507

File tree

2 files changed

+190
-0
lines changed

2 files changed

+190
-0
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ impl<'de, P: Deserialize<'de> + Clone> de::Deserialize<'de> for TomlDependency<P
272272
Ok(TomlDependency::Workspace(TomlWorkspaceDependency {
273273
workspace: true,
274274
features: details.features,
275+
default_features: details.default_features,
276+
default_features2: details.default_features2,
275277
optional: details.optional,
276278
}))
277279
} else {
@@ -351,6 +353,9 @@ pub struct IntermediateDependency<P = String> {
351353
pub struct TomlWorkspaceDependency {
352354
workspace: bool,
353355
features: Option<Vec<String>>,
356+
default_features: Option<bool>,
357+
#[serde(rename = "default_features")]
358+
default_features2: Option<bool>,
354359
optional: Option<bool>,
355360
}
356361

@@ -2525,21 +2530,41 @@ impl TomlDependency {
25252530
cx: &mut Context<'_, '_>,
25262531
get_inheritable: impl FnOnce() -> CargoResult<&'a InheritableFields>,
25272532
) -> CargoResult<TomlDependency> {
2533+
fn default_features_msg(label: &str, ws_def_feat: Option<bool>, cx: &mut Context<'_, '_>) {
2534+
let ws_def_feat = match ws_def_feat {
2535+
Some(true) => "true",
2536+
Some(false) => "false",
2537+
None => "not specified",
2538+
};
2539+
cx.warnings.push(format!(
2540+
"`default-features` is ignored for {}, since `default-features` was {} for \
2541+
`workspace.dependencies.{}`, this could become a hard error in the future",
2542+
label, ws_def_feat, label
2543+
))
2544+
}
25282545
match self {
25292546
TomlDependency::Detailed(d) => Ok(TomlDependency::Detailed(d)),
25302547
TomlDependency::Simple(s) => Ok(TomlDependency::Simple(s)),
25312548
TomlDependency::Workspace(TomlWorkspaceDependency {
25322549
workspace: true,
25332550
features,
25342551
optional,
2552+
default_features,
2553+
default_features2,
25352554
}) => {
2555+
if default_features.is_some() && default_features2.is_some() {
2556+
warn_on_deprecated("default-features", label, "dependency", cx.warnings);
2557+
}
25362558
let inheritable = get_inheritable()?;
25372559
inheritable.get_dependency(label).context(format!(
25382560
"error reading `dependencies.{}` from workspace root manifest's `workspace.dependencies.{}`",
25392561
label, label
25402562
)).map(|dep| {
25412563
match dep {
25422564
TomlDependency::Simple(s) => {
2565+
if let Some(false) = default_features.or(default_features2) {
2566+
default_features_msg(label, None, cx);
2567+
}
25432568
if optional.is_some() || features.is_some() {
25442569
Ok(TomlDependency::Detailed(DetailedTomlDependency {
25452570
version: Some(s),
@@ -2553,6 +2578,29 @@ impl TomlDependency {
25532578
},
25542579
TomlDependency::Detailed(d) => {
25552580
let mut dep = d.clone();
2581+
match (
2582+
default_features.or(default_features2),
2583+
d.default_features.or(d.default_features2)
2584+
) {
2585+
// member: default-features = true and
2586+
// workspace: default-features = false should turn on
2587+
// default-features
2588+
(Some(true), Some(false)) => {
2589+
dep.default_features = default_features.or(default_features2);
2590+
}
2591+
// member: default-features = false and
2592+
// workspace: default-features = true should ignore member
2593+
// default-features
2594+
(Some(false), Some(true)) => {
2595+
default_features_msg(label, Some(true), cx);
2596+
}
2597+
// member: default-features = false and
2598+
// workspace: dep = "1.0" should ignore member default-features
2599+
(Some(false), None) => {
2600+
default_features_msg(label, None, cx);
2601+
}
2602+
_ => {}
2603+
}
25562604
dep.add_features(features);
25572605
dep.update_optional(optional);
25582606
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("build")
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+
[COMPILING] fancy_dep v0.2.4
1400+
[COMPILING] dep v0.1.0
1401+
[COMPILING] 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("build")
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+
[COMPILING] fancy_dep v0.2.4
1448+
[COMPILING] dep v0.1.0
1449+
[COMPILING] 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("build")
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+
[COMPILING] fancy_dep v0.2.4
1494+
[COMPILING] dep v0.1.0
1495+
[COMPILING] bar v0.2.0 ([CWD])
1496+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
1497+
",
1498+
)
1499+
.run();
1500+
}

0 commit comments

Comments
 (0)