From 3d0e3826edeac5757c93466b31e54fc1c909e2eb Mon Sep 17 00:00:00 2001
From: Bryan MacFarlane <bryanmacfarlane@github.com>
Date: Thu, 26 Mar 2020 12:02:52 -0400
Subject: [PATCH] prefer globally installed bin

---
 dist/index.js    | 39 ++++++++++++++++++++++-----------------
 src/installer.ts | 16 ----------------
 src/main.ts      | 24 ++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 33 deletions(-)

diff --git a/dist/index.js b/dist/index.js
index afbb4d6..1de8d7b 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1279,6 +1279,8 @@ const core = __importStar(__webpack_require__(470));
 const tc = __importStar(__webpack_require__(533));
 const installer = __importStar(__webpack_require__(749));
 const path = __importStar(__webpack_require__(622));
+const cp = __importStar(__webpack_require__(129));
+const fs = __importStar(__webpack_require__(747));
 function run() {
     return __awaiter(this, void 0, void 0, function* () {
         try {
@@ -1291,6 +1293,8 @@ function run() {
             // since getting unstable versions should be explicit
             let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE';
             console.log(`Setup go ${stable ? 'stable' : ''} version spec ${versionSpec}`);
+            // if there's a globally install go and bin path, prefer that
+            let addedBin = addBinToPath();
             if (versionSpec) {
                 let installDir = tc.find('go', versionSpec);
                 if (!installDir) {
@@ -1302,6 +1306,11 @@ function run() {
                     core.exportVariable('GOROOT', installDir);
                     core.addPath(path.join(installDir, 'bin'));
                     console.log('Added go to the path');
+                    // if the global installed bin wasn't added,
+                    // we can add the bin just installed
+                    if (!addBinToPath) {
+                        addBinToPath();
+                    }
                 }
                 else {
                     throw new Error(`Could not find a version that satisfied version spec: ${versionSpec}`);
@@ -1317,6 +1326,19 @@ function run() {
     });
 }
 exports.run = run;
+function addBinToPath() {
+    let added = false;
+    let buf = cp.execSync('go env GOPATH');
+    if (buf) {
+        let d = buf.toString().trim();
+        let bp = path.join(d, 'bin');
+        if (fs.existsSync(bp)) {
+            core.addPath(bp);
+            added = true;
+        }
+    }
+    return added;
+}
 
 
 /***/ }),
@@ -4576,14 +4598,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const tc = __importStar(__webpack_require__(533));
-const cm = __importStar(__webpack_require__(470));
 const path = __importStar(__webpack_require__(622));
 const semver = __importStar(__webpack_require__(280));
 const httpm = __importStar(__webpack_require__(539));
 const sys = __importStar(__webpack_require__(737));
 const core_1 = __webpack_require__(470);
-const cp = __importStar(__webpack_require__(129));
-const fs = __importStar(__webpack_require__(747));
 function downloadGo(versionSpec, stable) {
     return __awaiter(this, void 0, void 0, function* () {
         let toolPath;
@@ -4605,7 +4624,6 @@ function downloadGo(versionSpec, stable) {
                 // extracts with a root folder that matches the fileName downloaded
                 const toolRoot = path.join(extPath, 'go');
                 toolPath = yield tc.cacheDir(toolRoot, 'go', makeSemver(match.version));
-                addBinToPath();
             }
         }
         catch (error) {
@@ -4615,19 +4633,6 @@ function downloadGo(versionSpec, stable) {
     });
 }
 exports.downloadGo = downloadGo;
-function addBinToPath() {
-    return __awaiter(this, void 0, void 0, function* () {
-        let buf = cp.execSync('go env GOPATH');
-        if (buf) {
-            let d = buf.toString().trim();
-            let bp = path.join(d, 'bin');
-            if (fs.existsSync(bp)) {
-                cm.addPath(bp);
-            }
-        }
-    });
-}
-exports.addBinToPath = addBinToPath;
 function findMatch(versionSpec, stable) {
     return __awaiter(this, void 0, void 0, function* () {
         let archFilter = sys.getArch();
diff --git a/src/installer.ts b/src/installer.ts
index 69c1e1f..eb54706 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -1,12 +1,9 @@
 import * as tc from '@actions/tool-cache';
-import * as cm from '@actions/core';
 import * as path from 'path';
 import * as semver from 'semver';
 import * as httpm from '@actions/http-client';
 import * as sys from './system';
 import {debug} from '@actions/core';
-import * as cp from 'child_process';
-import * as fs from 'fs';
 
 export async function downloadGo(
   versionSpec: string,
@@ -37,8 +34,6 @@ export async function downloadGo(
       // extracts with a root folder that matches the fileName downloaded
       const toolRoot = path.join(extPath, 'go');
       toolPath = await tc.cacheDir(toolRoot, 'go', makeSemver(match.version));
-
-      addBinToPath();
     }
   } catch (error) {
     throw new Error(`Failed to download version ${versionSpec}: ${error}`);
@@ -60,17 +55,6 @@ export interface IGoVersion {
   files: IGoVersionFile[];
 }
 
-export async function addBinToPath() {
-  let buf = cp.execSync('go env GOPATH');
-  if (buf) {
-    let d = buf.toString().trim();
-    let bp = path.join(d, 'bin');
-    if (fs.existsSync(bp)) {
-      cm.addPath(bp);
-    }
-  }
-}
-
 export async function findMatch(
   versionSpec: string,
   stable: boolean
diff --git a/src/main.ts b/src/main.ts
index 132be9b..e78788b 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -2,6 +2,8 @@ import * as core from '@actions/core';
 import * as tc from '@actions/tool-cache';
 import * as installer from './installer';
 import * as path from 'path';
+import * as cp from 'child_process';
+import * as fs from 'fs';
 
 export async function run() {
   try {
@@ -19,6 +21,8 @@ export async function run() {
       `Setup go ${stable ? 'stable' : ''} version spec ${versionSpec}`
     );
 
+    // if there's a globally install go and bin path, prefer that
+    let addedBin = addBinToPath();
     if (versionSpec) {
       let installDir: string | undefined = tc.find('go', versionSpec);
 
@@ -34,6 +38,12 @@ export async function run() {
         core.exportVariable('GOROOT', installDir);
         core.addPath(path.join(installDir, 'bin'));
         console.log('Added go to the path');
+
+        // if the global installed bin wasn't added,
+        // we can add the bin just installed
+        if (!addBinToPath) {
+          addBinToPath();
+        }
       } else {
         throw new Error(
           `Could not find a version that satisfied version spec: ${versionSpec}`
@@ -48,3 +58,17 @@ export async function run() {
     core.setFailed(error.message);
   }
 }
+
+function addBinToPath(): boolean {
+  let added = false;
+  let buf = cp.execSync('go env GOPATH');
+  if (buf) {
+    let d = buf.toString().trim();
+    let bp = path.join(d, 'bin');
+    if (fs.existsSync(bp)) {
+      core.addPath(bp);
+      added = true;
+    }
+  }
+  return added;
+}