diff --git a/src/cargo/ops/fix.rs b/src/cargo/ops/fix.rs index a5b94919240..6e4c718fcd4 100644 --- a/src/cargo/ops/fix.rs +++ b/src/cargo/ops/fix.rs @@ -61,6 +61,7 @@ use crate::ops::resolve::WorkspaceResolve; use crate::ops::{self, CompileOptions}; use crate::util::diagnostic_server::{Message, RustfixDiagnosticServer}; use crate::util::errors::CargoResult; +use crate::util::toml_mut::manifest::LocalManifest; use crate::util::GlobalContext; use crate::util::{existing_vcs_repo, LockServer, LockServerClient}; use crate::{drop_eprint, drop_eprintln}; @@ -272,7 +273,8 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> { MaybePackage::Virtual(manifest) => manifest.original_toml(), }; if Edition::Edition2024 <= prepare_for_edition { - let mut document = pkg.manifest().document().clone().into_mut(); + let mut manifest_mut = LocalManifest::try_new(pkg.manifest_path())?; + let document = &mut manifest_mut.data; let mut fixes = 0; let root = document.as_table_mut(); @@ -335,9 +337,7 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> { let msg = format!("{file} ({fixes} {verb})"); ws.gctx().shell().status("Fixed", msg)?; - let s = document.to_string(); - let new_contents_bytes = s.as_bytes(); - cargo_util::paths::write_atomic(pkg.manifest_path(), new_contents_bytes)?; + manifest_mut.write()?; } } } diff --git a/tests/testsuite/edition.rs b/tests/testsuite/edition.rs index 7b22c2dbda8..2c6ea53b08b 100644 --- a/tests/testsuite/edition.rs +++ b/tests/testsuite/edition.rs @@ -135,7 +135,7 @@ fn unset_edition_with_unset_rust_version() { p.cargo("check -v") .with_stderr_data(str![[r#" -[WARNING] no edition set: defaulting to the 2015 edition while the latest is 2024 +[WARNING] no edition set: defaulting to the 2015 edition while the latest is [..] [CHECKING] foo v0.1.0 ([ROOT]/foo) [RUNNING] `rustc [..] --edition=2015 [..]` [FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s diff --git a/tests/testsuite/fix.rs b/tests/testsuite/fix.rs index bd47056c0dc..685f664803e 100644 --- a/tests/testsuite/fix.rs +++ b/tests/testsuite/fix.rs @@ -2446,6 +2446,65 @@ edition = "2021" ); } +#[cargo_test] +fn migrate_removes_project_for_script() { + let p = project() + .file( + "foo.rs", + r#" +--- +# Before package +[ package ] # After package header +# After package header line +name = "foo" +edition = "2021" +# After package table + +# Before project +[ project ] # After project header +# After project header line +name = "foo" +edition = "2021" +# After project table +--- + +fn main() { +} +"#, + ) + .build(); + + p.cargo("-Zscript fix --edition --allow-no-vcs --manifest-path foo.rs") + .masquerade_as_nightly_cargo(&["script"]) + .with_stderr_data(str![[r#" +[MIGRATING] foo.rs from 2021 edition to 2024 +[FIXED] foo.rs (1 fix) +[CHECKING] foo v0.0.0 ([ROOT]/foo) +[MIGRATING] [ROOT]/home/.cargo/target/[HASH]/foo.rs from 2021 edition to 2024 +[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s + +"#]]) + .run(); + assert_e2e().eq( + p.read_file("foo.rs"), + str![[r#" + +--- +# Before package +[ package ] # After package header +# After package header line +name = "foo" +edition = "2021" +# After project table +--- + +fn main() { +} + +"#]], + ); +} + #[cargo_test] fn migrate_rename_underscore_fields() { let p = project() diff --git a/tests/testsuite/publish.rs b/tests/testsuite/publish.rs index 961af6ad088..51ab6cfdaf7 100644 --- a/tests/testsuite/publish.rs +++ b/tests/testsuite/publish.rs @@ -142,6 +142,7 @@ fn duplicate_version() { [package] name = "foo" version = "0.0.1" + edition = "2015" authors = [] license = "MIT" description = "foo" @@ -160,7 +161,6 @@ See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for [PACKAGING] foo v0.0.1 ([ROOT]/foo) [PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed) [VERIFYING] foo v0.0.1 ([ROOT]/foo) -[WARNING] no edition set: defaulting to the 2015 edition while the latest is 2024 [COMPILING] foo v0.0.1 ([ROOT]/foo/target/package/foo-0.0.1) [FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s [UPLOADING] foo v0.0.1 ([ROOT]/foo)