From 43d44139c7be8714db847072c7dc036926276f93 Mon Sep 17 00:00:00 2001
From: David Kale <dakale@microsoft.com>
Date: Wed, 20 Nov 2019 12:21:56 -0500
Subject: [PATCH] Get correct url for arm dist

---
 lib/installer.js | 30 ++++++++++++++++++++----------
 src/installer.ts | 32 +++++++++++++++++++++-----------
 2 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/lib/installer.js b/lib/installer.js
index c86924c..d540604 100644
--- a/lib/installer.js
+++ b/lib/installer.js
@@ -25,7 +25,7 @@ const os = __importStar(require("os"));
 const path = __importStar(require("path"));
 const semver = __importStar(require("semver"));
 let osPlat = os.platform();
-let osArch = os.arch();
+let osArch = translateArchToDistUrl(os.arch());
 if (!tempDirectory) {
     let baseLocation;
     if (process.platform === 'win32') {
@@ -90,13 +90,13 @@ function queryLatestMatch(versionSpec) {
         let dataFileName;
         switch (osPlat) {
             case 'linux':
-                dataFileName = 'linux-' + osArch;
+                dataFileName = `linux-${osArch}`;
                 break;
             case 'darwin':
-                dataFileName = 'osx-' + osArch + '-tar';
+                dataFileName = `osx-${osArch}-tar`;
                 break;
             case 'win32':
-                dataFileName = 'win-' + osArch + '-exe';
+                dataFileName = `win-${osArch}-exe`;
                 break;
             default:
                 throw new Error(`Unexpected OS '${osPlat}'`);
@@ -149,10 +149,10 @@ function acquireNode(version) {
         //
         version = semver.clean(version) || '';
         let fileName = osPlat == 'win32'
-            ? 'node-v' + version + '-win-' + os.arch()
-            : 'node-v' + version + '-' + osPlat + '-' + os.arch();
-        let urlFileName = osPlat == 'win32' ? fileName + '.7z' : fileName + '.tar.gz';
-        let downloadUrl = 'https://nodejs.org/dist/v' + version + '/' + urlFileName;
+            ? `node-v${version}-win-${osArch}`
+            : `node-v${version}-${osPlat}-${osArch}`;
+        let urlFileName = osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`;
+        let downloadUrl = `https://nodejs.org/dist/v${version}/${urlFileName}`;
         let downloadPath;
         try {
             downloadPath = yield tc.downloadTool(downloadUrl);
@@ -202,8 +202,8 @@ function acquireNodeFromFallbackLocation(version) {
         let exeUrl;
         let libUrl;
         try {
-            exeUrl = `https://nodejs.org/dist/v${version}/win-${os.arch()}/node.exe`;
-            libUrl = `https://nodejs.org/dist/v${version}/win-${os.arch()}/node.lib`;
+            exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`;
+            libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`;
             const exePath = yield tc.downloadTool(exeUrl);
             yield io.cp(exePath, path.join(tempDir, 'node.exe'));
             const libPath = yield tc.downloadTool(libUrl);
@@ -225,3 +225,13 @@ function acquireNodeFromFallbackLocation(version) {
         return yield tc.cacheDir(tempDir, 'node', version);
     });
 }
+// os.arch does not always match the relative download url, e.g.
+// os.arch == 'arm' != node-v12.13.1-linux-armv7l.tar.gz
+function translateArchToDistUrl(arch) {
+    switch (arch) {
+        case 'arm':
+            return 'armv7l';
+        default:
+            return arch;
+    }
+}
diff --git a/src/installer.ts b/src/installer.ts
index 0abb1fe..c15decb 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -9,7 +9,7 @@ import * as path from 'path';
 import * as semver from 'semver';
 
 let osPlat: string = os.platform();
-let osArch: string = os.arch();
+let osArch: string = translateArchToDistUrl(os.arch());
 
 if (!tempDirectory) {
   let baseLocation;
@@ -86,13 +86,13 @@ async function queryLatestMatch(versionSpec: string): Promise<string> {
   let dataFileName: string;
   switch (osPlat) {
     case 'linux':
-      dataFileName = 'linux-' + osArch;
+      dataFileName = `linux-${osArch}`;
       break;
     case 'darwin':
-      dataFileName = 'osx-' + osArch + '-tar';
+      dataFileName = `osx-${osArch}-tar`;
       break;
     case 'win32':
-      dataFileName = 'win-' + osArch + '-exe';
+      dataFileName = `win-${osArch}-exe`;
       break;
     default:
       throw new Error(`Unexpected OS '${osPlat}'`);
@@ -150,12 +150,11 @@ async function acquireNode(version: string): Promise<string> {
   version = semver.clean(version) || '';
   let fileName: string =
     osPlat == 'win32'
-      ? 'node-v' + version + '-win-' + os.arch()
-      : 'node-v' + version + '-' + osPlat + '-' + os.arch();
+      ? `node-v${version}-win-${osArch}`
+      : `node-v${version}-${osPlat}-${osArch}`;
   let urlFileName: string =
-    osPlat == 'win32' ? fileName + '.7z' : fileName + '.tar.gz';
-
-  let downloadUrl = 'https://nodejs.org/dist/v' + version + '/' + urlFileName;
+    osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`;
+  let downloadUrl = `https://nodejs.org/dist/v${version}/${urlFileName}`;
 
   let downloadPath: string;
 
@@ -210,8 +209,8 @@ async function acquireNodeFromFallbackLocation(
   let exeUrl: string;
   let libUrl: string;
   try {
-    exeUrl = `https://nodejs.org/dist/v${version}/win-${os.arch()}/node.exe`;
-    libUrl = `https://nodejs.org/dist/v${version}/win-${os.arch()}/node.lib`;
+    exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`;
+    libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`;
 
     const exePath = await tc.downloadTool(exeUrl);
     await io.cp(exePath, path.join(tempDir, 'node.exe'));
@@ -232,3 +231,14 @@ async function acquireNodeFromFallbackLocation(
   }
   return await tc.cacheDir(tempDir, 'node', version);
 }
+
+// os.arch does not always match the relative download url, e.g.
+// os.arch == 'arm' != node-v12.13.1-linux-armv7l.tar.gz
+function translateArchToDistUrl(arch: string): string {
+  switch (arch) {
+    case 'arm':
+      return 'armv7l';
+    default:
+      return arch;
+  }
+}