@@ -523,9 +523,8 @@ fn print_lockfile_generation(
523
523
vec ! [ ]
524
524
} ;
525
525
526
- let package_id = change. package_id ;
527
526
let required_rust_version = report_required_rust_version ( resolve, change) ;
528
- let latest = report_latest ( & possibilities, package_id ) ;
527
+ let latest = report_latest ( & possibilities, change ) ;
529
528
let note = required_rust_version. or ( latest) ;
530
529
531
530
if let Some ( note) = note {
@@ -587,9 +586,8 @@ fn print_lockfile_sync(
587
586
vec ! [ ]
588
587
} ;
589
588
590
- let package_id = change. package_id ;
591
589
let required_rust_version = report_required_rust_version ( resolve, change) ;
592
- let latest = report_latest ( & possibilities, package_id ) ;
590
+ let latest = report_latest ( & possibilities, change ) ;
593
591
let note = required_rust_version. or ( latest) . unwrap_or_default ( ) ;
594
592
595
593
ws. gctx ( ) . shell ( ) . status_with_color (
@@ -641,9 +639,8 @@ fn print_lockfile_updates(
641
639
PackageChangeKind :: Added
642
640
| PackageChangeKind :: Upgraded
643
641
| PackageChangeKind :: Downgraded => {
644
- let package_id = change. package_id ;
645
642
let required_rust_version = report_required_rust_version ( resolve, change) ;
646
- let latest = report_latest ( & possibilities, package_id ) ;
643
+ let latest = report_latest ( & possibilities, change ) ;
647
644
let note = required_rust_version. or ( latest) . unwrap_or_default ( ) ;
648
645
649
646
ws. gctx ( ) . shell ( ) . status_with_color (
@@ -660,9 +657,8 @@ fn print_lockfile_updates(
660
657
) ?;
661
658
}
662
659
PackageChangeKind :: Unchanged => {
663
- let package_id = change. package_id ;
664
660
let required_rust_version = report_required_rust_version ( resolve, change) ;
665
- let latest = report_latest ( & possibilities, package_id ) ;
661
+ let latest = report_latest ( & possibilities, change ) ;
666
662
let note = required_rust_version. as_deref ( ) . or ( latest. as_deref ( ) ) ;
667
663
668
664
if let Some ( note) = note {
@@ -754,23 +750,42 @@ fn report_required_rust_version(resolve: &Resolve, change: &PackageChange) -> Op
754
750
) )
755
751
}
756
752
757
- fn report_latest ( possibilities : & [ IndexSummary ] , package : PackageId ) -> Option < String > {
758
- if !package. source_id ( ) . is_registry ( ) {
753
+ fn report_latest ( possibilities : & [ IndexSummary ] , change : & PackageChange ) -> Option < String > {
754
+ let package_id = change. package_id ;
755
+ if !package_id. source_id ( ) . is_registry ( ) {
759
756
return None ;
760
757
}
761
758
762
- possibilities
759
+ let version_req = package_id. version ( ) . to_caret_req ( ) ;
760
+ if let Some ( version) = possibilities
763
761
. iter ( )
764
762
. map ( |s| s. as_summary ( ) )
765
- . filter ( |s| is_latest ( s. version ( ) , package . version ( ) ) )
763
+ . filter ( |s| package_id . version ( ) != s. version ( ) && version_req . matches ( s . version ( ) ) )
766
764
. map ( |s| s. version ( ) . clone ( ) )
767
765
. max ( )
768
- . map ( format_latest)
769
- }
766
+ {
767
+ let warn = style:: WARN ;
768
+ let report = format ! ( " {warn}(latest compatible: v{version}){warn:#}" ) ;
769
+ return Some ( report) ;
770
+ }
771
+
772
+ if let Some ( version) = possibilities
773
+ . iter ( )
774
+ . map ( |s| s. as_summary ( ) )
775
+ . filter ( |s| is_latest ( s. version ( ) , package_id. version ( ) ) )
776
+ . map ( |s| s. version ( ) . clone ( ) )
777
+ . max ( )
778
+ {
779
+ let warn = if change. is_transitive . unwrap_or ( true ) {
780
+ Default :: default ( )
781
+ } else {
782
+ style:: WARN
783
+ } ;
784
+ let report = format ! ( " {warn}(latest: v{version}){warn:#}" ) ;
785
+ return Some ( report) ;
786
+ }
770
787
771
- fn format_latest ( version : semver:: Version ) -> String {
772
- let warn = style:: WARN ;
773
- format ! ( " {warn}(latest: v{version}){warn:#}" )
788
+ None
774
789
}
775
790
776
791
fn is_latest ( candidate : & semver:: Version , current : & semver:: Version ) -> bool {
@@ -803,13 +818,14 @@ struct PackageChange {
803
818
previous_id : Option < PackageId > ,
804
819
kind : PackageChangeKind ,
805
820
is_member : Option < bool > ,
821
+ is_transitive : Option < bool > ,
806
822
required_rust_version : Option < PartialVersion > ,
807
823
}
808
824
809
825
impl PackageChange {
810
826
pub fn new ( ws : & Workspace < ' _ > , resolve : & Resolve ) -> IndexMap < PackageId , Self > {
811
827
let diff = PackageDiff :: new ( resolve) ;
812
- Self :: with_diff ( diff, ws)
828
+ Self :: with_diff ( diff, ws, resolve )
813
829
}
814
830
815
831
pub fn diff (
@@ -818,12 +834,13 @@ impl PackageChange {
818
834
resolve : & Resolve ,
819
835
) -> IndexMap < PackageId , Self > {
820
836
let diff = PackageDiff :: diff ( previous_resolve, resolve) ;
821
- Self :: with_diff ( diff, ws)
837
+ Self :: with_diff ( diff, ws, resolve )
822
838
}
823
839
824
840
fn with_diff (
825
841
diff : impl Iterator < Item = PackageDiff > ,
826
842
ws : & Workspace < ' _ > ,
843
+ resolve : & Resolve ,
827
844
) -> IndexMap < PackageId , Self > {
828
845
let member_ids: HashSet < _ > = ws. members ( ) . map ( |p| p. package_id ( ) ) . collect ( ) ;
829
846
@@ -842,35 +859,41 @@ impl PackageChange {
842
859
PackageChangeKind :: Upgraded
843
860
} ;
844
861
let is_member = Some ( member_ids. contains ( & package_id) ) ;
862
+ let is_transitive = Some ( true ) ;
845
863
let change = Self {
846
864
package_id,
847
865
previous_id : Some ( previous_id) ,
848
866
kind,
849
867
is_member,
868
+ is_transitive,
850
869
required_rust_version : None ,
851
870
} ;
852
871
changes. insert ( change. package_id , change) ;
853
872
} else {
854
873
for package_id in diff. removed {
855
874
let kind = PackageChangeKind :: Removed ;
856
875
let is_member = None ;
876
+ let is_transitive = None ;
857
877
let change = Self {
858
878
package_id,
859
879
previous_id : None ,
860
880
kind,
861
881
is_member,
882
+ is_transitive,
862
883
required_rust_version : None ,
863
884
} ;
864
885
changes. insert ( change. package_id , change) ;
865
886
}
866
887
for package_id in diff. added {
867
888
let kind = PackageChangeKind :: Added ;
868
889
let is_member = Some ( member_ids. contains ( & package_id) ) ;
890
+ let is_transitive = Some ( true ) ;
869
891
let change = Self {
870
892
package_id,
871
893
previous_id : None ,
872
894
kind,
873
895
is_member,
896
+ is_transitive,
874
897
required_rust_version : None ,
875
898
} ;
876
899
changes. insert ( change. package_id , change) ;
@@ -879,17 +902,32 @@ impl PackageChange {
879
902
for package_id in diff. unchanged {
880
903
let kind = PackageChangeKind :: Unchanged ;
881
904
let is_member = Some ( member_ids. contains ( & package_id) ) ;
905
+ let is_transitive = Some ( true ) ;
882
906
let change = Self {
883
907
package_id,
884
908
previous_id : None ,
885
909
kind,
886
910
is_member,
911
+ is_transitive,
887
912
required_rust_version : None ,
888
913
} ;
889
914
changes. insert ( change. package_id , change) ;
890
915
}
891
916
}
892
917
918
+ for member_id in & member_ids {
919
+ let Some ( change) = changes. get_mut ( member_id) else {
920
+ continue ;
921
+ } ;
922
+ change. is_transitive = Some ( false ) ;
923
+ for ( direct_dep_id, _) in resolve. deps ( * member_id) {
924
+ let Some ( change) = changes. get_mut ( & direct_dep_id) else {
925
+ continue ;
926
+ } ;
927
+ change. is_transitive = Some ( false ) ;
928
+ }
929
+ }
930
+
893
931
changes
894
932
}
895
933
0 commit comments