mirror of
https://github.com/astral-sh/uv
synced 2026-01-22 14:00:11 -05:00
Fix handling of Python requests with pre-releases in ranges
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user