Skip to content

Commit

Permalink
fix(toml): Add default-features to TomlWorkspaceDependency
Browse files Browse the repository at this point in the history
  • Loading branch information
Muscraft committed Jan 3, 2023
1 parent 995f5ef commit 1d54fec
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/cargo/util/toml/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ impl<'de, P: Deserialize<'de> + Clone> de::Deserialize<'de> for TomlDependency<P
Ok(TomlDependency::Workspace(TomlWorkspaceDependency {
workspace: true,
features: details.features,
default_features: details.default_features,
default_features2: details.default_features2,
optional: details.optional,
}))
} else {
Expand Down Expand Up @@ -351,6 +353,9 @@ pub struct IntermediateDependency<P = String> {
pub struct TomlWorkspaceDependency {
workspace: bool,
features: Option<Vec<String>>,
default_features: Option<bool>,
#[serde(rename = "default_features")]
default_features2: Option<bool>,
optional: Option<bool>,
}

Expand Down Expand Up @@ -2525,21 +2530,41 @@ impl TomlDependency {
cx: &mut Context<'_, '_>,
get_inheritable: impl FnOnce() -> CargoResult<&'a InheritableFields>,
) -> CargoResult<TomlDependency> {
fn default_features_msg(label: &str, ws_def_feat: Option<bool>, cx: &mut Context<'_, '_>) {
let ws_def_feat = match ws_def_feat {
Some(true) => "true",
Some(false) => "false",
None => "not specified",
};
cx.warnings.push(format!(
"`default-features` is ignored for {}, since `default-features` was {} for \
`workspace.dependencies.{}`, this could become a hard error in the future",
label, ws_def_feat, label
))
}
match self {
TomlDependency::Detailed(d) => Ok(TomlDependency::Detailed(d)),
TomlDependency::Simple(s) => Ok(TomlDependency::Simple(s)),
TomlDependency::Workspace(TomlWorkspaceDependency {
workspace: true,
features,
optional,
default_features,
default_features2,
}) => {
if default_features.is_some() && default_features2.is_some() {
warn_on_deprecated("default-features", label, "dependency", cx.warnings);
}
let inheritable = get_inheritable()?;
inheritable.get_dependency(label).context(format!(
"error reading `dependencies.{}` from workspace root manifest's `workspace.dependencies.{}`",
label, label
)).map(|dep| {
match dep {
TomlDependency::Simple(s) => {
if let Some(false) = default_features.or(default_features2) {
default_features_msg(label, None, cx);
}
if optional.is_some() || features.is_some() {
Ok(TomlDependency::Detailed(DetailedTomlDependency {
version: Some(s),
Expand All @@ -2552,6 +2577,18 @@ impl TomlDependency {
}
},
TomlDependency::Detailed(d) => {
match (
default_features.or(default_features2),
d.default_features.or(d.default_features2)
) {
(Some(false), Some(true)) => {
default_features_msg(label, Some(true), cx);
}
(Some(false), None) => {
default_features_msg(label, None, cx);
}
_ => {}
}
let mut dep = d.clone();
dep.add_features(features);
dep.update_optional(optional);
Expand Down
96 changes: 96 additions & 0 deletions tests/testsuite/inheritable_workspace_fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1356,3 +1356,99 @@ Caused by:
)
.run();
}

#[cargo_test]
fn warn_inherit_def_feat_true_member_def_feat_false() {
Package::new("dep", "0.1.0")
.feature("default", &["fancy_dep"])
.add_dep(Dependency::new("fancy_dep", "0.2").optional(true))
.file("src/lib.rs", "")
.publish();

Package::new("fancy_dep", "0.2.4").publish();

let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "bar"
version = "0.2.0"
authors = []
[dependencies]
dep = { workspace = true, default-features = false }
[workspace]
members = []
[workspace.dependencies]
dep = { version = "0.1.0", default-features = true }
"#,
)
.file("src/main.rs", "fn main() {}")
.build();

p.cargo("build")
.with_stderr(
"\
[WARNING] [CWD]/Cargo.toml: `default-features` is ignored for dep, since `default-features` was \
true for `workspace.dependencies.dep`, this could become a hard error in the future
[UPDATING] `dummy-registry` index
[DOWNLOADING] crates ...
[DOWNLOADED] fancy_dep v0.2.4 ([..])
[DOWNLOADED] dep v0.1.0 ([..])
[COMPILING] fancy_dep v0.2.4
[COMPILING] dep v0.1.0
[COMPILING] bar v0.2.0 ([CWD])
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
",
)
.run();
}

#[cargo_test]
fn inherit_simple_member_def_feat_false() {
Package::new("dep", "0.1.0")
.feature("default", &["fancy_dep"])
.add_dep(Dependency::new("fancy_dep", "0.2").optional(true))
.file("src/lib.rs", "")
.publish();

Package::new("fancy_dep", "0.2.4").publish();

let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "bar"
version = "0.2.0"
authors = []
[dependencies]
dep = { workspace = true, default-features = false }
[workspace]
members = []
[workspace.dependencies]
dep = "0.1.0"
"#,
)
.file("src/main.rs", "fn main() {}")
.build();

p.cargo("build")
.with_stderr(
"\
[WARNING] [CWD]/Cargo.toml: `default-features` is ignored for dep, since `default-features` was \
not specified for `workspace.dependencies.dep`, this could become a hard error in the future
[UPDATING] `dummy-registry` index
[DOWNLOADING] crates ...
[DOWNLOADED] fancy_dep v0.2.4 ([..])
[DOWNLOADED] dep v0.1.0 ([..])
[COMPILING] fancy_dep v0.2.4
[COMPILING] dep v0.1.0
[COMPILING] bar v0.2.0 ([CWD])
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
",
)
.run();
}

0 comments on commit 1d54fec

Please sign in to comment.