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

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

Lines changed: 2 additions & 2 deletions
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 1 addition & 1 deletion
Loading

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

Lines changed: 2 additions & 2 deletions
Loading

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

Lines changed: 2 additions & 2 deletions
Loading

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/cargo_add/sorted_table_with_dotted_item/stderr.term.svg

Lines changed: 3 additions & 3 deletions
Loading

tests/testsuite/cargo_info/within_ws_without_lockfile/stderr.term.svg

Lines changed: 1 addition & 1 deletion
Loading

tests/testsuite/cfg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ fn ignore_version_from_other_platform() {
145145
.with_stderr_data(str![[r#"
146146
[UPDATING] `dummy-registry` index
147147
[LOCKING] 2 packages to latest compatible versions
148-
[ADDING] bar v0.1.0 (latest: v0.2.0)
148+
[ADDING] bar v0.1.0 (available: v0.2.0)
149149
[DOWNLOADING] crates ...
150150
[DOWNLOADED] bar v0.1.0 (registry `dummy-registry`)
151151
[CHECKING] bar v0.1.0

tests/testsuite/collisions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ fn collision_doc_multiple_versions() {
207207
str![[r#"
208208
[UPDATING] `dummy-registry` index
209209
[LOCKING] 3 packages to latest compatible versions
210-
[ADDING] bar v1.0.0 (latest: v2.0.0)
210+
[ADDING] bar v1.0.0 (available: v2.0.0)
211211
[DOWNLOADING] crates ...
212212
[DOWNLOADED] bar v2.0.0 (registry `dummy-registry`)
213213
[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`)
@@ -503,7 +503,7 @@ fn collision_doc_target() {
503503
str![[r#"
504504
[UPDATING] `dummy-registry` index
505505
[LOCKING] 3 packages to latest compatible versions
506-
[ADDING] bar v1.0.0 (latest: v2.0.0)
506+
[ADDING] bar v1.0.0 (available: v2.0.0)
507507
[DOWNLOADING] crates ...
508508
[DOWNLOADED] orphaned v1.0.0 (registry `dummy-registry`)
509509
[DOWNLOADED] bar v2.0.0 (registry `dummy-registry`)

tests/testsuite/direct_minimal_versions.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn simple() {
3333
.with_stderr_data(str![[r#"
3434
[UPDATING] `dummy-registry` index
3535
[LOCKING] 1 package
36-
[ADDING] dep v1.0.0 (latest compatible: v1.1.0)
36+
[ADDING] dep v1.0.0 (available: v1.1.0)
3737
3838
"#]])
3939
.run();
@@ -122,7 +122,7 @@ fn yanked() {
122122
.with_stderr_data(str![[r#"
123123
[UPDATING] `dummy-registry` index
124124
[LOCKING] 1 package
125-
[ADDING] dep v1.1.0 (latest compatible: v1.2.0)
125+
[ADDING] dep v1.1.0 (available: v1.2.0)
126126
127127
"#]])
128128
.run();
@@ -176,7 +176,7 @@ fn indirect() {
176176
.with_stderr_data(str![[r#"
177177
[UPDATING] `dummy-registry` index
178178
[LOCKING] 2 packages
179-
[ADDING] direct v1.0.0 (latest compatible: v1.1.0)
179+
[ADDING] direct v1.0.0 (available: v1.1.0)
180180
181181
"#]])
182182
.run();

tests/testsuite/directory.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ fn multiple() {
329329
p.cargo("check")
330330
.with_stderr_data(str![[r#"
331331
[LOCKING] 1 package to latest compatible version
332-
[ADDING] bar v0.1.0 (latest: v0.2.0)
332+
[ADDING] bar v0.1.0 (available: v0.2.0)
333333
[CHECKING] bar v0.1.0
334334
[CHECKING] foo v0.1.0 ([ROOT]/foo)
335335
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s

0 commit comments

Comments
 (0)