Skip to content

Commit a246fd5

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

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 = if !change.is_transitive.unwrap_or(true) {
793811
possibilities
@@ -807,12 +825,22 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
807825
} else {
808826
None
809827
};
828+
if let Some(stats) = stats.as_mut() {
829+
if incompat_ver_compat_msrv_summary.is_some() {
830+
stats.incompat_ver_compat_msrv += 1;
831+
}
832+
}
810833

811834
let compat_ver_summary = possibilities
812835
.iter()
813836
.map(|s| s.as_summary())
814837
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
815838
.max_by_key(|s| s.version());
839+
if let Some(stats) = stats.as_mut() {
840+
if compat_ver_summary.is_some() {
841+
stats.compat_ver += 1;
842+
}
843+
}
816844

817845
let incompat_ver_summary = if !change.is_transitive.unwrap_or(true) {
818846
possibilities
@@ -823,6 +851,11 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
823851
} else {
824852
None
825853
};
854+
if let Some(stats) = stats.as_mut() {
855+
if incompat_ver_summary.is_some() {
856+
stats.incompat_ver += 1;
857+
}
858+
}
826859

827860
if let Some(summary) = compat_ver_compat_msrv_summary {
828861
let warn = style::WARN;
@@ -857,6 +890,25 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
857890
}
858891
}
859892

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

0 commit comments

Comments
 (0)