From ec07be593a0ada7481d541782666767f2180ccfc Mon Sep 17 00:00:00 2001
From: Manuel Mendez <mmendez534@gmail.com>
Date: Tue, 14 Dec 2021 13:12:54 -0500
Subject: [PATCH 1/6] Add test for export of GOROOT to env var

Signed-off-by: Manuel Mendez <mmendez534@gmail.com>
---
 __tests__/setup-go.test.ts | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index ba54900..6be0c03 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -49,6 +49,7 @@ describe('setup-go', () => {
     inSpy.mockImplementation(name => inputs[name]);
     getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
     getBooleanInputSpy.mockImplementation(name => inputs[name]);
+    exSpy = jest.spyOn(core, 'exportVariable');
 
     // node
     os = {};
@@ -230,6 +231,22 @@ describe('setup-go', () => {
     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`);
   });
 
+  it('exports GOROOT', async () => {
+    inputs['go-version'] = '1.13.0';
+    inSpy.mockImplementation(name => inputs[name]);
+
+    let toolPath = path.normalize('/cache/go/1.13.0/x64');
+    findSpy.mockImplementation(() => toolPath);
+
+    let vars = {} as any;
+    exSpy.mockImplementation(async (name, val) => {
+      vars[name] = val;
+    });
+
+    await main.run();
+    expect(vars).toBe({GOROOT: 'foo'});
+  });
+
   it('finds a version of go already in the cache', async () => {
     inputs['go-version'] = '1.13.0';
 

From 83124a14b6a7860a85fe88a6cd82b86f05fb2cf9 Mon Sep 17 00:00:00 2001
From: Manuel Mendez <mmendez534@gmail.com>
Date: Tue, 14 Dec 2021 13:24:18 -0500
Subject: [PATCH 2/6] Do not export GOROOT

This has not been necessary since [Go 1.9](https://go.dev/doc/go1.9#goroot) at
least (although clunky to do so then) but definitely not since
[Go 1.10](https://go.dev/doc/go1.10#goroot).

This is cargo culting code that is more than 2 years out of date and runs into
issues when multiple go versions are used in an action run.

Signed-off-by: Manuel Mendez <mmendez534@gmail.com>
---
 __tests__/setup-go.test.ts | 4 ++--
 dist/index.js              | 1 -
 src/main.ts                | 1 -
 3 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index 6be0c03..7bb3828 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -231,7 +231,7 @@ describe('setup-go', () => {
     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`);
   });
 
-  it('exports GOROOT', async () => {
+  it('does not export any varibles', async () => {
     inputs['go-version'] = '1.13.0';
     inSpy.mockImplementation(name => inputs[name]);
 
@@ -244,7 +244,7 @@ describe('setup-go', () => {
     });
 
     await main.run();
-    expect(vars).toBe({GOROOT: 'foo'});
+    expect(vars).toStrictEqual({});
   });
 
   it('finds a version of go already in the cache', async () => {
diff --git a/dist/index.js b/dist/index.js
index ac3d0e5..87ff0a4 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2080,7 +2080,6 @@ function run() {
                 let auth = !token || isGhes() ? undefined : `token ${token}`;
                 const checkLatest = core.getBooleanInput('check-latest');
                 const installDir = yield installer.getGo(versionSpec, checkLatest, auth);
-                core.exportVariable('GOROOT', installDir);
                 core.addPath(path_1.default.join(installDir, 'bin'));
                 core.info('Added go to the path');
                 let added = yield addBinToPath();
diff --git a/src/main.ts b/src/main.ts
index f785b85..7a9c1f5 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -23,7 +23,6 @@ export async function run() {
       const checkLatest = core.getBooleanInput('check-latest');
       const installDir = await installer.getGo(versionSpec, checkLatest, auth);
 
-      core.exportVariable('GOROOT', installDir);
       core.addPath(path.join(installDir, 'bin'));
       core.info('Added go to the path');
 

From 2a34c33bd7648b12fa2caabb0bfc8919e37aacc6 Mon Sep 17 00:00:00 2001
From: Josh Gross <joshmgross@github.com>
Date: Mon, 14 Mar 2022 12:21:30 -0400
Subject: [PATCH 3/6] Export `GOROOT` for versions < 1.9

---
 __tests__/setup-go.test.ts | 61 +++++++++++++++++++++++++-------------
 dist/index.js              |  7 +++++
 src/main.ts                |  8 +++++
 3 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index 7bb3828..4c7efdc 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -20,6 +20,7 @@ describe('setup-go', () => {
 
   let inSpy: jest.SpyInstance;
   let getBooleanInputSpy: jest.SpyInstance;
+  let exportVarSpy: jest.SpyInstance;
   let findSpy: jest.SpyInstance;
   let cnSpy: jest.SpyInstance;
   let logSpy: jest.SpyInstance;
@@ -27,7 +28,7 @@ describe('setup-go', () => {
   let platSpy: jest.SpyInstance;
   let archSpy: jest.SpyInstance;
   let dlSpy: jest.SpyInstance;
-  let exSpy: jest.SpyInstance;
+  let extractTarSpy: jest.SpyInstance;
   let cacheSpy: jest.SpyInstance;
   let dbgSpy: jest.SpyInstance;
   let whichSpy: jest.SpyInstance;
@@ -49,7 +50,8 @@ describe('setup-go', () => {
     inSpy.mockImplementation(name => inputs[name]);
     getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
     getBooleanInputSpy.mockImplementation(name => inputs[name]);
-    exSpy = jest.spyOn(core, 'exportVariable');
+    exportVarSpy = jest.spyOn(core, 'exportVariable');
+    extractTarSpy = jest.spyOn(core, 'exportVariable');
 
     // node
     os = {};
@@ -62,7 +64,7 @@ describe('setup-go', () => {
     // @actions/tool-cache
     findSpy = jest.spyOn(tc, 'find');
     dlSpy = jest.spyOn(tc, 'downloadTool');
-    exSpy = jest.spyOn(tc, 'extractTar');
+    extractTarSpy = jest.spyOn(tc, 'extractTar');
     cacheSpy = jest.spyOn(tc, 'cacheDir');
     getSpy = jest.spyOn(im, 'getVersionsDist');
     getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo');
@@ -231,15 +233,15 @@ describe('setup-go', () => {
     expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`);
   });
 
-  it('does not export any varibles', async () => {
+  it('does not export any variables for Go versions >=1.9', async () => {
     inputs['go-version'] = '1.13.0';
     inSpy.mockImplementation(name => inputs[name]);
 
     let toolPath = path.normalize('/cache/go/1.13.0/x64');
     findSpy.mockImplementation(() => toolPath);
 
-    let vars = {} as any;
-    exSpy.mockImplementation(async (name, val) => {
+    let vars: { [key: string]: string; } = {};
+    exportVarSpy.mockImplementation((name: string, val: string) => {
       vars[name] = val;
     });
 
@@ -247,6 +249,25 @@ describe('setup-go', () => {
     expect(vars).toStrictEqual({});
   });
 
+  it('exports GOROOT for Go versions <1.9', async () => {
+    inputs['go-version'] = '1.8';
+    inSpy.mockImplementation(name => inputs[name]);
+
+    let toolPath = path.normalize('/cache/go/1.8.0/x64');
+    findSpy.mockImplementation(() => toolPath);
+
+    let vars: { [key: string]: string; } = {};
+    exportVarSpy.mockImplementation((name: string, val: string) => {
+      vars[name] = val;
+    });
+
+    await main.run();
+    expect(vars).toStrictEqual({
+      "GOROOT": toolPath
+    });
+  });
+
+
   it('finds a version of go already in the cache', async () => {
     inputs['go-version'] = '1.13.0';
 
@@ -288,14 +309,14 @@ describe('setup-go', () => {
     findSpy.mockImplementation(() => '');
     dlSpy.mockImplementation(() => '/some/temp/path');
     let toolPath = path.normalize('/cache/go/1.13.0/x64');
-    exSpy.mockImplementation(() => '/some/other/temp/path');
+    extractTarSpy.mockImplementation(() => '/some/other/temp/path');
     cacheSpy.mockImplementation(() => toolPath);
     await main.run();
 
     let expPath = path.join(toolPath, 'bin');
 
     expect(dlSpy).toHaveBeenCalled();
-    expect(exSpy).toHaveBeenCalled();
+    expect(extractTarSpy).toHaveBeenCalled();
     expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
   });
 
@@ -330,7 +351,7 @@ describe('setup-go', () => {
 
     dlSpy.mockImplementation(async () => '/some/temp/path');
     let toolPath = path.normalize('/cache/go/1.12.16/x64');
-    exSpy.mockImplementation(async () => '/some/other/temp/path');
+    extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
     cacheSpy.mockImplementation(async () => toolPath);
 
     await main.run();
@@ -338,7 +359,7 @@ describe('setup-go', () => {
     let expPath = path.join(toolPath, 'bin');
 
     expect(dlSpy).toHaveBeenCalled();
-    expect(exSpy).toHaveBeenCalled();
+    expect(extractTarSpy).toHaveBeenCalled();
     expect(logSpy).not.toHaveBeenCalledWith(
       'Not found in manifest.  Falling back to download directly from Go'
     );
@@ -367,7 +388,7 @@ describe('setup-go', () => {
 
     dlSpy.mockImplementation(async () => '/some/temp/path');
     let toolPath = path.normalize('/cache/go/1.12.17/x64');
-    exSpy.mockImplementation(async () => '/some/other/temp/path');
+    extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
     cacheSpy.mockImplementation(async () => toolPath);
 
     await main.run();
@@ -375,7 +396,7 @@ describe('setup-go', () => {
     let expPath = path.join(toolPath, 'bin');
 
     expect(dlSpy).toHaveBeenCalled();
-    expect(exSpy).toHaveBeenCalled();
+    expect(extractTarSpy).toHaveBeenCalled();
     expect(logSpy).not.toHaveBeenCalledWith(
       'Not found in manifest.  Falling back to download directly from Go'
     );
@@ -404,7 +425,7 @@ describe('setup-go', () => {
 
     dlSpy.mockImplementation(async () => '/some/temp/path');
     let toolPath = path.normalize('/cache/go/1.12.14/x64');
-    exSpy.mockImplementation(async () => '/some/other/temp/path');
+    extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
     cacheSpy.mockImplementation(async () => toolPath);
 
     await main.run();
@@ -415,7 +436,7 @@ describe('setup-go', () => {
     expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.12.14...');
     expect(dlSpy).toHaveBeenCalled();
     expect(logSpy).toHaveBeenCalledWith('matching 1.12.14...');
-    expect(exSpy).toHaveBeenCalled();
+    expect(extractTarSpy).toHaveBeenCalled();
     expect(logSpy).toHaveBeenCalledWith(
       'Not found in manifest.  Falling back to download directly from Go'
     );
@@ -617,7 +638,7 @@ describe('setup-go', () => {
       const toolPath = path.normalize('/cache/go/1.16.1/x64');
       findSpy.mockReturnValue(toolPath);
       dlSpy.mockImplementation(async () => '/some/temp/path');
-      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
 
       await main.run();
@@ -639,7 +660,7 @@ describe('setup-go', () => {
       findSpy.mockImplementation(() => '');
       dlSpy.mockImplementation(async () => '/some/temp/path');
       const toolPath = path.normalize('/cache/go/1.17.5/x64');
-      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
       const expectedUrl =
         'https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-darwin-x64.tar.gz';
@@ -680,7 +701,7 @@ describe('setup-go', () => {
 
       dlSpy.mockImplementation(async () => '/some/temp/path');
       let toolPath = path.normalize('/cache/go/1.13.7/x64');
-      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
 
       await main.run();
@@ -688,7 +709,7 @@ describe('setup-go', () => {
       let expPath = path.join(toolPath, 'bin');
 
       expect(dlSpy).toHaveBeenCalled();
-      expect(exSpy).toHaveBeenCalled();
+      expect(extractTarSpy).toHaveBeenCalled();
       expect(logSpy).toHaveBeenCalledWith(
         'Attempting to resolve the latest version from the manifest...'
       );
@@ -722,7 +743,7 @@ describe('setup-go', () => {
 
       dlSpy.mockImplementation(async () => '/some/temp/path');
       let toolPath = path.normalize('/cache/go/1.13.7/x64');
-      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      extractTarSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
 
       await main.run();
@@ -733,7 +754,7 @@ describe('setup-go', () => {
         `Failed to resolve version ${versionSpec} from manifest`
       );
       expect(dlSpy).toHaveBeenCalled();
-      expect(exSpy).toHaveBeenCalled();
+      expect(extractTarSpy).toHaveBeenCalled();
       expect(logSpy).toHaveBeenCalledWith(
         'Attempting to resolve the latest version from the manifest...'
       );
diff --git a/dist/index.js b/dist/index.js
index 87ff0a4..99a304b 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2062,6 +2062,7 @@ exports.addBinToPath = exports.run = void 0;
 const core = __importStar(__webpack_require__(470));
 const io = __importStar(__webpack_require__(1));
 const installer = __importStar(__webpack_require__(749));
+const semver = __importStar(__webpack_require__(280));
 const path_1 = __importDefault(__webpack_require__(622));
 const child_process_1 = __importDefault(__webpack_require__(129));
 const fs_1 = __importDefault(__webpack_require__(747));
@@ -2082,6 +2083,12 @@ function run() {
                 const installDir = yield installer.getGo(versionSpec, checkLatest, auth);
                 core.addPath(path_1.default.join(installDir, 'bin'));
                 core.info('Added go to the path');
+                const version = installer.makeSemver(versionSpec);
+                // Go versions less than 1.9 require GOROOT to be set
+                if (semver.lt(version, '1.9.0')) {
+                    core.info("Setting GOROOT for Go version < 1.9");
+                    core.exportVariable('GOROOT', installDir);
+                }
                 let added = yield addBinToPath();
                 core.debug(`add bin ${added}`);
                 core.info(`Successfully setup go version ${versionSpec}`);
diff --git a/src/main.ts b/src/main.ts
index 7a9c1f5..afb59fc 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,6 +1,7 @@
 import * as core from '@actions/core';
 import * as io from '@actions/io';
 import * as installer from './installer';
+import * as semver from 'semver';
 import path from 'path';
 import cp from 'child_process';
 import fs from 'fs';
@@ -26,6 +27,13 @@ export async function run() {
       core.addPath(path.join(installDir, 'bin'));
       core.info('Added go to the path');
 
+      const version = installer.makeSemver(versionSpec);
+      // Go versions less than 1.9 require GOROOT to be set
+      if (semver.lt(version, '1.9.0')) {
+        core.info("Setting GOROOT for Go version < 1.9");
+        core.exportVariable('GOROOT', installDir);
+      }
+
       let added = await addBinToPath();
       core.debug(`add bin ${added}`);
       core.info(`Successfully setup go version ${versionSpec}`);

From 802876f7c7e9ca0bae4bf73e507f4400ad8e567f Mon Sep 17 00:00:00 2001
From: Josh Gross <joshmgross@github.com>
Date: Mon, 14 Mar 2022 12:23:03 -0400
Subject: [PATCH 4/6] Fix formatting

---
 __tests__/setup-go.test.ts | 7 +++----
 src/main.ts                | 2 +-
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index 4c7efdc..3383e99 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -240,7 +240,7 @@ describe('setup-go', () => {
     let toolPath = path.normalize('/cache/go/1.13.0/x64');
     findSpy.mockImplementation(() => toolPath);
 
-    let vars: { [key: string]: string; } = {};
+    let vars: {[key: string]: string} = {};
     exportVarSpy.mockImplementation((name: string, val: string) => {
       vars[name] = val;
     });
@@ -256,18 +256,17 @@ describe('setup-go', () => {
     let toolPath = path.normalize('/cache/go/1.8.0/x64');
     findSpy.mockImplementation(() => toolPath);
 
-    let vars: { [key: string]: string; } = {};
+    let vars: {[key: string]: string} = {};
     exportVarSpy.mockImplementation((name: string, val: string) => {
       vars[name] = val;
     });
 
     await main.run();
     expect(vars).toStrictEqual({
-      "GOROOT": toolPath
+      GOROOT: toolPath
     });
   });
 
-
   it('finds a version of go already in the cache', async () => {
     inputs['go-version'] = '1.13.0';
 
diff --git a/src/main.ts b/src/main.ts
index afb59fc..4295858 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -30,7 +30,7 @@ export async function run() {
       const version = installer.makeSemver(versionSpec);
       // Go versions less than 1.9 require GOROOT to be set
       if (semver.lt(version, '1.9.0')) {
-        core.info("Setting GOROOT for Go version < 1.9");
+        core.info('Setting GOROOT for Go version < 1.9');
         core.exportVariable('GOROOT', installDir);
       }
 

From 229eefa42bc953e2e5c73d5532f977c10cc2b271 Mon Sep 17 00:00:00 2001
From: Josh Gross <joshmgross@github.com>
Date: Mon, 14 Mar 2022 12:24:32 -0400
Subject: [PATCH 5/6] Update `dist`

---
 dist/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dist/index.js b/dist/index.js
index 99a304b..7a7a59c 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2086,7 +2086,7 @@ function run() {
                 const version = installer.makeSemver(versionSpec);
                 // Go versions less than 1.9 require GOROOT to be set
                 if (semver.lt(version, '1.9.0')) {
-                    core.info("Setting GOROOT for Go version < 1.9");
+                    core.info('Setting GOROOT for Go version < 1.9');
                     core.exportVariable('GOROOT', installDir);
                 }
                 let added = yield addBinToPath();

From 0c03929337ba6c12b883b8b7361696700b6d82c8 Mon Sep 17 00:00:00 2001
From: Josh Gross <joshmgross@github.com>
Date: Mon, 14 Mar 2022 12:32:36 -0400
Subject: [PATCH 6/6] Remove duplicated `spyOn`

---
 __tests__/setup-go.test.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts
index 3383e99..bb85dee 100644
--- a/__tests__/setup-go.test.ts
+++ b/__tests__/setup-go.test.ts
@@ -51,7 +51,6 @@ describe('setup-go', () => {
     getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
     getBooleanInputSpy.mockImplementation(name => inputs[name]);
     exportVarSpy = jest.spyOn(core, 'exportVariable');
-    extractTarSpy = jest.spyOn(core, 'exportVariable');
 
     // node
     os = {};