From 28bb880b4f4b2d6208f3fe11881db410b11b5532 Mon Sep 17 00:00:00 2001
From: mayeut <mayeut@users.noreply.github.com>
Date: Sun, 19 Jan 2025 11:58:33 +0100
Subject: [PATCH] fix: install PyPy on Linux ARM64

---
 dist/setup/index.js | 15 ++++++++++-----
 src/install-pypy.ts | 15 ++++++++++-----
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index e56f9660..7c655586 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -91554,28 +91554,33 @@ function pypyVersionToSemantic(versionSpec) {
 }
 exports.pypyVersionToSemantic = pypyVersionToSemantic;
 function isArchPresentForWindows(item, architecture) {
-    architecture = replaceX32toX86(architecture);
+    architecture = pypyArchitecture(architecture);
     return item.files.some((file) => utils_1.WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture);
 }
 exports.isArchPresentForWindows = isArchPresentForWindows;
 function isArchPresentForMacOrLinux(item, architecture, platform) {
+    architecture = pypyArchitecture(architecture);
     return item.files.some((file) => file.arch === architecture && file.platform === platform);
 }
 exports.isArchPresentForMacOrLinux = isArchPresentForMacOrLinux;
 function findAssetForWindows(releases, architecture) {
-    architecture = replaceX32toX86(architecture);
+    architecture = pypyArchitecture(architecture);
     return releases.files.find((item) => utils_1.WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture);
 }
 exports.findAssetForWindows = findAssetForWindows;
 function findAssetForMacOrLinux(releases, architecture, platform) {
+    architecture = pypyArchitecture(architecture);
     return releases.files.find((item) => item.arch === architecture && item.platform === platform);
 }
 exports.findAssetForMacOrLinux = findAssetForMacOrLinux;
-function replaceX32toX86(architecture) {
-    // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
-    if (architecture === 'x32') {
+function pypyArchitecture(architecture) {
+    if (utils_1.IS_WINDOWS && architecture === 'x32') {
+        // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
         architecture = 'x86';
     }
+    else if (utils_1.IS_LINUX && architecture === 'arm64') {
+        architecture = 'aarch64';
+    }
     return architecture;
 }
 
diff --git a/src/install-pypy.ts b/src/install-pypy.ts
index 75922110..405f9f60 100644
--- a/src/install-pypy.ts
+++ b/src/install-pypy.ts
@@ -8,6 +8,7 @@ import * as exec from '@actions/exec';
 import fs from 'fs';
 
 import {
+  IS_LINUX,
   IS_WINDOWS,
   WINDOWS_PLATFORMS,
   IPyPyManifestRelease,
@@ -246,7 +247,7 @@ export function pypyVersionToSemantic(versionSpec: string) {
 }
 
 export function isArchPresentForWindows(item: any, architecture: string) {
-  architecture = replaceX32toX86(architecture);
+  architecture = pypyArchitecture(architecture);
   return item.files.some(
     (file: any) =>
       WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture
@@ -258,13 +259,14 @@ export function isArchPresentForMacOrLinux(
   architecture: string,
   platform: string
 ) {
+  architecture = pypyArchitecture(architecture);
   return item.files.some(
     (file: any) => file.arch === architecture && file.platform === platform
   );
 }
 
 export function findAssetForWindows(releases: any, architecture: string) {
-  architecture = replaceX32toX86(architecture);
+  architecture = pypyArchitecture(architecture);
   return releases.files.find(
     (item: any) =>
       WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture
@@ -276,15 +278,18 @@ export function findAssetForMacOrLinux(
   architecture: string,
   platform: string
 ) {
+  architecture = pypyArchitecture(architecture);
   return releases.files.find(
     (item: any) => item.arch === architecture && item.platform === platform
   );
 }
 
-function replaceX32toX86(architecture: string): string {
-  // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
-  if (architecture === 'x32') {
+function pypyArchitecture(architecture: string): string {
+  if (IS_WINDOWS && architecture === 'x32') {
+    // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
     architecture = 'x86';
+  } else if (IS_LINUX && architecture === 'arm64') {
+    architecture = 'aarch64';
   }
   return architecture;
 }