Skip to content

Commit cbd9def

Browse files
committed
feat(fix): Migrate from project to package on Edition 2024
1 parent 98298d4 commit cbd9def

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

src/cargo/ops/fix.rs

+35
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,46 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
247247
"Migrating",
248248
format!("{file} from {existing_edition} edition to {prepare_for_edition}"),
249249
)?;
250+
251+
if Edition::Edition2024 <= prepare_for_edition {
252+
let mut document = pkg.manifest().document().clone().into_mut();
253+
let mut fixes = 0;
254+
255+
let root = document.as_table_mut();
256+
if rename_table(root, "project", "package") {
257+
fixes += 1;
258+
}
259+
260+
if 0 < fixes {
261+
let verb = if fixes == 1 { "fix" } else { "fixes" };
262+
let msg = format!("{file} ({fixes} {verb})");
263+
ws.gctx().shell().status("Fixed", msg)?;
264+
265+
let s = document.to_string();
266+
let new_contents_bytes = s.as_bytes();
267+
cargo_util::paths::write_atomic(pkg.manifest_path(), new_contents_bytes)?;
268+
}
269+
}
250270
}
251271

252272
Ok(())
253273
}
254274

275+
fn rename_table(parent: &mut dyn toml_edit::TableLike, old: &str, new: &str) -> bool {
276+
let Some(old_key) = parent.key(old).cloned() else {
277+
return false;
278+
};
279+
280+
let project = parent.remove(old).expect("returned early");
281+
if !parent.contains_key(new) {
282+
parent.insert(new, project);
283+
let mut new_key = parent.key_mut(new).expect("just inserted");
284+
*new_key.dotted_decor_mut() = old_key.dotted_decor().clone();
285+
*new_key.leaf_decor_mut() = old_key.leaf_decor().clone();
286+
}
287+
true
288+
}
289+
255290
fn check_resolver_change(ws: &Workspace<'_>, opts: &FixOptions) -> CargoResult<()> {
256291
let root = ws.root_maybe();
257292
match root {

tests/testsuite/fix.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -1975,7 +1975,7 @@ edition = "2021"
19751975
.with_stderr(
19761976
"\
19771977
[MIGRATING] Cargo.toml from 2021 edition to 2024
1978-
[WARNING] `[project]` is deprecated in favor of `[package]`
1978+
[FIXED] Cargo.toml (1 fix)
19791979
[CHECKING] foo v0.0.0 ([CWD])
19801980
[MIGRATING] src/lib.rs from 2021 edition to 2024
19811981
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [..]s
@@ -1988,7 +1988,7 @@ edition = "2021"
19881988
cargo-features = ["edition2024"]
19891989
19901990
# Before project
1991-
[ project ] # After project header
1991+
[ package ] # After project header
19921992
# After project header line
19931993
name = "foo"
19941994
edition = "2021"
@@ -2028,7 +2028,7 @@ edition = "2021"
20282028
.with_stderr(
20292029
"\
20302030
[MIGRATING] Cargo.toml from 2021 edition to 2024
2031-
[WARNING] `[project]` is deprecated in favor of `[package]`
2031+
[FIXED] Cargo.toml (1 fix)
20322032
[CHECKING] foo v0.0.0 ([CWD])
20332033
[MIGRATING] src/lib.rs from 2021 edition to 2024
20342034
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [..]s
@@ -2045,13 +2045,6 @@ cargo-features = ["edition2024"]
20452045
# After package header line
20462046
name = "foo"
20472047
edition = "2021"
2048-
# After package table
2049-
2050-
# Before project
2051-
[ project ] # After project header
2052-
# After project header line
2053-
name = "foo"
2054-
edition = "2021"
20552048
# After project table
20562049
"#
20572050
);

0 commit comments

Comments
 (0)