@@ -222,6 +222,11 @@ pub fn upgrade_manifests(
222
222
let mut upgrades = HashMap :: new ( ) ;
223
223
let mut upgrade_messages = HashSet :: new ( ) ;
224
224
225
+ let to_update = to_update
226
+ . iter ( )
227
+ . map ( |s| PackageIdSpec :: parse ( s) )
228
+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
229
+
225
230
// Updates often require a lot of modifications to the registry, so ensure
226
231
// that we're synchronized against other Cargos.
227
232
let _lock = gctx. acquire_package_cache_lock ( CacheLockMode :: DownloadExclusive ) ?;
@@ -239,7 +244,7 @@ pub fn upgrade_manifests(
239
244
. try_map_dependencies ( |d| {
240
245
upgrade_dependency (
241
246
& gctx,
242
- to_update,
247
+ & to_update,
243
248
& mut registry,
244
249
& mut upgrades,
245
250
& mut upgrade_messages,
@@ -253,7 +258,7 @@ pub fn upgrade_manifests(
253
258
254
259
fn upgrade_dependency (
255
260
gctx : & GlobalContext ,
256
- to_update : & Vec < String > ,
261
+ to_update : & Vec < PackageIdSpec > ,
257
262
registry : & mut PackageRegistry < ' _ > ,
258
263
upgrades : & mut UpgradeMap ,
259
264
upgrade_messages : & mut HashSet < String > ,
@@ -263,46 +268,48 @@ fn upgrade_dependency(
263
268
let renamed_to = dependency. name_in_toml ( ) ;
264
269
265
270
if name != renamed_to {
266
- trace ! (
267
- "skipping dependency renamed from `{}` to `{}`" ,
268
- name,
269
- renamed_to
270
- ) ;
271
+ trace ! ( "skipping dependency renamed from `{name}` to `{renamed_to}`" ) ;
271
272
return Ok ( dependency) ;
272
273
}
273
274
274
- if !to_update. is_empty ( ) && !to_update. contains ( & name. to_string ( ) ) {
275
- trace ! ( "skipping dependency `{}` not selected for upgrading" , name) ;
275
+ if !to_update. is_empty ( )
276
+ && !to_update. iter ( ) . any ( |spec| {
277
+ spec. name ( ) == name. as_str ( )
278
+ && dependency. source_id ( ) . is_registry ( )
279
+ && spec
280
+ . url ( )
281
+ . map_or ( true , |url| url == dependency. source_id ( ) . url ( ) )
282
+ && spec
283
+ . version ( )
284
+ . map_or ( true , |v| dependency. version_req ( ) . matches ( & v) )
285
+ } )
286
+ {
287
+ trace ! ( "skipping dependency `{name}` not selected for upgrading" ) ;
276
288
return Ok ( dependency) ;
277
289
}
278
290
279
291
if !dependency. source_id ( ) . is_registry ( ) {
280
- trace ! ( "skipping non-registry dependency: {}" , name ) ;
292
+ trace ! ( "skipping non-registry dependency: {name}" ) ;
281
293
return Ok ( dependency) ;
282
294
}
283
295
284
296
let version_req = dependency. version_req ( ) ;
285
297
286
298
let OptVersionReq :: Req ( current) = version_req else {
287
- trace ! (
288
- "skipping dependency `{}` without a simple version requirement: {}" ,
289
- name,
290
- version_req
291
- ) ;
299
+ trace ! ( "skipping dependency `{name}` without a simple version requirement: {version_req}" ) ;
292
300
return Ok ( dependency) ;
293
301
} ;
294
302
295
303
let [ comparator] = & current. comparators [ ..] else {
296
304
trace ! (
297
- "skipping dependency `{}` with multiple version comparators: {:?}" ,
298
- name,
305
+ "skipping dependency `{name}` with multiple version comparators: {:?}" ,
299
306
& current. comparators
300
307
) ;
301
308
return Ok ( dependency) ;
302
309
} ;
303
310
304
311
if comparator. op != Op :: Caret {
305
- trace ! ( "skipping non-caret dependency `{}`: {}" , name , comparator ) ;
312
+ trace ! ( "skipping non-caret dependency `{name }`: {comparator}" ) ;
306
313
return Ok ( dependency) ;
307
314
}
308
315
@@ -332,30 +339,21 @@ fn upgrade_dependency(
332
339
} ;
333
340
334
341
let Some ( latest) = latest else {
335
- trace ! (
336
- "skipping dependency `{}` without any published versions" ,
337
- name
338
- ) ;
342
+ trace ! ( "skipping dependency `{name}` without any published versions" ) ;
339
343
return Ok ( dependency) ;
340
344
} ;
341
345
342
346
if current. matches ( & latest) {
343
- trace ! (
344
- "skipping dependency `{}` without a breaking update available" ,
345
- name
346
- ) ;
347
+ trace ! ( "skipping dependency `{name}` without a breaking update available" ) ;
347
348
return Ok ( dependency) ;
348
349
}
349
350
350
- let Some ( new_req_string) = upgrade_requirement ( & current. to_string ( ) , latest) ? else {
351
- trace ! (
352
- "skipping dependency `{}` because the version requirement didn't change" ,
353
- name
354
- ) ;
351
+ let Some ( ( new_req_string, _) ) = upgrade_requirement ( & current. to_string ( ) , latest) ? else {
352
+ trace ! ( "skipping dependency `{name}` because the version requirement didn't change" ) ;
355
353
return Ok ( dependency) ;
356
354
} ;
357
355
358
- let upgrade_message = format ! ( "{} {} -> {}" , name , current , new_req_string ) ;
356
+ let upgrade_message = format ! ( "{name } {current } -> {new_req_string}" ) ;
359
357
trace ! ( upgrade_message) ;
360
358
361
359
if upgrade_messages. insert ( upgrade_message. clone ( ) ) {
@@ -371,8 +369,17 @@ fn upgrade_dependency(
371
369
Ok ( dep)
372
370
}
373
371
374
- /// Update manifests with upgraded versions, and write to disk. Based on cargo-edit.
375
- /// Returns true if any file has changed.
372
+ /// Update manifests with upgraded versions, and write to disk. Based on
373
+ /// cargo-edit. Returns true if any file has changed.
374
+ ///
375
+ /// Some of the checks here are duplicating checks already done in
376
+ /// upgrade_manifests/upgrade_dependency. Why? Let's say upgrade_dependency has
377
+ /// found that dependency foo was eligible for an upgrade. But foo can occur in
378
+ /// multiple manifest files, and even multiple times in the same manifest file,
379
+ /// and may be pinned, renamed, etc. in some of the instances. So we still need
380
+ /// to check here which dependencies to actually modify. So why not drop the
381
+ /// upgrade map and redo all checks here? Because then we'd have to query the
382
+ /// registries again to find the latest versions.
376
383
pub fn write_manifest_upgrades (
377
384
ws : & Workspace < ' _ > ,
378
385
upgrades : & UpgradeMap ,
@@ -389,10 +396,7 @@ pub fn write_manifest_upgrades(
389
396
. collect :: < Vec < _ > > ( ) ;
390
397
391
398
for manifest_path in manifest_paths {
392
- trace ! (
393
- "updating TOML manifest at `{:?}` with upgraded dependencies" ,
394
- manifest_path
395
- ) ;
399
+ trace ! ( "updating TOML manifest at `{manifest_path:?}` with upgraded dependencies" ) ;
396
400
397
401
let crate_root = manifest_path
398
402
. parent ( )
@@ -410,41 +414,57 @@ pub fn write_manifest_upgrades(
410
414
dep_key_str,
411
415
dep_item,
412
416
) ?;
417
+ let name = & dependency. name ;
418
+
419
+ if let Some ( renamed_to) = dependency. rename {
420
+ trace ! ( "skipping dependency renamed from `{name}` to `{renamed_to}`" ) ;
421
+ continue ;
422
+ }
413
423
414
424
let Some ( current) = dependency. version ( ) else {
415
- trace ! ( "skipping dependency without a version: {}" , dependency . name ) ;
425
+ trace ! ( "skipping dependency without a version: {name}" ) ;
416
426
continue ;
417
427
} ;
418
428
419
429
let ( MaybeWorkspace :: Other ( source_id) , Some ( Source :: Registry ( source) ) ) =
420
430
( dependency. source_id ( ws. gctx ( ) ) ?, dependency. source ( ) )
421
431
else {
422
- trace ! ( "skipping non-registry dependency: {}" , dependency . name ) ;
432
+ trace ! ( "skipping non-registry dependency: {name}" ) ;
423
433
continue ;
424
434
} ;
425
435
426
- let Some ( latest) = upgrades. get ( & ( dependency. name . to_owned ( ) , source_id) ) else {
436
+ let Some ( latest) = upgrades. get ( & ( name. to_owned ( ) , source_id) ) else {
437
+ trace ! ( "skipping dependency without an upgrade: {name}" ) ;
438
+ continue ;
439
+ } ;
440
+
441
+ let Some ( ( new_req_string, new_req) ) = upgrade_requirement ( current, latest) ? else {
427
442
trace ! (
428
- "skipping dependency without an upgrade: {}" ,
429
- dependency. name
443
+ "skipping dependency `{name}` because the version requirement didn't change"
430
444
) ;
431
445
continue ;
432
446
} ;
433
447
434
- let Some ( new_req_string ) = upgrade_requirement ( current , latest ) ? else {
448
+ let [ comparator ] = & new_req . comparators [ .. ] else {
435
449
trace ! (
436
- "skipping dependency `{}` because the version requirement didn't change" ,
437
- dependency. name
450
+ "skipping dependency `{}` with multiple version comparators: {:?}" ,
451
+ name,
452
+ new_req. comparators
438
453
) ;
439
454
continue ;
440
455
} ;
441
456
457
+ if comparator. op != Op :: Caret {
458
+ trace ! ( "skipping non-caret dependency `{}`: {}" , name, comparator) ;
459
+ continue ;
460
+ }
461
+
442
462
let mut dep = dependency. clone ( ) ;
443
463
let mut source = source. clone ( ) ;
444
464
source. version = new_req_string;
445
465
dep. source = Some ( Source :: Registry ( source) ) ;
446
466
447
- trace ! ( "upgrading dependency {}" , dependency . name ) ;
467
+ trace ! ( "upgrading dependency {name}" ) ;
448
468
dep. update_toml ( & crate_root, & mut dep_key, dep_item) ;
449
469
manifest_has_changed = true ;
450
470
any_file_has_changed = true ;
0 commit comments