@@ -492,7 +492,7 @@ fn print_lockfile_generation(
492
492
resolve : & Resolve ,
493
493
registry : & mut PackageRegistry < ' _ > ,
494
494
) -> CargoResult < ( ) > {
495
- let changes = PackageChange :: new ( ws, resolve) ;
495
+ let mut changes = PackageChange :: new ( ws, resolve) ;
496
496
let num_pkgs: usize = changes
497
497
. values ( )
498
498
. filter ( |change| change. kind . is_new ( ) && !change. is_member . unwrap_or ( false ) )
@@ -501,8 +501,9 @@ fn print_lockfile_generation(
501
501
// nothing worth reporting
502
502
return Ok ( ( ) ) ;
503
503
}
504
- status_locking ( ws, num_pkgs ) ? ;
504
+ annotate_required_rust_version ( ws, resolve , & mut changes ) ;
505
505
506
+ status_locking ( ws, num_pkgs) ?;
506
507
for change in changes. values ( ) {
507
508
if change. is_member . unwrap_or ( false ) {
508
509
continue ;
@@ -523,7 +524,7 @@ fn print_lockfile_generation(
523
524
} ;
524
525
525
526
let package_id = change. package_id ;
526
- let required_rust_version = report_required_rust_version ( ws , resolve, package_id ) ;
527
+ let required_rust_version = report_required_rust_version ( resolve, change ) ;
527
528
let latest = report_latest ( & possibilities, package_id) ;
528
529
let note = required_rust_version. or ( latest) ;
529
530
@@ -553,7 +554,7 @@ fn print_lockfile_sync(
553
554
resolve : & Resolve ,
554
555
registry : & mut PackageRegistry < ' _ > ,
555
556
) -> CargoResult < ( ) > {
556
- let changes = PackageChange :: diff ( ws, previous_resolve, resolve) ;
557
+ let mut changes = PackageChange :: diff ( ws, previous_resolve, resolve) ;
557
558
let num_pkgs: usize = changes
558
559
. values ( )
559
560
. filter ( |change| change. kind . is_new ( ) && !change. is_member . unwrap_or ( false ) )
@@ -562,8 +563,9 @@ fn print_lockfile_sync(
562
563
// nothing worth reporting
563
564
return Ok ( ( ) ) ;
564
565
}
565
- status_locking ( ws, num_pkgs ) ? ;
566
+ annotate_required_rust_version ( ws, resolve , & mut changes ) ;
566
567
568
+ status_locking ( ws, num_pkgs) ?;
567
569
for change in changes. values ( ) {
568
570
if change. is_member . unwrap_or ( false ) {
569
571
continue ;
@@ -586,7 +588,7 @@ fn print_lockfile_sync(
586
588
} ;
587
589
588
590
let package_id = change. package_id ;
589
- let required_rust_version = report_required_rust_version ( ws , resolve, package_id ) ;
591
+ let required_rust_version = report_required_rust_version ( resolve, change ) ;
590
592
let latest = report_latest ( & possibilities, package_id) ;
591
593
let note = required_rust_version. or ( latest) . unwrap_or_default ( ) ;
592
594
@@ -610,15 +612,16 @@ fn print_lockfile_updates(
610
612
precise : bool ,
611
613
registry : & mut PackageRegistry < ' _ > ,
612
614
) -> CargoResult < ( ) > {
613
- let changes = PackageChange :: diff ( ws, previous_resolve, resolve) ;
615
+ let mut changes = PackageChange :: diff ( ws, previous_resolve, resolve) ;
614
616
let num_pkgs: usize = changes
615
617
. values ( )
616
618
. filter ( |change| change. kind . is_new ( ) )
617
619
. count ( ) ;
620
+ annotate_required_rust_version ( ws, resolve, & mut changes) ;
621
+
618
622
if !precise {
619
623
status_locking ( ws, num_pkgs) ?;
620
624
}
621
-
622
625
let mut unchanged_behind = 0 ;
623
626
for change in changes. values ( ) {
624
627
let possibilities = if let Some ( query) = change. alternatives_query ( ) {
@@ -639,7 +642,7 @@ fn print_lockfile_updates(
639
642
| PackageChangeKind :: Upgraded
640
643
| PackageChangeKind :: Downgraded => {
641
644
let package_id = change. package_id ;
642
- let required_rust_version = report_required_rust_version ( ws , resolve, package_id ) ;
645
+ let required_rust_version = report_required_rust_version ( resolve, change ) ;
643
646
let latest = report_latest ( & possibilities, package_id) ;
644
647
let note = required_rust_version. or ( latest) . unwrap_or_default ( ) ;
645
648
@@ -658,7 +661,7 @@ fn print_lockfile_updates(
658
661
}
659
662
PackageChangeKind :: Unchanged => {
660
663
let package_id = change. package_id ;
661
- let required_rust_version = report_required_rust_version ( ws , resolve, package_id ) ;
664
+ let required_rust_version = report_required_rust_version ( resolve, change ) ;
662
665
let latest = report_latest ( & possibilities, package_id) ;
663
666
let note = required_rust_version. as_deref ( ) . or ( latest. as_deref ( ) ) ;
664
667
@@ -734,18 +737,14 @@ fn required_rust_version(ws: &Workspace<'_>) -> Option<PartialVersion> {
734
737
}
735
738
}
736
739
737
- fn report_required_rust_version (
738
- ws : & Workspace < ' _ > ,
739
- resolve : & Resolve ,
740
- package : PackageId ,
741
- ) -> Option < String > {
742
- if package. source_id ( ) . is_path ( ) {
740
+ fn report_required_rust_version ( resolve : & Resolve , change : & PackageChange ) -> Option < String > {
741
+ if change. package_id . source_id ( ) . is_path ( ) {
743
742
return None ;
744
743
}
745
- let summary = resolve. summary ( package ) ;
744
+ let summary = resolve. summary ( change . package_id ) ;
746
745
let package_rust_version = summary. rust_version ( ) ?;
747
- let workspace_rust_version = required_rust_version ( ws ) ?;
748
- if package_rust_version. is_compatible_with ( & workspace_rust_version ) {
746
+ let required_rust_version = change . required_rust_version . as_ref ( ) ?;
747
+ if package_rust_version. is_compatible_with ( required_rust_version ) {
749
748
return None ;
750
749
}
751
750
@@ -804,6 +803,7 @@ struct PackageChange {
804
803
previous_id : Option < PackageId > ,
805
804
kind : PackageChangeKind ,
806
805
is_member : Option < bool > ,
806
+ required_rust_version : Option < PartialVersion > ,
807
807
}
808
808
809
809
impl PackageChange {
@@ -847,6 +847,7 @@ impl PackageChange {
847
847
previous_id : Some ( previous_id) ,
848
848
kind,
849
849
is_member,
850
+ required_rust_version : None ,
850
851
} ;
851
852
changes. insert ( change. package_id , change) ;
852
853
} else {
@@ -858,6 +859,7 @@ impl PackageChange {
858
859
previous_id : None ,
859
860
kind,
860
861
is_member,
862
+ required_rust_version : None ,
861
863
} ;
862
864
changes. insert ( change. package_id , change) ;
863
865
}
@@ -869,6 +871,7 @@ impl PackageChange {
869
871
previous_id : None ,
870
872
kind,
871
873
is_member,
874
+ required_rust_version : None ,
872
875
} ;
873
876
changes. insert ( change. package_id , change) ;
874
877
}
@@ -881,6 +884,7 @@ impl PackageChange {
881
884
previous_id : None ,
882
885
kind,
883
886
is_member,
887
+ required_rust_version : None ,
884
888
} ;
885
889
changes. insert ( change. package_id , change) ;
886
890
}
@@ -1076,3 +1080,47 @@ impl PackageDiff {
1076
1080
}
1077
1081
}
1078
1082
}
1083
+
1084
+ fn annotate_required_rust_version (
1085
+ ws : & Workspace < ' _ > ,
1086
+ resolve : & Resolve ,
1087
+ changes : & mut IndexMap < PackageId , PackageChange > ,
1088
+ ) {
1089
+ let rustc = ws. gctx ( ) . load_global_rustc ( Some ( ws) ) . ok ( ) ;
1090
+ let rustc_version: Option < PartialVersion > =
1091
+ rustc. as_ref ( ) . map ( |rustc| rustc. version . clone ( ) . into ( ) ) ;
1092
+
1093
+ if ws. resolve_honors_rust_version ( ) {
1094
+ let mut queue: std:: collections:: VecDeque < _ > = ws
1095
+ . members ( )
1096
+ . map ( |p| {
1097
+ (
1098
+ p. rust_version ( )
1099
+ . map ( |r| r. clone ( ) . into_partial ( ) )
1100
+ . or_else ( || rustc_version. clone ( ) ) ,
1101
+ p. package_id ( ) ,
1102
+ )
1103
+ } )
1104
+ . collect ( ) ;
1105
+ while let Some ( ( required_rust_version, current_id) ) = queue. pop_front ( ) {
1106
+ let Some ( required_rust_version) = required_rust_version else {
1107
+ continue ;
1108
+ } ;
1109
+ if let Some ( change) = changes. get_mut ( & current_id) {
1110
+ if let Some ( existing) = change. required_rust_version . take ( ) {
1111
+ if existing <= required_rust_version {
1112
+ // Stop early; we already walked down this path with a better match
1113
+ change. required_rust_version = Some ( existing) ;
1114
+ continue ;
1115
+ }
1116
+ }
1117
+ change. required_rust_version = Some ( required_rust_version. clone ( ) ) ;
1118
+ }
1119
+ queue. extend (
1120
+ resolve
1121
+ . deps ( current_id)
1122
+ . map ( |( dep, _) | ( Some ( required_rust_version. clone ( ) ) , dep) ) ,
1123
+ ) ;
1124
+ }
1125
+ }
1126
+ }
0 commit comments