Fix handling of Python requests with pre-releases in ranges

This commit is contained in:
Zanie Blue
2025-10-09 10:29:58 -05:00
parent 24ebdf02c0
commit fb7d5361b0
2 changed files with 122 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ use itertools::{Either, Itertools};
use regex::Regex;
use rustc_hash::{FxBuildHasher, FxHashSet};
use same_file::is_same_file;
use std::borrow::Cow;
use std::env::consts::EXE_SUFFIX;
use std::fmt::{self, Debug, Formatter};
use std::{env, io, iter};
@@ -2692,7 +2693,16 @@ impl VersionRequest {
&& variant.matches_interpreter(interpreter)
}
Self::Range(specifiers, variant) => {
let version = interpreter.python_version().only_release();
// If the specifier contains pre-releases, use the full version for comparison.
// Otherwise, strip pre-release so that, e.g., `>=3.14` matches `3.14.0rc3`.
let version = if specifiers
.iter()
.any(uv_pep440::VersionSpecifier::any_prerelease)
{
Cow::Borrowed(interpreter.python_version())
} else {
Cow::Owned(interpreter.python_version().only_release())
};
specifiers.contains(&version) && variant.matches_interpreter(interpreter)
}
Self::MajorMinorPrerelease(major, minor, prerelease, variant) => {
@@ -2725,7 +2735,19 @@ impl VersionRequest {
(version.major(), version.minor(), version.patch())
== (*major, *minor, Some(*patch))
}
Self::Range(specifiers, _) => specifiers.contains(&version.version.only_release()),
Self::Range(specifiers, _) => {
// If the specifier contains pre-releases, use the full version for comparison.
// Otherwise, strip pre-release so that, e.g., `>=3.14` matches `3.14.0rc3`.
let version = if specifiers
.iter()
.any(uv_pep440::VersionSpecifier::any_prerelease)
{
Cow::Borrowed(&version.version)
} else {
Cow::Owned(version.version.only_release())
};
specifiers.contains(&version)
}
Self::MajorMinorPrerelease(major, minor, prerelease, _) => {
(version.major(), version.minor(), version.pre())
== (*major, *minor, Some(*prerelease))