mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Auto merge of #13839 - epage:df_2024, r=Muscraft
fix(toml): On 2024 Edition, disallow ignored `default-features` when inheriting ### What does this PR try to resolve? This is part of rust-lang/rust#123754 This is a follow up to #11409 which tweaked how we do inheritance of default-features, including warning when `default-features = false` is ignored. This turns those warnings into an error. ### How should we test and review this PR? ### Additional information
This commit is contained in:
commit
d34d0a1e15
@ -683,6 +683,13 @@ impl TomlDependency {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn default_features(&self) -> Option<bool> {
|
||||||
|
match self {
|
||||||
|
TomlDependency::Detailed(d) => d.default_features(),
|
||||||
|
TomlDependency::Simple(..) => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn unused_keys(&self) -> Vec<String> {
|
pub fn unused_keys(&self) -> Vec<String> {
|
||||||
match self {
|
match self {
|
||||||
TomlDependency::Simple(_) => vec![],
|
TomlDependency::Simple(_) => vec![],
|
||||||
|
@ -45,6 +45,7 @@ use std::{env, fs, str};
|
|||||||
|
|
||||||
use anyhow::{bail, Context as _};
|
use anyhow::{bail, Context as _};
|
||||||
use cargo_util::{exit_status_to_string, is_simple_exit_code, paths, ProcessBuilder};
|
use cargo_util::{exit_status_to_string, is_simple_exit_code, paths, ProcessBuilder};
|
||||||
|
use cargo_util_schemas::manifest::TomlManifest;
|
||||||
use rustfix::diagnostics::Diagnostic;
|
use rustfix::diagnostics::Diagnostic;
|
||||||
use rustfix::CodeFix;
|
use rustfix::CodeFix;
|
||||||
use semver::Version;
|
use semver::Version;
|
||||||
@ -265,6 +266,10 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
|
|||||||
format!("{file} from {existing_edition} edition to {prepare_for_edition}"),
|
format!("{file} from {existing_edition} edition to {prepare_for_edition}"),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
let ws_original_toml = match ws.root_maybe() {
|
||||||
|
MaybePackage::Package(package) => package.manifest().original_toml(),
|
||||||
|
MaybePackage::Virtual(manifest) => manifest.original_toml(),
|
||||||
|
};
|
||||||
if Edition::Edition2024 <= prepare_for_edition {
|
if Edition::Edition2024 <= prepare_for_edition {
|
||||||
let mut document = pkg.manifest().document().clone().into_mut();
|
let mut document = pkg.manifest().document().clone().into_mut();
|
||||||
let mut fixes = 0;
|
let mut fixes = 0;
|
||||||
@ -290,10 +295,15 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
|
|||||||
fixes += rename_array_of_target_fields_2024(root, "test");
|
fixes += rename_array_of_target_fields_2024(root, "test");
|
||||||
fixes += rename_array_of_target_fields_2024(root, "bench");
|
fixes += rename_array_of_target_fields_2024(root, "bench");
|
||||||
fixes += rename_dep_fields_2024(root, "dependencies");
|
fixes += rename_dep_fields_2024(root, "dependencies");
|
||||||
|
fixes += remove_ignored_default_features_2024(root, "dependencies", ws_original_toml);
|
||||||
fixes += rename_table(root, "dev_dependencies", "dev-dependencies");
|
fixes += rename_table(root, "dev_dependencies", "dev-dependencies");
|
||||||
fixes += rename_dep_fields_2024(root, "dev-dependencies");
|
fixes += rename_dep_fields_2024(root, "dev-dependencies");
|
||||||
|
fixes +=
|
||||||
|
remove_ignored_default_features_2024(root, "dev-dependencies", ws_original_toml);
|
||||||
fixes += rename_table(root, "build_dependencies", "build-dependencies");
|
fixes += rename_table(root, "build_dependencies", "build-dependencies");
|
||||||
fixes += rename_dep_fields_2024(root, "build-dependencies");
|
fixes += rename_dep_fields_2024(root, "build-dependencies");
|
||||||
|
fixes +=
|
||||||
|
remove_ignored_default_features_2024(root, "build-dependencies", ws_original_toml);
|
||||||
for target in root
|
for target in root
|
||||||
.get_mut("target")
|
.get_mut("target")
|
||||||
.and_then(|t| t.as_table_like_mut())
|
.and_then(|t| t.as_table_like_mut())
|
||||||
@ -302,10 +312,22 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
|
|||||||
.filter_map(|(_k, t)| t.as_table_like_mut())
|
.filter_map(|(_k, t)| t.as_table_like_mut())
|
||||||
{
|
{
|
||||||
fixes += rename_dep_fields_2024(target, "dependencies");
|
fixes += rename_dep_fields_2024(target, "dependencies");
|
||||||
|
fixes +=
|
||||||
|
remove_ignored_default_features_2024(target, "dependencies", ws_original_toml);
|
||||||
fixes += rename_table(target, "dev_dependencies", "dev-dependencies");
|
fixes += rename_table(target, "dev_dependencies", "dev-dependencies");
|
||||||
fixes += rename_dep_fields_2024(target, "dev-dependencies");
|
fixes += rename_dep_fields_2024(target, "dev-dependencies");
|
||||||
|
fixes += remove_ignored_default_features_2024(
|
||||||
|
target,
|
||||||
|
"dev-dependencies",
|
||||||
|
ws_original_toml,
|
||||||
|
);
|
||||||
fixes += rename_table(target, "build_dependencies", "build-dependencies");
|
fixes += rename_table(target, "build_dependencies", "build-dependencies");
|
||||||
fixes += rename_dep_fields_2024(target, "build-dependencies");
|
fixes += rename_dep_fields_2024(target, "build-dependencies");
|
||||||
|
fixes += remove_ignored_default_features_2024(
|
||||||
|
target,
|
||||||
|
"build-dependencies",
|
||||||
|
ws_original_toml,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if 0 < fixes {
|
if 0 < fixes {
|
||||||
@ -337,6 +359,47 @@ fn rename_dep_fields_2024(parent: &mut dyn toml_edit::TableLike, dep_kind: &str)
|
|||||||
fixes
|
fixes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn remove_ignored_default_features_2024(
|
||||||
|
parent: &mut dyn toml_edit::TableLike,
|
||||||
|
dep_kind: &str,
|
||||||
|
ws_original_toml: &TomlManifest,
|
||||||
|
) -> usize {
|
||||||
|
let mut fixes = 0;
|
||||||
|
for (name_in_toml, target) in parent
|
||||||
|
.get_mut(dep_kind)
|
||||||
|
.and_then(|t| t.as_table_like_mut())
|
||||||
|
.iter_mut()
|
||||||
|
.flat_map(|t| t.iter_mut())
|
||||||
|
.filter_map(|(k, t)| t.as_table_like_mut().map(|t| (k, t)))
|
||||||
|
{
|
||||||
|
let name_in_toml: &str = &name_in_toml;
|
||||||
|
let ws_deps = ws_original_toml
|
||||||
|
.workspace
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|ws| ws.dependencies.as_ref());
|
||||||
|
if let Some(ws_dep) = ws_deps.and_then(|ws_deps| ws_deps.get(name_in_toml)) {
|
||||||
|
if ws_dep.default_features() == Some(false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if target
|
||||||
|
.get("workspace")
|
||||||
|
.and_then(|i| i.as_value())
|
||||||
|
.and_then(|i| i.as_bool())
|
||||||
|
== Some(true)
|
||||||
|
&& target
|
||||||
|
.get("default-features")
|
||||||
|
.and_then(|i| i.as_value())
|
||||||
|
.and_then(|i| i.as_bool())
|
||||||
|
== Some(false)
|
||||||
|
{
|
||||||
|
target.remove("default-features");
|
||||||
|
fixes += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fixes
|
||||||
|
}
|
||||||
|
|
||||||
fn rename_array_of_target_fields_2024(root: &mut dyn toml_edit::TableLike, kind: &str) -> usize {
|
fn rename_array_of_target_fields_2024(root: &mut dyn toml_edit::TableLike, kind: &str) -> usize {
|
||||||
let mut fixes = 0;
|
let mut fixes = 0;
|
||||||
for target in root
|
for target in root
|
||||||
|
@ -692,8 +692,14 @@ fn resolve_dependencies<'a>(
|
|||||||
|
|
||||||
let mut deps = BTreeMap::new();
|
let mut deps = BTreeMap::new();
|
||||||
for (name_in_toml, v) in dependencies.iter() {
|
for (name_in_toml, v) in dependencies.iter() {
|
||||||
let mut resolved =
|
let mut resolved = dependency_inherit_with(
|
||||||
dependency_inherit_with(v.clone(), name_in_toml, inherit, package_root, warnings)?;
|
v.clone(),
|
||||||
|
name_in_toml,
|
||||||
|
inherit,
|
||||||
|
package_root,
|
||||||
|
edition,
|
||||||
|
warnings,
|
||||||
|
)?;
|
||||||
if let manifest::TomlDependency::Detailed(ref mut d) = resolved {
|
if let manifest::TomlDependency::Detailed(ref mut d) = resolved {
|
||||||
deprecated_underscore(
|
deprecated_underscore(
|
||||||
&d.default_features2,
|
&d.default_features2,
|
||||||
@ -949,12 +955,13 @@ fn dependency_inherit_with<'a>(
|
|||||||
name: &str,
|
name: &str,
|
||||||
inherit: &dyn Fn() -> CargoResult<&'a InheritableFields>,
|
inherit: &dyn Fn() -> CargoResult<&'a InheritableFields>,
|
||||||
package_root: &Path,
|
package_root: &Path,
|
||||||
|
edition: Edition,
|
||||||
warnings: &mut Vec<String>,
|
warnings: &mut Vec<String>,
|
||||||
) -> CargoResult<manifest::TomlDependency> {
|
) -> CargoResult<manifest::TomlDependency> {
|
||||||
match dependency {
|
match dependency {
|
||||||
manifest::InheritableDependency::Value(value) => Ok(value),
|
manifest::InheritableDependency::Value(value) => Ok(value),
|
||||||
manifest::InheritableDependency::Inherit(w) => {
|
manifest::InheritableDependency::Inherit(w) => {
|
||||||
inner_dependency_inherit_with(w, name, inherit, package_root, warnings).with_context(|| {
|
inner_dependency_inherit_with(w, name, inherit, package_root, edition, warnings).with_context(|| {
|
||||||
format!(
|
format!(
|
||||||
"error inheriting `{name}` from workspace root manifest's `workspace.dependencies.{name}`",
|
"error inheriting `{name}` from workspace root manifest's `workspace.dependencies.{name}`",
|
||||||
)
|
)
|
||||||
@ -968,76 +975,87 @@ fn inner_dependency_inherit_with<'a>(
|
|||||||
name: &str,
|
name: &str,
|
||||||
inherit: &dyn Fn() -> CargoResult<&'a InheritableFields>,
|
inherit: &dyn Fn() -> CargoResult<&'a InheritableFields>,
|
||||||
package_root: &Path,
|
package_root: &Path,
|
||||||
|
edition: Edition,
|
||||||
warnings: &mut Vec<String>,
|
warnings: &mut Vec<String>,
|
||||||
) -> CargoResult<manifest::TomlDependency> {
|
) -> CargoResult<manifest::TomlDependency> {
|
||||||
fn default_features_msg(label: &str, ws_def_feat: Option<bool>, warnings: &mut Vec<String>) {
|
let ws_dep = inherit()?.get_dependency(name, package_root)?;
|
||||||
let ws_def_feat = match ws_def_feat {
|
let mut merged_dep = match ws_dep {
|
||||||
Some(true) => "true",
|
manifest::TomlDependency::Simple(ws_version) => manifest::TomlDetailedDependency {
|
||||||
Some(false) => "false",
|
version: Some(ws_version),
|
||||||
None => "not specified",
|
..Default::default()
|
||||||
};
|
},
|
||||||
|
manifest::TomlDependency::Detailed(ws_dep) => ws_dep.clone(),
|
||||||
|
};
|
||||||
|
let manifest::TomlInheritedDependency {
|
||||||
|
workspace: _,
|
||||||
|
|
||||||
|
features,
|
||||||
|
optional,
|
||||||
|
default_features,
|
||||||
|
default_features2,
|
||||||
|
public,
|
||||||
|
|
||||||
|
_unused_keys: _,
|
||||||
|
} = &pkg_dep;
|
||||||
|
let default_features = default_features.or(*default_features2);
|
||||||
|
|
||||||
|
match (default_features, merged_dep.default_features()) {
|
||||||
|
// member: default-features = true and
|
||||||
|
// workspace: default-features = false should turn on
|
||||||
|
// default-features
|
||||||
|
(Some(true), Some(false)) => {
|
||||||
|
merged_dep.default_features = Some(true);
|
||||||
|
}
|
||||||
|
// member: default-features = false and
|
||||||
|
// workspace: default-features = true should ignore member
|
||||||
|
// default-features
|
||||||
|
(Some(false), Some(true)) => {
|
||||||
|
deprecated_ws_default_features(name, Some(true), edition, warnings)?;
|
||||||
|
}
|
||||||
|
// member: default-features = false and
|
||||||
|
// workspace: dep = "1.0" should ignore member default-features
|
||||||
|
(Some(false), None) => {
|
||||||
|
deprecated_ws_default_features(name, None, edition, warnings)?;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
merged_dep.features = match (merged_dep.features.clone(), features.clone()) {
|
||||||
|
(Some(dep_feat), Some(inherit_feat)) => Some(
|
||||||
|
dep_feat
|
||||||
|
.into_iter()
|
||||||
|
.chain(inherit_feat)
|
||||||
|
.collect::<Vec<String>>(),
|
||||||
|
),
|
||||||
|
(Some(dep_fet), None) => Some(dep_fet),
|
||||||
|
(None, Some(inherit_feat)) => Some(inherit_feat),
|
||||||
|
(None, None) => None,
|
||||||
|
};
|
||||||
|
merged_dep.optional = *optional;
|
||||||
|
merged_dep.public = *public;
|
||||||
|
Ok(manifest::TomlDependency::Detailed(merged_dep))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deprecated_ws_default_features(
|
||||||
|
label: &str,
|
||||||
|
ws_def_feat: Option<bool>,
|
||||||
|
edition: Edition,
|
||||||
|
warnings: &mut Vec<String>,
|
||||||
|
) -> CargoResult<()> {
|
||||||
|
let ws_def_feat = match ws_def_feat {
|
||||||
|
Some(true) => "true",
|
||||||
|
Some(false) => "false",
|
||||||
|
None => "not specified",
|
||||||
|
};
|
||||||
|
if Edition::Edition2024 <= edition {
|
||||||
|
anyhow::bail!("`default-features = false` cannot override workspace's `default-features`");
|
||||||
|
} else {
|
||||||
warnings.push(format!(
|
warnings.push(format!(
|
||||||
"`default-features` is ignored for {label}, since `default-features` was \
|
"`default-features` is ignored for {label}, since `default-features` was \
|
||||||
{ws_def_feat} for `workspace.dependencies.{label}`, \
|
{ws_def_feat} for `workspace.dependencies.{label}`, \
|
||||||
this could become a hard error in the future"
|
this could become a hard error in the future"
|
||||||
))
|
));
|
||||||
}
|
}
|
||||||
inherit()?.get_dependency(name, package_root).map(|ws_dep| {
|
Ok(())
|
||||||
let mut merged_dep = match ws_dep {
|
|
||||||
manifest::TomlDependency::Simple(ws_version) => manifest::TomlDetailedDependency {
|
|
||||||
version: Some(ws_version),
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
manifest::TomlDependency::Detailed(ws_dep) => ws_dep.clone(),
|
|
||||||
};
|
|
||||||
let manifest::TomlInheritedDependency {
|
|
||||||
workspace: _,
|
|
||||||
|
|
||||||
features,
|
|
||||||
optional,
|
|
||||||
default_features,
|
|
||||||
default_features2,
|
|
||||||
public,
|
|
||||||
|
|
||||||
_unused_keys: _,
|
|
||||||
} = &pkg_dep;
|
|
||||||
let default_features = default_features.or(*default_features2);
|
|
||||||
|
|
||||||
match (default_features, merged_dep.default_features()) {
|
|
||||||
// member: default-features = true and
|
|
||||||
// workspace: default-features = false should turn on
|
|
||||||
// default-features
|
|
||||||
(Some(true), Some(false)) => {
|
|
||||||
merged_dep.default_features = Some(true);
|
|
||||||
}
|
|
||||||
// member: default-features = false and
|
|
||||||
// workspace: default-features = true should ignore member
|
|
||||||
// default-features
|
|
||||||
(Some(false), Some(true)) => {
|
|
||||||
default_features_msg(name, Some(true), warnings);
|
|
||||||
}
|
|
||||||
// member: default-features = false and
|
|
||||||
// workspace: dep = "1.0" should ignore member default-features
|
|
||||||
(Some(false), None) => {
|
|
||||||
default_features_msg(name, None, warnings);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
merged_dep.features = match (merged_dep.features.clone(), features.clone()) {
|
|
||||||
(Some(dep_feat), Some(inherit_feat)) => Some(
|
|
||||||
dep_feat
|
|
||||||
.into_iter()
|
|
||||||
.chain(inherit_feat)
|
|
||||||
.collect::<Vec<String>>(),
|
|
||||||
),
|
|
||||||
(Some(dep_fet), None) => Some(dep_fet),
|
|
||||||
(None, Some(inherit_feat)) => Some(inherit_feat),
|
|
||||||
(None, None) => None,
|
|
||||||
};
|
|
||||||
merged_dep.optional = *optional;
|
|
||||||
merged_dep.public = *public;
|
|
||||||
manifest::TomlDependency::Detailed(merged_dep)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
|
@ -2654,3 +2654,150 @@ baz = ["dep:baz"]
|
|||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cargo_test]
|
||||||
|
fn remove_ignored_default_features() {
|
||||||
|
Package::new("dep_simple", "0.1.0").publish();
|
||||||
|
Package::new("dep_df_true", "0.1.0").publish();
|
||||||
|
Package::new("dep_df_false", "0.1.0").publish();
|
||||||
|
|
||||||
|
let pkg_default = r#"
|
||||||
|
[package]
|
||||||
|
name = "pkg_default"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
dep_simple = { workspace = true }
|
||||||
|
dep_df_true = { workspace = true }
|
||||||
|
dep_df_false = { workspace = true }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
dep_simple = { workspace = true }
|
||||||
|
dep_df_true = { workspace = true }
|
||||||
|
dep_df_false = { workspace = true }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
|
dep_simple = { workspace = true }
|
||||||
|
dep_df_true = { workspace = true }
|
||||||
|
dep_df_false = { workspace = true }
|
||||||
|
"#;
|
||||||
|
let pkg_df_true = r#"
|
||||||
|
[package]
|
||||||
|
name = "pkg_df_true"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = true }
|
||||||
|
dep_df_true = { workspace = true, default-features = true }
|
||||||
|
dep_df_false = { workspace = true, default-features = true }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = true }
|
||||||
|
dep_df_true = { workspace = true, default-features = true }
|
||||||
|
dep_df_false = { workspace = true, default-features = true }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = true }
|
||||||
|
dep_df_true = { workspace = true, default-features = true }
|
||||||
|
dep_df_false = { workspace = true, default-features = true }
|
||||||
|
"#;
|
||||||
|
let pkg_df_false = r#"
|
||||||
|
[package]
|
||||||
|
name = "pkg_df_false"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = false }
|
||||||
|
dep_df_true = { workspace = true, default-features = false }
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = false }
|
||||||
|
dep_df_true = { workspace = true, default-features = false }
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
|
dep_simple = { workspace = true, default-features = false }
|
||||||
|
dep_df_true = { workspace = true, default-features = false }
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
"#;
|
||||||
|
let p = project()
|
||||||
|
.file(
|
||||||
|
"Cargo.toml",
|
||||||
|
r#"
|
||||||
|
[workspace]
|
||||||
|
members = ["pkg_default", "pkg_df_true", "pkg_df_false"]
|
||||||
|
resolver = "2"
|
||||||
|
|
||||||
|
[workspace.dependencies]
|
||||||
|
dep_simple = "0.1.0"
|
||||||
|
dep_df_true = { version = "0.1.0", default-features = true }
|
||||||
|
dep_df_false = { version = "0.1.0", default-features = false }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.file("pkg_default/Cargo.toml", pkg_default)
|
||||||
|
.file("pkg_default/src/lib.rs", "")
|
||||||
|
.file("pkg_df_true/Cargo.toml", pkg_df_true)
|
||||||
|
.file("pkg_df_true/src/lib.rs", "")
|
||||||
|
.file("pkg_df_false/Cargo.toml", pkg_df_false)
|
||||||
|
.file("pkg_df_false/src/lib.rs", "")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
p.cargo("fix --all --edition --allow-no-vcs")
|
||||||
|
.masquerade_as_nightly_cargo(&["edition2024"])
|
||||||
|
.with_stderr_unordered(
|
||||||
|
"\
|
||||||
|
[MIGRATING] pkg_default/Cargo.toml from 2021 edition to 2024
|
||||||
|
[MIGRATING] pkg_df_true/Cargo.toml from 2021 edition to 2024
|
||||||
|
[MIGRATING] pkg_df_false/Cargo.toml from 2021 edition to 2024
|
||||||
|
[FIXED] pkg_df_false/Cargo.toml (6 fixes)
|
||||||
|
[UPDATING] `dummy-registry` index
|
||||||
|
[LOCKING] 6 packages to latest compatible versions
|
||||||
|
[DOWNLOADING] crates ...
|
||||||
|
[DOWNLOADED] dep_simple v0.1.0 (registry `dummy-registry`)
|
||||||
|
[DOWNLOADED] dep_df_true v0.1.0 (registry `dummy-registry`)
|
||||||
|
[DOWNLOADED] dep_df_false v0.1.0 (registry `dummy-registry`)
|
||||||
|
[CHECKING] dep_df_true v0.1.0
|
||||||
|
[CHECKING] dep_df_false v0.1.0
|
||||||
|
[CHECKING] dep_simple v0.1.0
|
||||||
|
[CHECKING] pkg_df_true v0.1.0 ([CWD]/pkg_df_true)
|
||||||
|
[CHECKING] pkg_df_false v0.1.0 ([CWD]/pkg_df_false)
|
||||||
|
[CHECKING] pkg_default v0.1.0 ([CWD]/pkg_default)
|
||||||
|
[MIGRATING] pkg_df_false/src/lib.rs from 2021 edition to 2024
|
||||||
|
[MIGRATING] pkg_df_true/src/lib.rs from 2021 edition to 2024
|
||||||
|
[MIGRATING] pkg_default/src/lib.rs from 2021 edition to 2024
|
||||||
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [..]s
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.run();
|
||||||
|
|
||||||
|
assert_eq!(p.read_file("pkg_default/Cargo.toml"), pkg_default);
|
||||||
|
assert_eq!(p.read_file("pkg_df_true/Cargo.toml"), pkg_df_true);
|
||||||
|
assert_eq!(
|
||||||
|
p.read_file("pkg_df_false/Cargo.toml"),
|
||||||
|
r#"
|
||||||
|
[package]
|
||||||
|
name = "pkg_df_false"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
dep_simple = { workspace = true}
|
||||||
|
dep_df_true = { workspace = true}
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
dep_simple = { workspace = true}
|
||||||
|
dep_df_true = { workspace = true}
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
|
dep_simple = { workspace = true}
|
||||||
|
dep_df_true = { workspace = true}
|
||||||
|
dep_df_false = { workspace = true, default-features = false }
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -1518,6 +1518,56 @@ true for `workspace.dependencies.dep`, this could become a hard error in the fut
|
|||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cargo_test(nightly, reason = "edition2024 is not stable")]
|
||||||
|
fn warn_inherit_def_feat_true_member_def_feat_false_2024_edition() {
|
||||||
|
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#"
|
||||||
|
cargo-features = ["edition2024"]
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name = "bar"
|
||||||
|
version = "0.2.0"
|
||||||
|
edition = "2024"
|
||||||
|
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("check")
|
||||||
|
.masquerade_as_nightly_cargo(&["edition2024"])
|
||||||
|
.with_status(101)
|
||||||
|
.with_stderr(
|
||||||
|
"\
|
||||||
|
[ERROR] failed to parse manifest at `[CWD]/Cargo.toml`
|
||||||
|
|
||||||
|
Caused by:
|
||||||
|
error inheriting `dep` from workspace root manifest's `workspace.dependencies.dep`
|
||||||
|
|
||||||
|
Caused by:
|
||||||
|
`default-features = false` cannot override workspace's `default-features`
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
#[cargo_test]
|
#[cargo_test]
|
||||||
fn warn_inherit_simple_member_def_feat_false() {
|
fn warn_inherit_simple_member_def_feat_false() {
|
||||||
Package::new("dep", "0.1.0")
|
Package::new("dep", "0.1.0")
|
||||||
@ -1568,6 +1618,56 @@ not specified for `workspace.dependencies.dep`, this could become a hard error i
|
|||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cargo_test(nightly, reason = "edition2024 is not stable")]
|
||||||
|
fn warn_inherit_simple_member_def_feat_false_2024_edition() {
|
||||||
|
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#"
|
||||||
|
cargo-features = ["edition2024"]
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name = "bar"
|
||||||
|
version = "0.2.0"
|
||||||
|
edition = "2024"
|
||||||
|
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("check")
|
||||||
|
.masquerade_as_nightly_cargo(&["edition2024"])
|
||||||
|
.with_status(101)
|
||||||
|
.with_stderr(
|
||||||
|
"\
|
||||||
|
[ERROR] failed to parse manifest at `[CWD]/Cargo.toml`
|
||||||
|
|
||||||
|
Caused by:
|
||||||
|
error inheriting `dep` from workspace root manifest's `workspace.dependencies.dep`
|
||||||
|
|
||||||
|
Caused by:
|
||||||
|
`default-features = false` cannot override workspace's `default-features`
|
||||||
|
",
|
||||||
|
)
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
#[cargo_test]
|
#[cargo_test]
|
||||||
fn inherit_def_feat_false_member_def_feat_true() {
|
fn inherit_def_feat_false_member_def_feat_true() {
|
||||||
Package::new("dep", "0.1.0")
|
Package::new("dep", "0.1.0")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user