diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 622fdfa..2f8bd53 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -7,7 +7,7 @@ import {run} from '../src/main'; import * as httpm from '@actions/http-client'; import * as im from '../src/installer'; import * as sys from '../src/system'; -import { ITypedResponse } from '@actions/http-client/interfaces'; +import {ITypedResponse} from '@actions/http-client/interfaces'; let goJsonData = require('./data/golang-dl.json'); @@ -28,12 +28,15 @@ describe('setup-go', () => { cnSpy = jest.spyOn(process.stdout, 'write'); platSpy = jest.spyOn(sys, 'getPlatform'); archSpy = jest.spyOn(sys, 'getArch'); - dlSpy = jest.spyOn(tc, "downloadTool"); - exSpy = jest.spyOn(tc, "extractTar"); + dlSpy = jest.spyOn(tc, 'downloadTool'); + exSpy = jest.spyOn(tc, 'extractTar'); getSpy = jest.spyOn(http, 'getJson'); - getSpy.mockImplementation(() => <ITypedResponse<im.IGoVersion[]>>{ - result: goJsonData - }); + getSpy.mockImplementation( + () => + <ITypedResponse<im.IGoVersion[]>>{ + result: goJsonData + } + ); cnSpy.mockImplementation(line => { // uncomment to debug //process.stderr.write('write2:' + line + '\n'); @@ -49,7 +52,7 @@ describe('setup-go', () => { afterAll(async () => {}, 100000); it('finds a version of go already in the cache', async () => { - inSpy.mockImplementation(() => '1.13.0') + inSpy.mockImplementation(() => '1.13.0'); let toolPath = path.normalize('/cache/go/1.13.0/x64'); tcSpy.mockImplementation(() => toolPath); await run(); @@ -79,14 +82,16 @@ describe('setup-go', () => { }); it('can mock go versions query', async () => { - let r: ITypedResponse<im.IGoVersion[]> = await http.getJson<im.IGoVersion[]>('https://asite.notexist.com/path'); + let r: ITypedResponse<im.IGoVersion[]> = await http.getJson< + im.IGoVersion[] + >('https://asite.notexist.com/path'); expect(r).toBeDefined(); let versions = r.result; expect(versions).toBeDefined(); - let l:number = versions? versions.length: 0; + let l: number = versions ? versions.length : 0; expect(l).toBe(76); }); - + it('finds stable match for exact version', async () => { platSpy.mockImplementation(() => 'linux'); archSpy.mockImplementation(() => 'amd64'); @@ -97,10 +102,10 @@ describe('setup-go', () => { expect(match).toBeDefined(); let version: string = match ? match.version : ''; expect(version).toBe('go1.13.1'); - let fileName = match ? match.files[0].filename: ''; + let fileName = match ? match.files[0].filename : ''; expect(fileName).toBe('go1.13.1.linux-amd64.tar.gz'); }); - + it('finds stable match for exact dot zero version', async () => { platSpy.mockImplementation(() => 'linux'); archSpy.mockImplementation(() => 'amd64'); @@ -110,10 +115,10 @@ describe('setup-go', () => { expect(match).toBeDefined(); let version: string = match ? match.version : ''; expect(version).toBe('go1.13'); - let fileName = match ? match.files[0].filename: ''; + let fileName = match ? match.files[0].filename : ''; expect(fileName).toBe('go1.13.linux-amd64.tar.gz'); }); - + it('finds latest patch version for minor version spec', async () => { platSpy.mockImplementation(() => 'linux'); archSpy.mockImplementation(() => 'amd64'); @@ -123,10 +128,10 @@ describe('setup-go', () => { expect(match).toBeDefined(); let version: string = match ? match.version : ''; expect(version).toBe('go1.13.7'); - let fileName = match ? match.files[0].filename: ''; + let fileName = match ? match.files[0].filename : ''; expect(fileName).toBe('go1.13.7.linux-amd64.tar.gz'); }); - + it('finds latest patch version for caret version spec', async () => { platSpy.mockImplementation(() => 'linux'); archSpy.mockImplementation(() => 'amd64'); @@ -136,10 +141,10 @@ describe('setup-go', () => { expect(match).toBeDefined(); let version: string = match ? match.version : ''; expect(version).toBe('go1.13.7'); - let fileName = match ? match.files[0].filename: ''; + let fileName = match ? match.files[0].filename : ''; expect(fileName).toBe('go1.13.7.linux-amd64.tar.gz'); }); - + it('finds latest version for major version spec', async () => { platSpy.mockImplementation(() => 'linux'); archSpy.mockImplementation(() => 'amd64'); @@ -149,7 +154,7 @@ describe('setup-go', () => { expect(match).toBeDefined(); let version: string = match ? match.version : ''; expect(version).toBe('go1.13.7'); - let fileName = match ? match.files[0].filename: ''; + let fileName = match ? match.files[0].filename : ''; expect(fileName).toBe('go1.13.7.linux-amd64.tar.gz'); - }); + }); }); diff --git a/dist/index.js b/dist/index.js index cd79128..abf8c8e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1287,7 +1287,7 @@ function run() { // If not supplied then problem matchers will still be setup. Useful for self-hosted. // let versionSpec = core.getInput('go-version'); - let stable = (core.getInput('stable') || '').toUpperCase() == "TRUE"; + let stable = (core.getInput('stable') || '').toUpperCase() == 'TRUE'; if (versionSpec) { let installDir = tc.find('go', versionSpec); if (!installDir) { @@ -4591,8 +4591,9 @@ function downloadGo(versionSpec, stable) { let downloadUrl = `https://storage.googleapis.com/golang/${match.files[0]}`; let downloadPath = yield tc.downloadTool(downloadUrl); // extract - let extPath = sys.getPlatform() == 'windows' ? - yield tc.extractZip(downloadPath) : yield tc.extractTar(downloadPath); + let extPath = sys.getPlatform() == 'windows' + ? yield tc.extractZip(downloadPath) + : yield tc.extractTar(downloadPath); // extracts with a root folder that matches the fileName downloaded const toolRoot = path.join(extPath, 'go'); toolPath = yield tc.cacheDir(toolRoot, 'go', versionSpec); @@ -4638,7 +4639,6 @@ function findMatch(versionSpec, stable) { } } } - ; if (match && goFile) { match.files = [goFile]; } diff --git a/lib/installer.js b/lib/installer.js index 1b4ee16..04efe48 100644 --- a/lib/installer.js +++ b/lib/installer.js @@ -30,8 +30,9 @@ function downloadGo(versionSpec, stable) { let downloadUrl = `https://storage.googleapis.com/golang/${match.files[0]}`; let downloadPath = yield tc.downloadTool(downloadUrl); // extract - let extPath = sys.getPlatform() == 'windows' ? - yield tc.extractZip(downloadPath) : yield tc.extractTar(downloadPath); + let extPath = sys.getPlatform() == 'windows' + ? yield tc.extractZip(downloadPath) + : yield tc.extractTar(downloadPath); // extracts with a root folder that matches the fileName downloaded const toolRoot = path.join(extPath, 'go'); toolPath = yield tc.cacheDir(toolRoot, 'go', versionSpec); @@ -77,7 +78,6 @@ function findMatch(versionSpec, stable) { } } } - ; if (match && goFile) { match.files = [goFile]; } diff --git a/src/installer.ts b/src/installer.ts index f925b46..a719df7 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -1,10 +1,13 @@ import * as tc from '@actions/tool-cache'; import * as path from 'path'; import * as semver from 'semver'; -import * as httpm from '@actions/http-client' -import * as sys from './system' +import * as httpm from '@actions/http-client'; +import * as sys from './system'; -export async function downloadGo(versionSpec: string, stable: boolean): Promise<string | undefined> { +export async function downloadGo( + versionSpec: string, + stable: boolean +): Promise<string | undefined> { let toolPath: string | undefined; try { @@ -16,8 +19,10 @@ export async function downloadGo(versionSpec: string, stable: boolean): Promise< let downloadPath: string = await tc.downloadTool(downloadUrl); // extract - let extPath: string = sys.getPlatform() == 'windows'? - await tc.extractZip(downloadPath): await tc.extractTar(downloadPath); + let extPath: string = + sys.getPlatform() == 'windows' + ? await tc.extractZip(downloadPath) + : await tc.extractTar(downloadPath); // extracts with a root folder that matches the fileName downloaded const toolRoot = path.join(extPath, 'go'); @@ -31,10 +36,10 @@ export async function downloadGo(versionSpec: string, stable: boolean): Promise< } export interface IGoVersionFile { - filename: string, + filename: string; // darwin, linux, windows - os: string, - arch: string + os: string; + arch: string; } export interface IGoVersion { @@ -43,26 +48,31 @@ export interface IGoVersion { files: IGoVersionFile[]; } -export async function findMatch(versionSpec: string, stable: boolean): Promise<IGoVersion | undefined> { +export async function findMatch( + versionSpec: string, + stable: boolean +): Promise<IGoVersion | undefined> { let archFilter = sys.getArch(); let platFilter = sys.getPlatform(); - let match: IGoVersion| undefined; + let match: IGoVersion | undefined; const dlUrl: string = 'https://golang.org/dl/?mode=json&include=all'; // this returns versions descending so latest is first let http: httpm.HttpClient = new httpm.HttpClient('setup-go'); - let candidates: IGoVersion[] | null = (await http.getJson<IGoVersion[]>(dlUrl)).result; + let candidates: IGoVersion[] | null = (await http.getJson<IGoVersion[]>( + dlUrl + )).result; if (!candidates) { throw new Error(`golang download url did not return results: ${dlUrl}`); } - + let goFile: IGoVersionFile | undefined; - for (let i=0; i < candidates.length; i++) { + for (let i = 0; i < candidates.length; i++) { let candidate: IGoVersion = candidates[i]; let version = candidate.version.replace('go', ''); - + // 1.13.0 is advertised as 1.13 preventing being able to match exactly 1.13.0 // since a semver of 1.13 would match latest 1.13 let parts: string[] = version.split('.'); @@ -81,10 +91,10 @@ export async function findMatch(versionSpec: string, stable: boolean): Promise<I break; } } - }; + } if (match && goFile) { - match.files = [ goFile ]; + match.files = [goFile]; } return match; diff --git a/src/main.ts b/src/main.ts index 26e34e7..8defc5e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,22 +10,24 @@ export async function run() { // If not supplied then problem matchers will still be setup. Useful for self-hosted. // let versionSpec = core.getInput('go-version'); - let stable: boolean = (core.getInput('stable') || '').toUpperCase() == "TRUE"; + let stable: boolean = + (core.getInput('stable') || '').toUpperCase() == 'TRUE'; if (versionSpec) { - let installDir: string | undefined = tc.find('go', versionSpec); + let installDir: string | undefined = tc.find('go', versionSpec); - if (!installDir) { - installDir = await installer.downloadGo(versionSpec, stable); - } - - if (installDir) { - core.exportVariable('GOROOT', installDir); - core.addPath(path.join(installDir, 'bin')); - } - else { - throw new Error(`Could not find a version that satisfied version spec: ${versionSpec}`); - } + if (!installDir) { + installDir = await installer.downloadGo(versionSpec, stable); + } + + if (installDir) { + core.exportVariable('GOROOT', installDir); + core.addPath(path.join(installDir, 'bin')); + } else { + throw new Error( + `Could not find a version that satisfied version spec: ${versionSpec}` + ); + } } // add problem matchers @@ -34,4 +36,4 @@ export async function run() { } catch (error) { core.setFailed(error.message); } -} \ No newline at end of file +} diff --git a/src/setup-go.ts b/src/setup-go.ts index 7045ac0..e2a31b4 100644 --- a/src/setup-go.ts +++ b/src/setup-go.ts @@ -1,3 +1,3 @@ -import {run} from './main' +import {run} from './main'; run(); diff --git a/src/system.ts b/src/system.ts index 5ed02f4..df26907 100644 --- a/src/system.ts +++ b/src/system.ts @@ -1,37 +1,37 @@ import * as os from 'os'; export function getPlatform(): string { - // darwin and linux match already - // freebsd not supported yet but future proofed. - - // 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', and 'win32' - let plat: string = os.platform(); - - // wants 'darwin', 'freebsd', 'linux', 'windows' - if (plat === 'win32') { - plat = 'windows'; - } - - return plat; + // darwin and linux match already + // freebsd not supported yet but future proofed. + + // 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', and 'win32' + let plat: string = os.platform(); + + // wants 'darwin', 'freebsd', 'linux', 'windows' + if (plat === 'win32') { + plat = 'windows'; } - - export function getArch(): string { - // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'. - let arch: string = os.arch(); - - // wants amd64, 386, arm64, armv61, ppc641e, s390x - // currently not supported by runner but future proofed mapping - switch (arch) { - case 'x64': - arch = 'amd64'; - break; - case 'ppc': - arch = 'ppc64'; - break; - case 'x32': - arch = '386'; - break; - } - - return arch; - } \ No newline at end of file + + return plat; +} + +export function getArch(): string { + // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'. + let arch: string = os.arch(); + + // wants amd64, 386, arm64, armv61, ppc641e, s390x + // currently not supported by runner but future proofed mapping + switch (arch) { + case 'x64': + arch = 'amd64'; + break; + case 'ppc': + arch = 'ppc64'; + break; + case 'x32': + arch = '386'; + break; + } + + return arch; +}