From 5520fdb61ac8f63e4265b758b7315e476baa0cc9 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Mon, 22 Feb 2021 11:22:59 +0530 Subject: [PATCH] Add support to specify version in \d.x notation --- __tests__/utils.test.ts | 20 +++++++++ dist/index.js | 82 ++++++++++++++++++++++++++++------- src/configs/php-versions.json | 6 +++ src/install.ts | 35 ++++++++------- src/utils.ts | 41 ++++++++++++++++++ 5 files changed, 153 insertions(+), 31 deletions(-) create mode 100644 src/configs/php-versions.json diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index 5a234e02..43337465 100644 --- a/__tests__/utils.test.ts +++ b/__tests__/utils.test.ts @@ -8,6 +8,12 @@ jest.mock('@actions/core', () => ({ }) })); +jest.spyOn(utils, 'fetch').mockImplementation( + async (url): Promise => { + return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`; + } +); + async function cleanup(path: string): Promise { fs.unlink(path, error => { if (error) { @@ -32,6 +38,20 @@ describe('Utils tests', () => { }).rejects.toThrow('Input required and not supplied: DoesNotExist'); }); + it('checking fetch', async () => { + expect(await utils.fetch('test_url')).toBe( + '{ "latest": "8.0", "5.x": "5.6", "url": "test_url" }' + ); + }); + + it('checking parseVersion', async () => { + expect(await utils.parseVersion('latest')).toBe('8.0'); + expect(await utils.parseVersion('7')).toBe('7.0'); + expect(await utils.parseVersion('7.4')).toBe('7.4'); + expect(await utils.parseVersion('5.x')).toBe('5.6'); + expect(await utils.parseVersion('4.x')).toBe(undefined); + }); + it('checking asyncForEach', async () => { const array: Array = ['a', 'b', 'c']; let concat = ''; diff --git a/dist/index.js b/dist/index.js index f4f046fa..e1272644 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1054,8 +1054,9 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.writeScript = exports.readScript = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.getInput = exports.readEnv = void 0; +exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.writeScript = exports.readScript = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.parseVersion = exports.fetch = exports.getInput = exports.readEnv = void 0; const fs = __importStar(__webpack_require__(747)); +const https = __importStar(__webpack_require__(211)); const path = __importStar(__webpack_require__(622)); const core = __importStar(__webpack_require__(470)); /** @@ -1094,6 +1095,44 @@ async function getInput(name, mandatory) { } } exports.getInput = getInput; +/** + * Function to fetch an URL + * + * @param url + */ +async function fetch(url) { + const fetch_promise = new Promise(resolve => { + const req = https.get(url, (res) => { + res.setEncoding('utf8'); + let body = ''; + res.on('data', chunk => (body += chunk)); + res.on('end', () => resolve(body)); + }); + req.end(); + }); + return await fetch_promise; +} +exports.fetch = fetch; +/** + * Function to parse PHP version. + * + * @param version + */ +async function parseVersion(version) { + const manifest = 'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json'; + switch (true) { + case /^(latest|\d+\.x)$/.test(version): + return JSON.parse(await fetch(manifest))[version]; + default: + switch (true) { + case version.length > 1: + return version.slice(0, 3); + default: + return version + '.0'; + } + } +} +exports.parseVersion = parseVersion; /** * Async foreach loop * @@ -1285,6 +1324,13 @@ async function suppressOutput(os_version) { exports.suppressOutput = suppressOutput; +/***/ }), + +/***/ 211: +/***/ (function(module) { + +module.exports = require("https"); + /***/ }), /***/ 357: @@ -2418,25 +2464,29 @@ exports.build = build; async function run() { try { core.warning('setup-php v1 is deprecated.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2'); - const os_version = process.platform; - let version = await utils.getInput('php-version', true); - version = version.length > 1 ? version.slice(0, 3) : version + '.0'; + const version = await utils.parseVersion(await utils.getInput('php-version', true)); if (version == '8.1') { core.setFailed('PHP 8.1 is not supported on setup-php v1.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2'); return; } - // check the os version and run the respective script - let script_path = ''; - switch (os_version) { - case 'darwin': - case 'linux': - script_path = await build(os_version + '.sh', version, os_version); - await exec_1.exec('bash ' + script_path + ' ' + version + ' ' + __dirname); - break; - case 'win32': - script_path = await build('win32.ps1', version, os_version); - await exec_1.exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); - break; + if (version) { + const os_version = process.platform; + // check the os version and run the respective script + let script_path = ''; + switch (os_version) { + case 'darwin': + case 'linux': + script_path = await build(os_version + '.sh', version, os_version); + await exec_1.exec('bash ' + script_path + ' ' + version + ' ' + __dirname); + break; + case 'win32': + script_path = await build('win32.ps1', version, os_version); + await exec_1.exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); + break; + } + } + else { + core.setFailed('Unable to get the PHP version'); } } catch (error) { diff --git a/src/configs/php-versions.json b/src/configs/php-versions.json new file mode 100644 index 00000000..1096a264 --- /dev/null +++ b/src/configs/php-versions.json @@ -0,0 +1,6 @@ +{ + "latest": "8.0", + "5.x": "5.6", + "7.x": "7.4", + "8.x": "8.0" +} \ No newline at end of file diff --git a/src/install.ts b/src/install.ts index bf1185b1..a4229ee1 100644 --- a/src/install.ts +++ b/src/install.ts @@ -58,27 +58,32 @@ export async function run(): Promise { core.warning( 'setup-php v1 is deprecated.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2' ); - const os_version: string = process.platform; - let version: string = await utils.getInput('php-version', true); - version = version.length > 1 ? version.slice(0, 3) : version + '.0'; + const version: string = await utils.parseVersion( + await utils.getInput('php-version', true) + ); if (version == '8.1') { core.setFailed( 'PHP 8.1 is not supported on setup-php v1.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2' ); return; } - // check the os version and run the respective script - let script_path = ''; - switch (os_version) { - case 'darwin': - case 'linux': - script_path = await build(os_version + '.sh', version, os_version); - await exec('bash ' + script_path + ' ' + version + ' ' + __dirname); - break; - case 'win32': - script_path = await build('win32.ps1', version, os_version); - await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); - break; + if (version) { + const os_version: string = process.platform; + // check the os version and run the respective script + let script_path = ''; + switch (os_version) { + case 'darwin': + case 'linux': + script_path = await build(os_version + '.sh', version, os_version); + await exec('bash ' + script_path + ' ' + version + ' ' + __dirname); + break; + case 'win32': + script_path = await build('win32.ps1', version, os_version); + await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); + break; + } + } else { + core.setFailed('Unable to get the PHP version'); } } catch (error) { core.setFailed(error.message); diff --git a/src/utils.ts b/src/utils.ts index e2ec8a54..c88f339b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,6 @@ +import {IncomingMessage} from 'http'; import * as fs from 'fs'; +import * as https from 'https'; import * as path from 'path'; import * as core from '@actions/core'; @@ -41,6 +43,45 @@ export async function getInput( } } +/** + * Function to fetch an URL + * + * @param url + */ +export async function fetch(url: string): Promise { + const fetch_promise: Promise = new Promise(resolve => { + const req = https.get(url, (res: IncomingMessage) => { + res.setEncoding('utf8'); + let body = ''; + res.on('data', chunk => (body += chunk)); + res.on('end', () => resolve(body)); + }); + req.end(); + }); + return await fetch_promise; +} + +/** + * Function to parse PHP version. + * + * @param version + */ +export async function parseVersion(version: string): Promise { + const manifest = + 'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json'; + switch (true) { + case /^(latest|\d+\.x)$/.test(version): + return JSON.parse(await fetch(manifest))[version]; + default: + switch (true) { + case version.length > 1: + return version.slice(0, 3); + default: + return version + '.0'; + } + } +} + /** * Async foreach loop *