diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index c7b3a22..01ad99f 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -41,6 +41,7 @@ describe('setup-go', () => { let mkdirpSpy: jest.SpyInstance; let execSpy: jest.SpyInstance; let getManifestSpy: jest.SpyInstance; + let getAllVersionsSpy: jest.SpyInstance; beforeAll(async () => { process.env['GITHUB_ENV'] = ''; // Stub out Environment file functionality so we can verify it writes to standard out (toolkit is backwards compatible) @@ -83,6 +84,7 @@ describe('setup-go', () => { cacheSpy = jest.spyOn(tc, 'cacheDir'); getSpy = jest.spyOn(im, 'getVersionsDist'); getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); + getAllVersionsSpy = jest.spyOn(im, 'getAllReleases'); // io whichSpy = jest.spyOn(io, 'which'); @@ -779,6 +781,7 @@ describe('setup-go', () => { getManifestSpy.mockImplementation(() => { throw new Error('Unable to download manifest'); }); + getAllVersionsSpy.mockImplementationOnce(() => undefined); dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.13.7/x64'); diff --git a/dist/setup/index.js b/dist/setup/index.js index ccdd322..566e802 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -63213,7 +63213,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseGoVersionFile = exports.makeSemver = exports.getVersionsDist = exports.findMatch = exports.getInfoFromManifest = exports.extractGoArchive = exports.resolveVersionFromManifest = exports.getGo = void 0; +exports.parseGoVersionFile = exports.makeSemver = exports.getVersionsDist = exports.findMatch = exports.getInfoFromManifest = exports.getAllReleases = exports.extractGoArchive = exports.resolveVersionFromManifest = exports.getGo = void 0; const tc = __importStar(__nccwpck_require__(7784)); const core = __importStar(__nccwpck_require__(2186)); const path = __importStar(__nccwpck_require__(1017)); @@ -63222,12 +63222,12 @@ const httpm = __importStar(__nccwpck_require__(6255)); const sys = __importStar(__nccwpck_require__(4300)); const fs_1 = __importDefault(__nccwpck_require__(7147)); const os_1 = __importDefault(__nccwpck_require__(2037)); -function getGo(versionSpec, checkLatest, auth, arch = os_1.default.arch()) { +function getGo(versionSpec, checkLatest, auth, arch = os_1.default.arch(), releases) { return __awaiter(this, void 0, void 0, function* () { let osPlat = os_1.default.platform(); if (checkLatest) { core.info('Attempting to resolve the latest version from the manifest...'); - const resolvedVersion = yield resolveVersionFromManifest(versionSpec, true, auth, arch); + const resolvedVersion = yield resolveVersionFromManifest(versionSpec, true, auth, arch, releases); if (resolvedVersion) { versionSpec = resolvedVersion; core.info(`Resolved as '${versionSpec}'`); @@ -63290,10 +63290,10 @@ function getGo(versionSpec, checkLatest, auth, arch = os_1.default.arch()) { }); } exports.getGo = getGo; -function resolveVersionFromManifest(versionSpec, stable, auth, arch) { +function resolveVersionFromManifest(versionSpec, stable, auth, arch, releases) { return __awaiter(this, void 0, void 0, function* () { try { - const info = yield getInfoFromManifest(versionSpec, stable, auth, arch); + const info = yield getInfoFromManifest(versionSpec, stable, auth, arch, releases); return info === null || info === void 0 ? void 0 : info.resolvedVersion; } catch (err) { @@ -63337,18 +63337,18 @@ function extractGoArchive(archivePath) { }); } exports.extractGoArchive = extractGoArchive; -function getInfoFromManifest(versionSpec, stable, auth, arch = os_1.default.arch()) { +function getAllReleases(auth) { + return __awaiter(this, void 0, void 0, function* () { + return yield tc.getManifestFromRepo('actions', 'go-versions', auth, 'main'); + }); +} +exports.getAllReleases = getAllReleases; +function getInfoFromManifest(versionSpec, stable, auth, arch = os_1.default.arch(), releases) { return __awaiter(this, void 0, void 0, function* () { let info = null; - const releases = yield tc.getManifestFromRepo('actions', 'go-versions', auth, 'main'); + releases = releases ? releases : yield getAllReleases(auth); core.info(`matching ${versionSpec}...`); - let rel; - if (versionSpec === 'stable') { - rel = releases[0]; - } - else { - rel = yield tc.findFromManifest(versionSpec, stable, releases, arch); - } + let rel = yield tc.findFromManifest(versionSpec, stable, releases, arch); if (rel && rel.files.length > 0) { info = {}; info.type = 'manifest'; @@ -63511,6 +63511,7 @@ const cache_utils_1 = __nccwpck_require__(1678); const child_process_1 = __importDefault(__nccwpck_require__(2081)); const fs_1 = __importDefault(__nccwpck_require__(7147)); const os_1 = __importDefault(__nccwpck_require__(2037)); +const utils_1 = __nccwpck_require__(1314); function run() { return __awaiter(this, void 0, void 0, function* () { try { @@ -63528,11 +63529,13 @@ function run() { if (versionSpec) { let token = core.getInput('token'); let auth = !token ? undefined : `token ${token}`; + const releases = yield installer.getAllReleases(auth); const checkLatest = core.getBooleanInput('check-latest'); - if (versionSpec === 'stable' || versionSpec === 'oldstable') { - versionSpec = yield resolveStableVersionInput(versionSpec, auth, arch); + if (versionSpec === utils_1.StableReleaseAlias.Stable || + versionSpec === utils_1.StableReleaseAlias.OldStable) { + versionSpec = yield resolveStableVersionInput(versionSpec, auth, arch, releases); } - const installDir = yield installer.getGo(versionSpec, checkLatest, auth, arch); + const installDir = yield installer.getGo(versionSpec, checkLatest, auth, arch, releases); core.addPath(path_1.default.join(installDir, 'bin')); core.info('Added go to the path'); const version = installer.makeSemver(versionSpec); @@ -63624,19 +63627,22 @@ function resolveVersionInput() { } return version; } -function resolveStableVersionInput(versionSpec, auth, arch = os_1.default.arch()) { +function resolveStableVersionInput(versionSpec, auth, arch = os_1.default.arch(), releases) { return __awaiter(this, void 0, void 0, function* () { - let resolvedVersion = yield installer.resolveVersionFromManifest('stable', true, auth, arch); - core.info(`Stable version resolved as ${resolvedVersion}`); - if (versionSpec === 'oldstable') { - if (resolvedVersion) { - // example: if version is 1.19.4, semver expression will be: <1.19.0 - const semverExpression = `<${semver.major(resolvedVersion)}.${semver.minor(resolvedVersion)}.0`; - resolvedVersion = yield installer.resolveVersionFromManifest(semverExpression, true, auth, arch); - core.info(`Oldstable version resolved as ${resolvedVersion}`); - } + if (versionSpec === utils_1.StableReleaseAlias.Stable) { + core.info(`Stable version resolved as ${releases[0].version}`); + return releases[0].version; + } + else { + const versions = releases.map(release => `${semver.major(release.version)}.${semver.minor(release.version)}`); + const uniqueVersions = Array.from(new Set(versions)); + core.info(`Oldstable version resolved as ${uniqueVersions[1]}`); + const oldstableVersion = yield installer.getInfoFromManifest(versionSpec, true, auth, arch, releases); + if (!oldstableVersion) { + return versionSpec; + } + return oldstableVersion.resolvedVersion; } - return resolvedVersion ? resolvedVersion : versionSpec; }); } @@ -63703,6 +63709,22 @@ function getArch(arch) { exports.getArch = getArch; +/***/ }), + +/***/ 1314: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StableReleaseAlias = void 0; +var StableReleaseAlias; +(function (StableReleaseAlias) { + StableReleaseAlias["Stable"] = "stable"; + StableReleaseAlias["OldStable"] = "oldstable"; +})(StableReleaseAlias = exports.StableReleaseAlias || (exports.StableReleaseAlias = {})); + + /***/ }), /***/ 2877: diff --git a/src/installer.ts b/src/installer.ts index d924eae..36b20c4 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -8,7 +8,6 @@ import fs from 'fs'; import os from 'os'; type InstallationType = 'dist' | 'manifest'; -export type StableAliasType = 'stable' | 'oldstable'; export interface IGoVersionFile { filename: string; @@ -34,7 +33,8 @@ export async function getGo( versionSpec: string, checkLatest: boolean, auth: string | undefined, - arch = os.arch() + arch = os.arch(), + releases: tc.IToolRelease[] | undefined ) { let osPlat: string = os.platform(); @@ -44,7 +44,8 @@ export async function getGo( versionSpec, true, auth, - arch + arch, + releases ); if (resolvedVersion) { versionSpec = resolvedVersion; @@ -119,10 +120,17 @@ export async function resolveVersionFromManifest( versionSpec: string, stable: boolean, auth: string | undefined, - arch: string + arch: string, + releases: tc.IToolRelease[] | undefined ): Promise { try { - const info = await getInfoFromManifest(versionSpec, stable, auth, arch); + const info = await getInfoFromManifest( + versionSpec, + stable, + auth, + arch, + releases + ); return info?.resolvedVersion; } catch (err) { core.info('Unable to resolve a version from the manifest...'); @@ -175,28 +183,23 @@ export async function extractGoArchive(archivePath: string): Promise { return extPath; } +export async function getAllReleases(auth: string | undefined) { + return await tc.getManifestFromRepo('actions', 'go-versions', auth, 'main'); +} + export async function getInfoFromManifest( - versionSpec: string | StableAliasType, + versionSpec: string, stable: boolean, auth: string | undefined, - arch = os.arch() + arch = os.arch(), + releases?: tc.IToolRelease[] | undefined ): Promise { let info: IGoVersionInfo | null = null; - const releases = await tc.getManifestFromRepo( - 'actions', - 'go-versions', - auth, - 'main' - ); + releases = releases ? releases : await getAllReleases(auth); + core.info(`matching ${versionSpec}...`); - let rel: tc.IToolRelease | undefined; - - if (versionSpec === 'stable') { - rel = releases[0]; - } else { - rel = await tc.findFromManifest(versionSpec, stable, releases, arch); - } + let rel = await tc.findFromManifest(versionSpec, stable, releases, arch); if (rel && rel.files.length > 0) { info = {}; diff --git a/src/main.ts b/src/main.ts index 012088f..6375376 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,8 @@ import {isCacheFeatureAvailable} from './cache-utils'; import cp from 'child_process'; import fs from 'fs'; import os from 'os'; +import {IToolRelease} from '@actions/tool-cache'; +import {StableReleaseAlias} from './utils'; export async function run() { try { @@ -30,17 +32,28 @@ export async function run() { let token = core.getInput('token'); let auth = !token ? undefined : `token ${token}`; + const releases = await installer.getAllReleases(auth); + const checkLatest = core.getBooleanInput('check-latest'); - if (versionSpec === 'stable' || versionSpec === 'oldstable') { - versionSpec = await resolveStableVersionInput(versionSpec, auth, arch); + if ( + versionSpec === StableReleaseAlias.Stable || + versionSpec === StableReleaseAlias.OldStable + ) { + versionSpec = await resolveStableVersionInput( + versionSpec, + auth, + arch, + releases + ); } const installDir = await installer.getGo( versionSpec, checkLatest, auth, - arch + arch, + releases ); core.addPath(path.join(installDir, 'bin')); @@ -150,36 +163,36 @@ function resolveVersionInput(): string { } async function resolveStableVersionInput( - versionSpec: installer.StableAliasType, + versionSpec: string, auth: string | undefined, - arch = os.arch() + arch = os.arch(), + releases: IToolRelease[] ): Promise { - let resolvedVersion = await installer.resolveVersionFromManifest( - 'stable', - true, - auth, - arch - ); + if (versionSpec === StableReleaseAlias.Stable) { + core.info(`Stable version resolved as ${releases[0].version}`); - core.info(`Stable version resolved as ${resolvedVersion}`); + return releases[0].version; + } else { + const versions = releases.map( + release => + `${semver.major(release.version)}.${semver.minor(release.version)}` + ); + const uniqueVersions = Array.from(new Set(versions)); - if (versionSpec === 'oldstable') { - if (resolvedVersion) { - // example: if version is 1.19.4, semver expression will be: <1.19.0 - const semverExpression = `<${semver.major( - resolvedVersion - )}.${semver.minor(resolvedVersion)}.0`; + core.info(`Oldstable version resolved as ${uniqueVersions[1]}`); - resolvedVersion = await installer.resolveVersionFromManifest( - semverExpression, - true, - auth, - arch - ); + const oldstableVersion = await installer.getInfoFromManifest( + versionSpec, + true, + auth, + arch, + releases + ); - core.info(`Oldstable version resolved as ${resolvedVersion}`); + if (!oldstableVersion) { + return versionSpec; } - } - return resolvedVersion ? resolvedVersion : versionSpec; + return oldstableVersion.resolvedVersion; + } } diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..79d03bc --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,4 @@ +export enum StableReleaseAlias { + Stable = 'stable', + OldStable = 'oldstable' +}