Skip to content

Commit 627b1d1

Browse files
committed
feat(fix): Migrate inherited deps with ignored default-features
1 parent 10012ce commit 627b1d1

File tree

3 files changed

+77
-12
lines changed

3 files changed

+77
-12
lines changed

crates/cargo-util-schemas/src/manifest/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,13 @@ impl TomlDependency {
683683
}
684684
}
685685

686+
pub fn default_features(&self) -> Option<bool> {
687+
match self {
688+
TomlDependency::Detailed(d) => d.default_features(),
689+
TomlDependency::Simple(..) => None,
690+
}
691+
}
692+
686693
pub fn unused_keys(&self) -> Vec<String> {
687694
match self {
688695
TomlDependency::Simple(_) => vec![],

src/cargo/ops/fix.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ use std::{env, fs, str};
4545

4646
use anyhow::{bail, Context as _};
4747
use cargo_util::{exit_status_to_string, is_simple_exit_code, paths, ProcessBuilder};
48+
use cargo_util_schemas::manifest::TomlManifest;
4849
use rustfix::diagnostics::Diagnostic;
4950
use rustfix::CodeFix;
5051
use semver::Version;
@@ -265,6 +266,10 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
265266
format!("{file} from {existing_edition} edition to {prepare_for_edition}"),
266267
)?;
267268

269+
let ws_original_toml = match ws.root_maybe() {
270+
MaybePackage::Package(package) => package.manifest().original_toml(),
271+
MaybePackage::Virtual(manifest) => manifest.original_toml(),
272+
};
268273
if Edition::Edition2024 <= prepare_for_edition {
269274
let mut document = pkg.manifest().document().clone().into_mut();
270275
let mut fixes = 0;
@@ -290,10 +295,15 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
290295
fixes += rename_array_of_target_fields_2024(root, "test");
291296
fixes += rename_array_of_target_fields_2024(root, "bench");
292297
fixes += rename_dep_fields_2024(root, "dependencies");
298+
fixes += remove_ignored_default_features_2024(root, "dependencies", ws_original_toml);
293299
fixes += rename_table(root, "dev_dependencies", "dev-dependencies");
294300
fixes += rename_dep_fields_2024(root, "dev-dependencies");
301+
fixes +=
302+
remove_ignored_default_features_2024(root, "dev-dependencies", ws_original_toml);
295303
fixes += rename_table(root, "build_dependencies", "build-dependencies");
296304
fixes += rename_dep_fields_2024(root, "build-dependencies");
305+
fixes +=
306+
remove_ignored_default_features_2024(root, "build-dependencies", ws_original_toml);
297307
for target in root
298308
.get_mut("target")
299309
.and_then(|t| t.as_table_like_mut())
@@ -302,10 +312,22 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
302312
.filter_map(|(_k, t)| t.as_table_like_mut())
303313
{
304314
fixes += rename_dep_fields_2024(target, "dependencies");
315+
fixes +=
316+
remove_ignored_default_features_2024(target, "dependencies", ws_original_toml);
305317
fixes += rename_table(target, "dev_dependencies", "dev-dependencies");
306318
fixes += rename_dep_fields_2024(target, "dev-dependencies");
319+
fixes += remove_ignored_default_features_2024(
320+
target,
321+
"dev-dependencies",
322+
ws_original_toml,
323+
);
307324
fixes += rename_table(target, "build_dependencies", "build-dependencies");
308325
fixes += rename_dep_fields_2024(target, "build-dependencies");
326+
fixes += remove_ignored_default_features_2024(
327+
target,
328+
"build-dependencies",
329+
ws_original_toml,
330+
);
309331
}
310332

311333
if 0 < fixes {
@@ -337,6 +359,47 @@ fn rename_dep_fields_2024(parent: &mut dyn toml_edit::TableLike, dep_kind: &str)
337359
fixes
338360
}
339361

362+
fn remove_ignored_default_features_2024(
363+
parent: &mut dyn toml_edit::TableLike,
364+
dep_kind: &str,
365+
ws_original_toml: &TomlManifest,
366+
) -> usize {
367+
let mut fixes = 0;
368+
for (name_in_toml, target) in parent
369+
.get_mut(dep_kind)
370+
.and_then(|t| t.as_table_like_mut())
371+
.iter_mut()
372+
.flat_map(|t| t.iter_mut())
373+
.filter_map(|(k, t)| t.as_table_like_mut().map(|t| (k, t)))
374+
{
375+
let name_in_toml: &str = &name_in_toml;
376+
let ws_deps = ws_original_toml
377+
.workspace
378+
.as_ref()
379+
.and_then(|ws| ws.dependencies.as_ref());
380+
if let Some(ws_dep) = ws_deps.and_then(|ws_deps| ws_deps.get(name_in_toml)) {
381+
if ws_dep.default_features() == Some(false) {
382+
continue;
383+
}
384+
}
385+
if target
386+
.get("workspace")
387+
.and_then(|i| i.as_value())
388+
.and_then(|i| i.as_bool())
389+
== Some(true)
390+
&& target
391+
.get("default-features")
392+
.and_then(|i| i.as_value())
393+
.and_then(|i| i.as_bool())
394+
== Some(false)
395+
{
396+
target.remove("default-features");
397+
fixes += 1;
398+
}
399+
}
400+
fixes
401+
}
402+
340403
fn rename_array_of_target_fields_2024(root: &mut dyn toml_edit::TableLike, kind: &str) -> usize {
341404
let mut fixes = 0;
342405
for target in root

tests/testsuite/fix.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2753,12 +2753,7 @@ dep_df_false = { version = "0.1.0", default-features = false }
27532753
[MIGRATING] pkg_default/Cargo.toml from 2021 edition to 2024
27542754
[MIGRATING] pkg_df_true/Cargo.toml from 2021 edition to 2024
27552755
[MIGRATING] pkg_df_false/Cargo.toml from 2021 edition to 2024
2756-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_df_true, since `default-features` was true for `workspace.dependencies.dep_df_true`, this could become a hard error in the future
2757-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_simple, since `default-features` was not specified for `workspace.dependencies.dep_simple`, this could become a hard error in the future
2758-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_df_true, since `default-features` was true for `workspace.dependencies.dep_df_true`, this could become a hard error in the future
2759-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_simple, since `default-features` was not specified for `workspace.dependencies.dep_simple`, this could become a hard error in the future
2760-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_df_true, since `default-features` was true for `workspace.dependencies.dep_df_true`, this could become a hard error in the future
2761-
[WARNING] [CWD]/pkg_df_false/Cargo.toml: `default-features` is ignored for dep_simple, since `default-features` was not specified for `workspace.dependencies.dep_simple`, this could become a hard error in the future
2756+
[FIXED] pkg_df_false/Cargo.toml (6 fixes)
27622757
[UPDATING] `dummy-registry` index
27632758
[LOCKING] 6 packages to latest compatible versions
27642759
[DOWNLOADING] crates ...
@@ -2790,18 +2785,18 @@ version = "0.1.0"
27902785
edition = "2021"
27912786
27922787
[dependencies]
2793-
dep_simple = { workspace = true, default-features = false }
2794-
dep_df_true = { workspace = true, default-features = false }
2788+
dep_simple = { workspace = true}
2789+
dep_df_true = { workspace = true}
27952790
dep_df_false = { workspace = true, default-features = false }
27962791
27972792
[build-dependencies]
2798-
dep_simple = { workspace = true, default-features = false }
2799-
dep_df_true = { workspace = true, default-features = false }
2793+
dep_simple = { workspace = true}
2794+
dep_df_true = { workspace = true}
28002795
dep_df_false = { workspace = true, default-features = false }
28012796
28022797
[target.'cfg(target_os = "linux")'.dependencies]
2803-
dep_simple = { workspace = true, default-features = false }
2804-
dep_df_true = { workspace = true, default-features = false }
2798+
dep_simple = { workspace = true}
2799+
dep_df_true = { workspace = true}
28052800
dep_df_false = { workspace = true, default-features = false }
28062801
"#
28072802
);

0 commit comments

Comments
 (0)