diff --git a/crates/uv-platform-tags/src/platform.rs b/crates/uv-platform-tags/src/platform.rs index 8533f85d6..c1d02c915 100644 --- a/crates/uv-platform-tags/src/platform.rs +++ b/crates/uv-platform-tags/src/platform.rs @@ -11,8 +11,12 @@ pub enum PlatformError { IOError(#[from] io::Error), #[error("Failed to detect the operating system version: {0}")] OsVersionDetectionError(String), - #[error("Failed to detect the arch: {0}")] - ArchDetectionError(String), + #[error("Invalid Android architecture: {0}")] + InvalidAndroidArch(Arch), + #[error("Invalid iOS simulator architecture: {0}")] + InvalidIosSimulatorArch(Arch), + #[error("Invalid iOS device architecture: {0}")] + InvalidIosDeviceArch(Arch), } #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)] diff --git a/crates/uv-platform-tags/src/platform_tag.rs b/crates/uv-platform-tags/src/platform_tag.rs index 3f620e347..34bb7f83a 100644 --- a/crates/uv-platform-tags/src/platform_tag.rs +++ b/crates/uv-platform-tags/src/platform_tag.rs @@ -79,6 +79,9 @@ pub enum PlatformTag { Ios { major: u16, minor: u16, + /// iOS architecture and whether it is a simulator or a real device. + /// + /// Not to be confused with the Linux mulitarch concept. multiarch: IosMultiarch, }, } @@ -843,21 +846,20 @@ impl FromStr for PlatformTag { tag: s.to_string(), })?; - let multiarch_str = &rest[second_underscore + 1..]; - if multiarch_str.is_empty() { + let multiarch = &rest[second_underscore + 1..]; + if multiarch.is_empty() { return Err(ParsePlatformTagError::InvalidFormat { platform: "ios", tag: s.to_string(), }); } - let multiarch = - multiarch_str - .parse() - .map_err(|_| ParsePlatformTagError::InvalidArch { - platform: "ios", - tag: s.to_string(), - })?; + let multiarch = multiarch + .parse() + .map_err(|_| ParsePlatformTagError::InvalidArch { + platform: "ios", + tag: s.to_string(), + })?; return Ok(Self::Ios { major, diff --git a/crates/uv-platform-tags/src/tags.rs b/crates/uv-platform-tags/src/tags.rs index 1a7f90068..a8f26ddf9 100644 --- a/crates/uv-platform-tags/src/tags.rs +++ b/crates/uv-platform-tags/src/tags.rs @@ -694,7 +694,7 @@ fn compatible_tags(platform: &Platform) -> Result, PlatformErro for ver in (16..=*api_level).rev() { platform_tags.push(PlatformTag::Android { api_level: ver, - abi: AndroidAbi::from_arch(arch).map_err(PlatformError::ArchDetectionError)?, + abi: AndroidAbi::from_arch(arch)?, }); } @@ -716,8 +716,7 @@ fn compatible_tags(platform: &Platform) -> Result, PlatformErro ) => { // Source: https://github.com/pypa/packaging/blob/e9b9d09ebc5992ecad1799da22ee5faefb9cc7cb/src/packaging/tags.py#L484 let mut platform_tags = vec![]; - let multiarch = IosMultiarch::from_arch(arch, *simulator) - .map_err(PlatformError::ArchDetectionError)?; + let multiarch = IosMultiarch::from_arch(arch, *simulator)?; // Consider any iOS major.minor version from the version requested, down to // 12.0. 12.0 is the first iOS version that is known to have enough features @@ -940,13 +939,13 @@ impl FromStr for AndroidAbi { impl AndroidAbi { /// Determine the appropriate Android arch. - pub fn from_arch(arch: Arch) -> Result { + pub fn from_arch(arch: Arch) -> Result { match arch { Arch::Aarch64 => Ok(Self::Arm64V8a), Arch::Armv7L => Ok(Self::ArmeabiV7a), Arch::X86 => Ok(Self::X86), Arch::X86_64 => Ok(Self::X86_64), - _ => Err(format!("Invalid Android arch format: {arch}")), + _ => Err(PlatformError::InvalidAndroidArch(arch)), } } @@ -961,6 +960,9 @@ impl AndroidAbi { } } +/// iOS architecture and whether it is a simulator or a real device. +/// +/// Not to be confused with the Linux mulitarch concept. #[derive( Debug, Copy, @@ -1003,17 +1005,17 @@ impl FromStr for IosMultiarch { impl IosMultiarch { /// Determine the appropriate multiarch for a iOS version. - pub fn from_arch(arch: Arch, simulator: bool) -> Result { + pub fn from_arch(arch: Arch, simulator: bool) -> Result { if simulator { match arch { Arch::Aarch64 => Ok(Self::Arm64Simulator), Arch::X86_64 => Ok(Self::X86_64Simulator), - _ => Err(format!("Invalid iOS simulator arch: {arch}")), + _ => Err(PlatformError::InvalidIosSimulatorArch(arch)), } } else { match arch { Arch::Aarch64 => Ok(Self::Arm64Device), - _ => Err(format!("Invalid iOS device arch: {arch}")), + _ => Err(PlatformError::InvalidIosDeviceArch(arch)), } } } diff --git a/crates/uv-python/python/get_interpreter_info.py b/crates/uv-python/python/get_interpreter_info.py index 53da37ba7..46901a40f 100644 --- a/crates/uv-python/python/get_interpreter_info.py +++ b/crates/uv-python/python/get_interpreter_info.py @@ -531,6 +531,7 @@ def get_operating_system_and_architecture(): "minor": int(version[1]), "simulator": ios_ver.is_simulator, } + [_version, architecture, _platform] = version_arch.split("-") elif operating_system == "emscripten": pyodide_abi_version = sysconfig.get_config_var("PYODIDE_ABI_VERSION") if not pyodide_abi_version: