Skip to content

Commit

Permalink
Use explicit filename when downloading Windows go package
Browse files Browse the repository at this point in the history
Using the explicit filename for Windows is necessary to
satisfy `Expand-Archive`'s requirement on '.zip' extension.

Signed-off-by: Javier Romero <root@jromero.codes>
  • Loading branch information
jromero authored and adilhusain-s committed Feb 6, 2023
1 parent 9425f3a commit 9deacbf
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
40 changes: 40 additions & 0 deletions __tests__/setup-go.test.ts
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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');
Expand Down Expand Up @@ -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';
Expand Down
6 changes: 5 additions & 1 deletion dist/setup/index.js
Expand Up @@ -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}`);
Expand Down
8 changes: 7 additions & 1 deletion src/installer.ts
Expand Up @@ -132,7 +132,13 @@ async function installGoVersion(
auth: string | undefined
): Promise<string> {
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);
Expand Down

0 comments on commit 9deacbf

Please sign in to comment.