From 3d68234e2ef7ff4a646a65b19a2fb96d8b6d14f1 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 28 Nov 2023 14:14:03 -0600 Subject: [PATCH] fix(resolver): De-prioritize no-rust-version in MSRV resolver This is a corner case without a good answer. As such, this change leans on some happy-path entries existing and preferring those. --- src/cargo/core/resolver/version_prefs.rs | 37 ++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/resolver/version_prefs.rs b/src/cargo/core/resolver/version_prefs.rs index f621c62e9d55..a3fa8acf8914 100644 --- a/src/cargo/core/resolver/version_prefs.rs +++ b/src/cargo/core/resolver/version_prefs.rs @@ -84,7 +84,38 @@ impl VersionPreferences { return previous_cmp; } - if self.max_rust_version.is_some() { + if let Some(max_rust_version) = &self.max_rust_version { + match (a.rust_version(), b.rust_version()) { + // Fallback + (None, None) => {} + (Some(a), Some(b)) if a == b => {} + // Primary comparison + (Some(a), Some(b)) => { + let a_is_compat = a <= max_rust_version; + let b_is_compat = b <= max_rust_version; + match (a_is_compat, b_is_compat) { + (true, true) => {} // fallback + (false, false) => {} // fallback + (true, false) => return Ordering::Less, + (false, true) => return Ordering::Greater, + } + } + // Prioritize `None` over incompatible + (None, Some(b)) => { + if b <= max_rust_version { + return Ordering::Greater; + } else { + return Ordering::Less; + } + } + (Some(a), None) => { + if a <= max_rust_version { + return Ordering::Less; + } else { + return Ordering::Greater; + } + } + } let msrv_a = a.rust_version() <= self.max_rust_version.as_ref(); let msrv_b = b.rust_version() <= self.max_rust_version.as_ref(); let msrv_cmp = msrv_a.cmp(&msrv_b).reverse(); @@ -245,7 +276,7 @@ mod test { vp.sort_summaries(&mut summaries, None); assert_eq!( describe(&summaries), - "foo/1.2.4, foo/1.2.2, foo/1.2.1, foo/1.2.0, foo/1.1.0, foo/1.0.9, foo/1.2.3" + "foo/1.2.1, foo/1.1.0, foo/1.2.4, foo/1.2.2, foo/1.2.0, foo/1.0.9, foo/1.2.3" .to_string() ); @@ -253,7 +284,7 @@ mod test { vp.sort_summaries(&mut summaries, None); assert_eq!( describe(&summaries), - "foo/1.0.9, foo/1.1.0, foo/1.2.0, foo/1.2.1, foo/1.2.2, foo/1.2.4, foo/1.2.3" + "foo/1.1.0, foo/1.2.1, foo/1.0.9, foo/1.2.0, foo/1.2.2, foo/1.2.4, foo/1.2.3" .to_string() ); }