Skip to content

Commit a357186

Browse files
committed
feat(resolve): Report MSRV compatible version instead of incomptible
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.
1 parent cefde40 commit a357186

File tree

5 files changed

+63
-11
lines changed

5 files changed

+63
-11
lines changed

src/cargo/ops/cargo_update.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,9 +757,20 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
757757
}
758758

759759
let version_req = package_id.version().to_caret_req();
760+
let required_rust_version = change.required_rust_version.as_ref();
761+
760762
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()))
764775
.max_by_key(|s| s.version())
765776
{
@@ -772,6 +783,15 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
772783
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()))
776796
.max_by_key(|s| s.version())
777797
{
@@ -785,6 +805,38 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
785805
return Some(report);
786806
}
787807

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:#}");
837+
return Some(report);
838+
}
839+
788840
None
789841
}
790842

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/rust_version.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ foo v0.0.1 ([ROOT]/foo)
242242
.with_stderr_data(str![[r#"
243243
[UPDATING] `dummy-registry` index
244244
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
245-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
245+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
246246
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
247247
248248
"#]])
@@ -319,7 +319,7 @@ foo v0.0.1 ([ROOT]/foo)
319319
.with_stderr_data(str![[r#"
320320
[UPDATING] `dummy-registry` index
321321
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
322-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
322+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.2345)
323323
[ADDING] only-newer v1.6.0 (requires Rust 1.2345)
324324
325325
"#]])
@@ -490,7 +490,7 @@ higher v0.0.1 ([ROOT]/foo)
490490
.with_stderr_data(str![[r#"
491491
[UPDATING] `dummy-registry` index
492492
[LOCKING] 2 packages to latest Rust 1.50.0 compatible versions
493-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
493+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
494494
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
495495
496496
"#]])
@@ -619,7 +619,7 @@ fn resolve_edition2024() {
619619
.with_stderr_data(str![[r#"
620620
[UPDATING] `dummy-registry` index
621621
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
622-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
622+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
623623
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
624624
625625
"#]])
@@ -723,7 +723,7 @@ fn resolve_v3() {
723723
.with_stderr_data(str![[r#"
724724
[UPDATING] `dummy-registry` index
725725
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
726-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
726+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
727727
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
728728
729729
"#]])
@@ -871,7 +871,7 @@ fn update_msrv_resolve() {
871871
.with_stderr_data(str![[r#"
872872
[UPDATING] `dummy-registry` index
873873
[LOCKING] 1 package to latest Rust 1.60.0 compatible version
874-
[ADDING] bar v1.5.0 (available: v1.6.0)
874+
[ADDING] bar v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
875875
876876
"#]])
877877
.run();
@@ -932,7 +932,7 @@ fn update_precise_overrides_msrv_resolver() {
932932
.with_stderr_data(str![[r#"
933933
[UPDATING] `dummy-registry` index
934934
[LOCKING] 1 package to latest Rust 1.60.0 compatible version
935-
[ADDING] bar v1.5.0 (available: v1.6.0)
935+
[ADDING] bar v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
936936
937937
"#]])
938938
.run();
@@ -1019,7 +1019,7 @@ foo v0.0.1 ([ROOT]/foo)
10191019
.with_stderr_data(str![[r#"
10201020
[UPDATING] `dummy-registry` index
10211021
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
1022-
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
1022+
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
10231023
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
10241024
[DOWNLOADING] crates ...
10251025
[DOWNLOADED] newer-and-older v1.5.0 (registry `dummy-registry`)

0 commit comments

Comments
 (0)