From f89ad3b87c7d47b9a1141339d2f291d3467b0020 Mon Sep 17 00:00:00 2001
From: Kishen Viswanathan <kishen.viswanathan@ibm.com>
Date: Fri, 22 Nov 2024 18:18:36 +0530
Subject: [PATCH] Enable setting up of go on ppc64/ppc64le systems

---
 __tests__/setup-go.test.ts | 16 ++++++++++++++++
 dist/setup/index.js        | 16 ++++++++++++----
 src/system.ts              | 15 +++++++++++----
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index f94f9ee..6efe44e 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -8,6 +8,7 @@ import path from 'path';
 import * as main from '../src/main';
 import * as im from '../src/installer';
 import * as httpm from '@actions/http-client';
+import {getArch} from '../src/system';
 
 import goJsonData from './data/golang-dl.json';
 import matchers from '../matchers.json';
@@ -32,6 +33,7 @@ describe('setup-go', () => {
   let getSpy: jest.SpyInstance;
   let platSpy: jest.SpyInstance;
   let archSpy: jest.SpyInstance;
+  let endianSpy: jest.SpyInstance;
   let joinSpy: jest.SpyInstance;
   let dlSpy: jest.SpyInstance;
   let extractTarSpy: jest.SpyInstance;
@@ -71,6 +73,8 @@ describe('setup-go', () => {
     archSpy = jest.spyOn(osm, 'arch');
     archSpy.mockImplementation(() => os['arch']);
     execSpy = jest.spyOn(cp, 'execSync');
+    endianSpy = jest.spyOn(osm, 'endianness');
+    endianSpy.mockImplementation(() => os['endianness']);
 
     // switch path join behaviour based on set os.platform
     joinSpy = jest.spyOn(path, 'join');
@@ -988,5 +992,17 @@ use .
         );
       }
     );
+
+    it('should return ppc64 when architecture is ppc64 and system is Big Endian', () => {
+      endianSpy.mockReturnValue('BE');
+      const result = getArch('ppc64');
+      expect(result).toBe('ppc64');
+    });
+
+    it('should return ppc64le when architecture is ppc64 and system is Little Endian', () => {
+      endianSpy.mockReturnValue('LE');
+      const result = getArch('ppc64');
+      expect(result).toBe('ppc64le');
+    });
   });
 });
diff --git a/dist/setup/index.js b/dist/setup/index.js
index d769775..25e8260 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -88843,15 +88843,23 @@ function getPlatform() {
 exports.getPlatform = getPlatform;
 function getArch(arch) {
     // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'.
-    // wants amd64, 386, arm64, armv61, ppc641e, s390x
+    // wants amd64, 386, arm64, armv6l, ppc64le, s390x
     // currently not supported by runner but future proofed mapping
     switch (arch) {
         case 'x64':
             arch = 'amd64';
             break;
-        // case 'ppc':
-        //   arch = 'ppc64';
-        //   break;
+        // In case of ppc64, further distinction is needed to determine the endianness
+        // of the host as it can either be ppc64(Big Endian) or ppc64le (Little Endian) to download
+        // the correct bundle.
+        case 'ppc64':
+            if (os_1.default.endianness() === 'LE') {
+                arch = 'ppc64le';
+            }
+            else {
+                arch = 'ppc64';
+            }
+            break;
         case 'x32':
             arch = '386';
             break;
diff --git a/src/system.ts b/src/system.ts
index e54146d..4984e97 100644
--- a/src/system.ts
+++ b/src/system.ts
@@ -18,15 +18,22 @@ export function getPlatform(): string {
 export function getArch(arch: string): string {
   // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'.
 
-  // wants amd64, 386, arm64, armv61, ppc641e, s390x
+  // wants amd64, 386, arm64, armv6l, ppc64le, s390x
   // currently not supported by runner but future proofed mapping
   switch (arch) {
     case 'x64':
       arch = 'amd64';
       break;
-    // case 'ppc':
-    //   arch = 'ppc64';
-    //   break;
+    // In case of ppc64, further distinction is needed to determine the endianness
+    // of the host as it can either be ppc64(Big Endian) or ppc64le (Little Endian) to download
+    // the correct bundle.
+    case 'ppc64':
+      if (os.endianness() === 'LE') {
+        arch = 'ppc64le';
+      } else {
+        arch = 'ppc64';
+      }
+      break;
     case 'x32':
       arch = '386';
       break;