Fix `uv python upgrade` replacement of installed binaries on pre-release to stable (#16159)

This commit is contained in:
Zanie Blue 2025-10-07 15:29:42 -05:00 committed by GitHub
parent 3a507e69b2
commit df0a12d461
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 14 deletions

View File

@ -681,19 +681,22 @@ impl ManagedPythonInstallation {
if (self.key.major, self.key.minor) != (other.key.major, other.key.minor) { if (self.key.major, self.key.minor) != (other.key.major, other.key.minor) {
return false; return false;
} }
// Require a newer, or equal patch version (for pre-release upgrades) // If the patch versions are the same, we're handling a pre-release upgrade
if self.key.patch == other.key.patch {
return match (self.key.prerelease, other.key.prerelease) {
// Require a newer pre-release, if present on both
(Some(self_pre), Some(other_pre)) => self_pre > other_pre,
// Allow upgrade from pre-release to stable
(None, Some(_)) => true,
// Do not upgrade from pre-release to stable, or for matching versions
(_, None) => false,
};
}
// Require a newer patch version
if self.key.patch < other.key.patch { if self.key.patch < other.key.patch {
return false; return false;
} }
if let Some(other_pre) = other.key.prerelease { true
if let Some(self_pre) = self.key.prerelease {
return self_pre > other_pre;
}
// Do not upgrade from non-prerelease to prerelease
return false;
}
// Do not upgrade if the patch versions are the same
self.key.patch != other.key.patch
} }
pub fn url(&self) -> Option<&str> { pub fn url(&self) -> Option<&str> {
@ -1136,9 +1139,10 @@ mod tests {
PythonVariant::Default, PythonVariant::Default,
); );
// Stable version should not upgrade from prerelease // A stable version is an upgrade from prerelease
assert!(!stable.is_upgrade_of(&prerelease)); assert!(stable.is_upgrade_of(&prerelease));
// Prerelease should not upgrade to stable (same patch version)
// Prerelease are not upgrades of stable versions
assert!(!prerelease.is_upgrade_of(&stable)); assert!(!prerelease.is_upgrade_of(&stable));
} }

View File

@ -85,7 +85,7 @@ fn python_upgrade() {
----- stderr ----- ----- stderr -----
warning: `uv python upgrade` is experimental and may change without warning. Pass `--preview-features python-upgrade` to disable this warning warning: `uv python upgrade` is experimental and may change without warning. Pass `--preview-features python-upgrade` to disable this warning
Installed Python 3.14.0 in [TIME] Installed Python 3.14.0 in [TIME]
+ cpython-3.14.0-[PLATFORM] + cpython-3.14.0-[PLATFORM] (python3.14)
"); ");
} }