From 8bcd2560e267a43fbd8ff66c50da8a61825a0782 Mon Sep 17 00:00:00 2001
From: Vladimir Safonkin <vsafonkin@github.com>
Date: Tue, 18 Oct 2022 11:01:15 +0200
Subject: [PATCH] Add architecture input check for PyPy for Windows platform
 (#520)

* Revert cache index.js

* build cache index file

* Refactor

* Debug

* Debug

* Debug

* Debug

* Debug

* Debug

* Debug

* Debug

* Format code

* Rebuild dist

* Minor refactor

* Format code

* Minor fixes

* Check platform firstly
---
 dist/setup/index.js | 23 +++++++++++++++--------
 src/install-pypy.ts | 25 ++++++++++++++++---------
 2 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index d9282071..f153c3c2 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -66577,7 +66577,7 @@ function findRelease(releases, pythonVersion, pypyVersion, architecture) {
             semver.satisfies(pypyVersionToSemantic(item.pypy_version), pypyVersion);
         const isArchPresent = item.files &&
             (utils_1.IS_WINDOWS
-                ? isArchPresentForWindows(item)
+                ? isArchPresentForWindows(item, architecture)
                 : isArchPresentForMacOrLinux(item, architecture, process.platform));
         return isPythonVersionSatisfied && isPyPyVersionSatisfied && isArchPresent;
     });
@@ -66590,7 +66590,7 @@ function findRelease(releases, pythonVersion, pypyVersion, architecture) {
     });
     const foundRelease = sortedReleases[0];
     const foundAsset = utils_1.IS_WINDOWS
-        ? findAssetForWindows(foundRelease)
+        ? findAssetForWindows(foundRelease, architecture)
         : findAssetForMacOrLinux(foundRelease, architecture, process.platform);
     return {
         foundAsset,
@@ -66613,24 +66613,31 @@ function pypyVersionToSemantic(versionSpec) {
     return versionSpec.replace(prereleaseVersion, '$1-$2.$3');
 }
 exports.pypyVersionToSemantic = pypyVersionToSemantic;
-function isArchPresentForWindows(item) {
-    return item.files.some((file) => utils_1.WINDOWS_ARCHS.includes(file.arch) &&
-        utils_1.WINDOWS_PLATFORMS.includes(file.platform));
+function isArchPresentForWindows(item, architecture) {
+    architecture = replaceX32toX86(architecture);
+    return item.files.some((file) => utils_1.WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture);
 }
 exports.isArchPresentForWindows = isArchPresentForWindows;
 function isArchPresentForMacOrLinux(item, architecture, platform) {
     return item.files.some((file) => file.arch === architecture && file.platform === platform);
 }
 exports.isArchPresentForMacOrLinux = isArchPresentForMacOrLinux;
-function findAssetForWindows(releases) {
-    return releases.files.find((item) => utils_1.WINDOWS_ARCHS.includes(item.arch) &&
-        utils_1.WINDOWS_PLATFORMS.includes(item.platform));
+function findAssetForWindows(releases, architecture) {
+    architecture = replaceX32toX86(architecture);
+    return releases.files.find((item) => utils_1.WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture);
 }
 exports.findAssetForWindows = findAssetForWindows;
 function findAssetForMacOrLinux(releases, architecture, platform) {
     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') {
+        architecture = 'x86';
+    }
+    return architecture;
+}
 
 
 /***/ }),
diff --git a/src/install-pypy.ts b/src/install-pypy.ts
index 4c49e115..d8594ba6 100644
--- a/src/install-pypy.ts
+++ b/src/install-pypy.ts
@@ -8,7 +8,6 @@ import fs from 'fs';
 
 import {
   IS_WINDOWS,
-  WINDOWS_ARCHS,
   WINDOWS_PLATFORMS,
   IPyPyManifestRelease,
   createSymlinkInFolder,
@@ -157,7 +156,7 @@ export function findRelease(
     const isArchPresent =
       item.files &&
       (IS_WINDOWS
-        ? isArchPresentForWindows(item)
+        ? isArchPresentForWindows(item, architecture)
         : isArchPresentForMacOrLinux(item, architecture, process.platform));
     return isPythonVersionSatisfied && isPyPyVersionSatisfied && isArchPresent;
   });
@@ -181,7 +180,7 @@ export function findRelease(
 
   const foundRelease = sortedReleases[0];
   const foundAsset = IS_WINDOWS
-    ? findAssetForWindows(foundRelease)
+    ? findAssetForWindows(foundRelease, architecture)
     : findAssetForMacOrLinux(foundRelease, architecture, process.platform);
 
   return {
@@ -205,11 +204,11 @@ export function pypyVersionToSemantic(versionSpec: string) {
   return versionSpec.replace(prereleaseVersion, '$1-$2.$3');
 }
 
-export function isArchPresentForWindows(item: any) {
+export function isArchPresentForWindows(item: any, architecture: string) {
+  architecture = replaceX32toX86(architecture);
   return item.files.some(
     (file: any) =>
-      WINDOWS_ARCHS.includes(file.arch) &&
-      WINDOWS_PLATFORMS.includes(file.platform)
+      WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture
   );
 }
 
@@ -223,11 +222,11 @@ export function isArchPresentForMacOrLinux(
   );
 }
 
-export function findAssetForWindows(releases: any) {
+export function findAssetForWindows(releases: any, architecture: string) {
+  architecture = replaceX32toX86(architecture);
   return releases.files.find(
     (item: any) =>
-      WINDOWS_ARCHS.includes(item.arch) &&
-      WINDOWS_PLATFORMS.includes(item.platform)
+      WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture
   );
 }
 
@@ -240,3 +239,11 @@ export function findAssetForMacOrLinux(
     (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') {
+    architecture = 'x86';
+  }
+  return architecture;
+}