Skip to content

Commit c41798a

Browse files
committed
refactor(resolve): Change how we calculate unchanged
1 parent ed073c9 commit c41798a

File tree

1 file changed

+65
-13
lines changed

1 file changed

+65
-13
lines changed

src/cargo/ops/cargo_update.rs

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,8 @@ fn print_lockfile_generation(
538538
vec![]
539539
};
540540

541-
let required_rust_version = report_required_rust_version(resolve, change);
542-
let latest = report_latest(&possibilities, change);
541+
let required_rust_version = report_required_rust_version(resolve, change, None);
542+
let latest = report_latest(&possibilities, change, None);
543543
let note = required_rust_version.or(latest);
544544

545545
if let Some(note) = note {
@@ -601,8 +601,8 @@ fn print_lockfile_sync(
601601
vec![]
602602
};
603603

604-
let required_rust_version = report_required_rust_version(resolve, change);
605-
let latest = report_latest(&possibilities, change);
604+
let required_rust_version = report_required_rust_version(resolve, change, None);
605+
let latest = report_latest(&possibilities, change, None);
606606
let note = required_rust_version.or(latest).unwrap_or_default();
607607

608608
ws.gctx().shell().status_with_color(
@@ -654,8 +654,8 @@ fn print_lockfile_updates(
654654
PackageChangeKind::Added
655655
| PackageChangeKind::Upgraded
656656
| PackageChangeKind::Downgraded => {
657-
let required_rust_version = report_required_rust_version(resolve, change);
658-
let latest = report_latest(&possibilities, change);
657+
let required_rust_version = report_required_rust_version(resolve, change, None);
658+
let latest = report_latest(&possibilities, change, None);
659659
let note = required_rust_version.or(latest).unwrap_or_default();
660660

661661
ws.gctx().shell().status_with_color(
@@ -672,14 +672,16 @@ fn print_lockfile_updates(
672672
)?;
673673
}
674674
PackageChangeKind::Unchanged => {
675-
let required_rust_version = report_required_rust_version(resolve, change);
676-
let latest = report_latest(&possibilities, change);
675+
let mut unchanged_stats = UpdateStats::default();
676+
let required_rust_version =
677+
report_required_rust_version(resolve, change, Some(&mut unchanged_stats));
678+
let latest = report_latest(&possibilities, change, Some(&mut unchanged_stats));
677679
let note = required_rust_version.as_deref().or(latest.as_deref());
678680

681+
if unchanged_stats.behind() {
682+
unchanged_behind += 1;
683+
}
679684
if let Some(note) = note {
680-
if latest.is_some() {
681-
unchanged_behind += 1;
682-
}
683685
if ws.gctx().shell().verbosity() == Verbosity::Verbose {
684686
ws.gctx().shell().status_with_color(
685687
change.kind.status(),
@@ -748,7 +750,11 @@ fn required_rust_version(ws: &Workspace<'_>) -> Option<PartialVersion> {
748750
}
749751
}
750752

751-
fn report_required_rust_version(resolve: &Resolve, change: &PackageChange) -> Option<String> {
753+
fn report_required_rust_version(
754+
resolve: &Resolve,
755+
change: &PackageChange,
756+
stats: Option<&mut UpdateStats>,
757+
) -> Option<String> {
752758
if change.package_id.source_id().is_path() {
753759
return None;
754760
}
@@ -759,13 +765,20 @@ fn report_required_rust_version(resolve: &Resolve, change: &PackageChange) -> Op
759765
return None;
760766
}
761767

768+
if let Some(stats) = stats {
769+
stats.required_rust_version += 1;
770+
}
762771
let error = style::ERROR;
763772
Some(format!(
764773
" {error}(requires Rust {package_rust_version}){error:#}"
765774
))
766775
}
767776

768-
fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Option<String> {
777+
fn report_latest(
778+
possibilities: &[IndexSummary],
779+
change: &PackageChange,
780+
mut stats: Option<&mut UpdateStats>,
781+
) -> Option<String> {
769782
let package_id = change.package_id;
770783
if !package_id.source_id().is_registry() {
771784
return None;
@@ -788,6 +801,11 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
788801
})
789802
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
790803
.max_by_key(|s| s.version());
804+
if let Some(ref mut stats) = stats {
805+
if compat_ver_compat_msrv_summary.is_some() {
806+
stats.compat_ver_compat_msrv += 1;
807+
}
808+
}
791809

792810
let incompat_ver_compat_msrv_summary = possibilities
793811
.iter()
@@ -803,18 +821,33 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
803821
})
804822
.filter(|s| is_latest(s.version(), package_id.version()))
805823
.max_by_key(|s| s.version());
824+
if let Some(stats) = stats.as_mut() {
825+
if incompat_ver_compat_msrv_summary.is_some() {
826+
stats.incompat_ver_compat_msrv += 1;
827+
}
828+
}
806829

807830
let compat_ver_summary = possibilities
808831
.iter()
809832
.map(|s| s.as_summary())
810833
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
811834
.max_by_key(|s| s.version());
835+
if let Some(stats) = stats.as_mut() {
836+
if compat_ver_summary.is_some() {
837+
stats.compat_ver += 1;
838+
}
839+
}
812840

813841
let incompat_ver_summary = possibilities
814842
.iter()
815843
.map(|s| s.as_summary())
816844
.filter(|s| is_latest(s.version(), package_id.version()))
817845
.max_by_key(|s| s.version());
846+
if let Some(stats) = stats.as_mut() {
847+
if incompat_ver_summary.is_some() {
848+
stats.incompat_ver += 1;
849+
}
850+
}
818851

819852
if let Some(summary) = compat_ver_compat_msrv_summary {
820853
let warn = style::WARN;
@@ -853,6 +886,25 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
853886
}
854887
}
855888

889+
#[derive(Default)]
890+
struct UpdateStats {
891+
required_rust_version: usize,
892+
compat_ver_compat_msrv: usize,
893+
incompat_ver_compat_msrv: usize,
894+
compat_ver: usize,
895+
incompat_ver: usize,
896+
}
897+
898+
impl UpdateStats {
899+
fn behind(&self) -> bool {
900+
self.compat_ver_compat_msrv
901+
+ self.incompat_ver_compat_msrv
902+
+ self.compat_ver
903+
+ self.incompat_ver
904+
!= 0
905+
}
906+
}
907+
856908
fn is_latest(candidate: &semver::Version, current: &semver::Version) -> bool {
857909
current < candidate
858910
// Only match pre-release if major.minor.patch are the same

0 commit comments

Comments
 (0)