Skip to content

Commit fda48a0

Browse files
committed
Auto merge of #14471 - epage:msrv, r=ehuss
feat(resolve): Report MSRV compatible version instead of incomptible ### What does this PR try to resolve? This expands on #14461 to where only MSRV-compatible versions are "actionable". MSRV-incompatible versions are therefore unstyled. We report the MSRV needed so people can choose to unblock by updating their MSRV. I had wondered if we should report the the absolute latest MSRV-incompatible version or the one with the next higher MSRV from where the user is at. Both are reasonable use cases, so I erred with absolute latest version. ```console $ cargo update --workspace -v ``` ![image](https://github.com/user-attachments/assets/27e40dda-287b-4223-a377-0233205307a2) ### How should we test and review this PR? I changed the label from `latest` to `available` to not have to keep coming up with relevant terms for each case. ### Additional information This is the final step before asking for new feedback on #13908
2 parents 2807645 + 911f5e1 commit fda48a0

File tree

36 files changed

+125
-73
lines changed

36 files changed

+125
-73
lines changed

src/cargo/ops/cargo_update.rs

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -757,31 +757,83 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
757757
}
758758

759759
let version_req = package_id.version().to_caret_req();
760-
if let Some(version) = possibilities
760+
let required_rust_version = change.required_rust_version.as_ref();
761+
762+
if let Some(summary) = possibilities
761763
.iter()
762764
.map(|s| s.as_summary())
765+
.filter(|s| {
766+
if let (Some(summary_rust_version), Some(required_rust_version)) =
767+
(s.rust_version(), required_rust_version)
768+
{
769+
summary_rust_version.is_compatible_with(required_rust_version)
770+
} else {
771+
true
772+
}
773+
})
763774
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
764-
.map(|s| s.version().clone())
765-
.max()
775+
.max_by_key(|s| s.version())
766776
{
767777
let warn = style::WARN;
768-
let report = format!(" {warn}(latest compatible: v{version}){warn:#}");
778+
let version = summary.version();
779+
let report = format!(" {warn}(available: v{version}){warn:#}");
769780
return Some(report);
770781
}
771782

772-
if let Some(version) = possibilities
783+
if let Some(summary) = possibilities
773784
.iter()
774785
.map(|s| s.as_summary())
786+
.filter(|s| {
787+
if let (Some(summary_rust_version), Some(required_rust_version)) =
788+
(s.rust_version(), required_rust_version)
789+
{
790+
summary_rust_version.is_compatible_with(required_rust_version)
791+
} else {
792+
true
793+
}
794+
})
775795
.filter(|s| is_latest(s.version(), package_id.version()))
776-
.map(|s| s.version().clone())
777-
.max()
796+
.max_by_key(|s| s.version())
778797
{
779798
let warn = if change.is_transitive.unwrap_or(true) {
780799
Default::default()
781800
} else {
782801
style::WARN
783802
};
784-
let report = format!(" {warn}(latest: v{version}){warn:#}");
803+
let version = summary.version();
804+
let report = format!(" {warn}(available: v{version}){warn:#}");
805+
return Some(report);
806+
}
807+
808+
if let Some(summary) = possibilities
809+
.iter()
810+
.map(|s| s.as_summary())
811+
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
812+
.max_by_key(|s| s.version())
813+
{
814+
let msrv_note = summary
815+
.rust_version()
816+
.map(|rv| format!(", requires Rust {rv}"))
817+
.unwrap_or_default();
818+
let warn = style::NOP;
819+
let version = summary.version();
820+
let report = format!(" {warn}(available: v{version}{msrv_note}){warn:#}");
821+
return Some(report);
822+
}
823+
824+
if let Some(summary) = possibilities
825+
.iter()
826+
.map(|s| s.as_summary())
827+
.filter(|s| is_latest(s.version(), package_id.version()))
828+
.max_by_key(|s| s.version())
829+
{
830+
let msrv_note = summary
831+
.rust_version()
832+
.map(|rv| format!(", requires Rust {rv}"))
833+
.unwrap_or_default();
834+
let warn = style::NOP;
835+
let version = summary.version();
836+
let report = format!(" {warn}(available: v{version}{msrv_note}){warn:#}");
785837
return Some(report);
786838
}
787839

tests/testsuite/cargo_add/default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/list_features_path/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/list_features_path_no_default/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/namever/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/no_default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/overwrite_default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/overwrite_default_features_with_no_default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/overwrite_no_default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cargo_add/overwrite_no_default_features_with_default_features/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

0 commit comments

Comments
 (0)