@@ -247,11 +247,46 @@ fn migrate_manifests(ws: &Workspace<'_>, pkgs: &[&Package]) -> CargoResult<()> {
247
247
"Migrating" ,
248
248
format ! ( "{file} from {existing_edition} edition to {prepare_for_edition}" ) ,
249
249
) ?;
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
+ }
250
270
}
251
271
252
272
Ok ( ( ) )
253
273
}
254
274
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
+
255
290
fn check_resolver_change ( ws : & Workspace < ' _ > , opts : & FixOptions ) -> CargoResult < ( ) > {
256
291
let root = ws. root_maybe ( ) ;
257
292
match root {
0 commit comments