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.
This commit is contained in:
Ed Page 2023-11-28 14:14:03 -06:00
parent defe789dfa
commit 1b97a5c5c0

View File

@ -84,12 +84,37 @@ impl VersionPreferences {
return previous_cmp; return previous_cmp;
} }
if self.max_rust_version.is_some() { if let Some(max_rust_version) = &self.max_rust_version {
let msrv_a = a.rust_version() <= self.max_rust_version.as_ref(); match (a.rust_version(), b.rust_version()) {
let msrv_b = b.rust_version() <= self.max_rust_version.as_ref(); // Fallback
let msrv_cmp = msrv_a.cmp(&msrv_b).reverse(); (None, None) => {}
if msrv_cmp != Ordering::Equal { (Some(a), Some(b)) if a == b => {}
return msrv_cmp; // 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;
}
}
} }
} }
@ -245,7 +270,7 @@ mod test {
vp.sort_summaries(&mut summaries, None); vp.sort_summaries(&mut summaries, None);
assert_eq!( assert_eq!(
describe(&summaries), 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() .to_string()
); );
@ -253,7 +278,7 @@ mod test {
vp.sort_summaries(&mut summaries, None); vp.sort_summaries(&mut summaries, None);
assert_eq!( assert_eq!(
describe(&summaries), 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() .to_string()
); );
} }