Avoid panicking when encountering an invalid Python version during uv python list (#7131)

Closes https://github.com/astral-sh/uv/issues/7129

Not entirely sure about the best approach yet.
This commit is contained in:
Zanie Blue 2024-09-06 18:23:16 -05:00 committed by GitHub
parent 8a0e1fde33
commit 8eff8aab0b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 44 additions and 11 deletions

View file

@ -529,7 +529,9 @@ impl ManagedPythonDownload {
}
pub fn python_version(&self) -> PythonVersion {
self.key.version()
self.key
.version()
.expect("Managed Python downloads should always have valid versions")
}
/// Return the [`Url`] to use when downloading the distribution. If a mirror is set via the

View file

@ -242,9 +242,8 @@ impl PythonInstallationKey {
&self.implementation
}
pub fn version(&self) -> PythonVersion {
pub fn version(&self) -> Result<PythonVersion, String> {
PythonVersion::from_str(&format!("{}.{}.{}", self.major, self.minor, self.patch))
.expect("Python installation keys must have valid Python versions")
}
pub fn arch(&self) -> &Arch {
@ -338,7 +337,12 @@ impl Ord for PythonInstallationKey {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.implementation
.cmp(&other.implementation)
.then_with(|| self.version().cmp(&other.version()))
.then_with(|| {
self.major
.cmp(&other.major)
.then_with(|| self.minor.cmp(&other.minor))
.then_with(|| self.patch.cmp(&other.patch))
})
.then_with(|| self.os.to_string().cmp(&other.os.to_string()))
.then_with(|| self.arch.to_string().cmp(&other.arch.to_string()))
.then_with(|| self.libc.to_string().cmp(&other.libc.to_string()))

View file

@ -282,7 +282,9 @@ impl ManagedPythonInstallation {
/// The [`PythonVersion`] of the toolchain.
pub fn version(&self) -> PythonVersion {
self.key.version()
self.key
.version()
.expect("Managed Python installations should always have valid versions")
}
pub fn implementation(&self) -> &ImplementationName {
@ -329,13 +331,17 @@ impl ManagedPythonInstallation {
let stdlib = if matches!(self.key.os, Os(target_lexicon::OperatingSystem::Windows)) {
self.python_dir().join("Lib")
} else {
let version = self
.key
.version()
.expect("Managed Python installations should always have valid versions");
let python = if matches!(
self.key.implementation,
LenientImplementationName::Known(ImplementationName::PyPy)
) {
format!("pypy{}", self.key.version().python_version())
format!("pypy{}", version.python_version())
} else {
format!("python{}", self.key.version().python_version())
format!("python{}", version.python_version())
};
self.python_dir().join("lib").join(python)
};