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.
This commit is contained in:
Ed Page 2024-08-30 09:40:54 -05:00
parent ded3f004a4
commit 911f5e17b6
5 changed files with 63 additions and 11 deletions

View File

@ -757,9 +757,20 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
}
let version_req = package_id.version().to_caret_req();
let required_rust_version = change.required_rust_version.as_ref();
if let Some(summary) = possibilities
.iter()
.map(|s| s.as_summary())
.filter(|s| {
if let (Some(summary_rust_version), Some(required_rust_version)) =
(s.rust_version(), required_rust_version)
{
summary_rust_version.is_compatible_with(required_rust_version)
} else {
true
}
})
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
.max_by_key(|s| s.version())
{
@ -772,6 +783,15 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
if let Some(summary) = possibilities
.iter()
.map(|s| s.as_summary())
.filter(|s| {
if let (Some(summary_rust_version), Some(required_rust_version)) =
(s.rust_version(), required_rust_version)
{
summary_rust_version.is_compatible_with(required_rust_version)
} else {
true
}
})
.filter(|s| is_latest(s.version(), package_id.version()))
.max_by_key(|s| s.version())
{
@ -785,6 +805,38 @@ fn report_latest(possibilities: &[IndexSummary], change: &PackageChange) -> Opti
return Some(report);
}
if let Some(summary) = possibilities
.iter()
.map(|s| s.as_summary())
.filter(|s| package_id.version() != s.version() && version_req.matches(s.version()))
.max_by_key(|s| s.version())
{
let msrv_note = summary
.rust_version()
.map(|rv| format!(", requires Rust {rv}"))
.unwrap_or_default();
let warn = style::NOP;
let version = summary.version();
let report = format!(" {warn}(available: v{version}{msrv_note}){warn:#}");
return Some(report);
}
if let Some(summary) = possibilities
.iter()
.map(|s| s.as_summary())
.filter(|s| is_latest(s.version(), package_id.version()))
.max_by_key(|s| s.version())
{
let msrv_note = summary
.rust_version()
.map(|rv| format!(", requires Rust {rv}"))
.unwrap_or_default();
let warn = style::NOP;
let version = summary.version();
let report = format!(" {warn}(available: v{version}{msrv_note}){warn:#}");
return Some(report);
}
None
}

View File

@ -28,7 +28,7 @@
</tspan>
<tspan x="10px" y="82px"><tspan class="fg-green bold"> Locking</tspan><tspan> 1 package to latest Rust 1.70 compatible version</tspan>
</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.0 </tspan><tspan class="fg-yellow bold">(available: v0.2.1)</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.0 (available: v0.2.1, requires Rust 1.72)</tspan>
</tspan>
<tspan x="10px" y="118px">
</tspan>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -28,7 +28,7 @@
</tspan>
<tspan x="10px" y="82px"><tspan class="fg-green bold"> Locking</tspan><tspan> 1 package to latest Rust [..] compatible version</tspan>
</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.1 </tspan><tspan class="fg-yellow bold">(available: v0.2.1)</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.1 (available: v0.2.1, requires Rust 1.2345)</tspan>
</tspan>
<tspan x="10px" y="118px">
</tspan>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -28,7 +28,7 @@
</tspan>
<tspan x="10px" y="82px"><tspan class="fg-green bold"> Locking</tspan><tspan> 1 package to latest Rust [..] compatible version</tspan>
</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.1 </tspan><tspan class="fg-yellow bold">(available: v0.2.1)</tspan>
<tspan x="10px" y="100px"><tspan class="fg-cyan bold"> Adding</tspan><tspan> rust-version-user v0.1.1 (available: v0.2.1, requires Rust 1.2345)</tspan>
</tspan>
<tspan x="10px" y="118px">
</tspan>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -242,7 +242,7 @@ foo v0.0.1 ([ROOT]/foo)
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
"#]])
@ -319,7 +319,7 @@ foo v0.0.1 ([ROOT]/foo)
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.2345)
[ADDING] only-newer v1.6.0 (requires Rust 1.2345)
"#]])
@ -490,7 +490,7 @@ higher v0.0.1 ([ROOT]/foo)
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.50.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
"#]])
@ -619,7 +619,7 @@ fn resolve_edition2024() {
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
"#]])
@ -723,7 +723,7 @@ fn resolve_v3() {
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
"#]])
@ -871,7 +871,7 @@ fn update_msrv_resolve() {
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 1 package to latest Rust 1.60.0 compatible version
[ADDING] bar v1.5.0 (available: v1.6.0)
[ADDING] bar v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
"#]])
.run();
@ -932,7 +932,7 @@ fn update_precise_overrides_msrv_resolver() {
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 1 package to latest Rust 1.60.0 compatible version
[ADDING] bar v1.5.0 (available: v1.6.0)
[ADDING] bar v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
"#]])
.run();
@ -1019,7 +1019,7 @@ foo v0.0.1 ([ROOT]/foo)
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.60.0 compatible versions
[ADDING] newer-and-older v1.5.0 (available: v1.6.0)
[ADDING] newer-and-older v1.5.0 (available: v1.6.0, requires Rust 1.65.0)
[ADDING] only-newer v1.6.0 (requires Rust 1.65.0)
[DOWNLOADING] crates ...
[DOWNLOADED] newer-and-older v1.5.0 (registry `dummy-registry`)