From e0dce94eb023c218c57e408e32608a89d01f7525 Mon Sep 17 00:00:00 2001 From: Javier Romero Date: Thu, 28 Jul 2022 17:22:06 -0500 Subject: [PATCH] Use explicit filename when downloading Windows go package Using the explicit filename for Windows is necessary to satisfy `Expand-Archive`'s requirement on '.zip' extension. Signed-off-by: Javier Romero --- __tests__/setup-go.test.ts | 40 ++++++++++++++++++++++++++++++++++++++ dist/setup/index.js | 6 +++++- src/installer.ts | 8 +++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 537348bbd..9e390755d 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -13,6 +13,8 @@ let matchers = require('../matchers.json'); let goTestManifest = require('./data/versions-manifest.json'); let matcherPattern = matchers.problemMatcher[0].pattern[0]; let matcherRegExp = new RegExp(matcherPattern.regexp); +let win32Join = path.win32.join; +let posixJoin = path.posix.join; describe('setup-go', () => { let inputs = {} as any; @@ -27,8 +29,10 @@ describe('setup-go', () => { let getSpy: jest.SpyInstance; let platSpy: jest.SpyInstance; let archSpy: jest.SpyInstance; + let joinSpy: jest.SpyInstance; let dlSpy: jest.SpyInstance; let extractTarSpy: jest.SpyInstance; + let extractZipSpy: jest.SpyInstance; let cacheSpy: jest.SpyInstance; let dbgSpy: jest.SpyInstance; let whichSpy: jest.SpyInstance; @@ -61,10 +65,21 @@ describe('setup-go', () => { archSpy.mockImplementation(() => os['arch']); execSpy = jest.spyOn(cp, 'execSync'); + // switch path join behaviour based on set os.platform + joinSpy = jest.spyOn(path, 'join'); + joinSpy.mockImplementation((...paths: string[]): string => { + if (os['platform'] == 'win32') { + return win32Join(...paths); + } + + return posixJoin(...paths); + }); + // @actions/tool-cache findSpy = jest.spyOn(tc, 'find'); dlSpy = jest.spyOn(tc, 'downloadTool'); extractTarSpy = jest.spyOn(tc, 'extractTar'); + extractZipSpy = jest.spyOn(tc, 'extractZip'); cacheSpy = jest.spyOn(tc, 'cacheDir'); getSpy = jest.spyOn(im, 'getVersionsDist'); getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); @@ -325,6 +340,31 @@ describe('setup-go', () => { expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); }); + it('downloads a version not in the cache (windows)', async () => { + os.platform = 'win32'; + os.arch = 'x64'; + + inputs['go-version'] = '1.13.1'; + process.env['RUNNER_TEMP'] = 'C:\\temp\\'; + + findSpy.mockImplementation(() => ''); + dlSpy.mockImplementation(() => 'C:\\temp\\some\\path'); + extractZipSpy.mockImplementation(() => 'C:\\temp\\some\\other\\path'); + + let toolPath = path.normalize('C:\\cache\\go\\1.13.0\\x64'); + cacheSpy.mockImplementation(() => toolPath); + + await main.run(); + + let expPath = path.win32.join(toolPath, 'bin'); + expect(dlSpy).toHaveBeenCalledWith( + 'https://storage.googleapis.com/golang/go1.13.1.windows-amd64.zip', + 'C:\\temp\\go1.13.1.windows-amd64.zip', + undefined + ); + expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); + }); + it('does not find a version that does not exist', async () => { os.platform = 'linux'; os.arch = 'x64'; diff --git a/dist/setup/index.js b/dist/setup/index.js index 1426785ff..f598dfd96 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -62942,7 +62942,11 @@ function resolveVersionFromManifest(versionSpec, stable, auth) { function installGoVersion(info, auth) { return __awaiter(this, void 0, void 0, function* () { core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); - const downloadPath = yield tc.downloadTool(info.downloadUrl, undefined, auth); + // Windows requires that we keep the extension (.zip) for extraction + const isWindows = os_1.default.platform() === 'win32'; + const tempDir = process.env.RUNNER_TEMP || '.'; + const fileName = isWindows ? path.join(tempDir, info.fileName) : undefined; + const downloadPath = yield tc.downloadTool(info.downloadUrl, fileName, auth); core.info('Extracting Go...'); let extPath = yield extractGoArchive(downloadPath); core.info(`Successfully extracted go to ${extPath}`); diff --git a/src/installer.ts b/src/installer.ts index c1a1e3959..58c94285e 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -132,7 +132,13 @@ async function installGoVersion( auth: string | undefined ): Promise { core.info(`Acquiring ${info.resolvedVersion} from ${info.downloadUrl}`); - const downloadPath = await tc.downloadTool(info.downloadUrl, undefined, auth); + + // Windows requires that we keep the extension (.zip) for extraction + const isWindows = os.platform() === 'win32'; + const tempDir = process.env.RUNNER_TEMP || '.'; + const fileName = isWindows ? path.join(tempDir, info.fileName) : undefined; + + const downloadPath = await tc.downloadTool(info.downloadUrl, fileName, auth); core.info('Extracting Go...'); let extPath = await extractGoArchive(downloadPath);