From fbc8407035054ffdd2d305af6bd038a3367f1405 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Sat, 16 Jan 2021 11:16:13 +0530 Subject: [PATCH] Add support to specify version in \d.x notation --- __tests__/utils.test.ts | 16 ++++++++++- dist/index.js | 50 ++++++++++++++++++++++++++++------- src/configs/php-versions.json | 6 +++++ src/install.ts | 14 ++++++---- src/utils.ts | 27 ++++++++++++++++--- 5 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 src/configs/php-versions.json diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts index ad082716..9e7b4be7 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) { @@ -33,10 +39,18 @@ 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('latest')).toBe('8.0'); + expect(await utils.parseVersion('5.x')).toBe('5.6'); + expect(await utils.parseVersion('4.x')).toBe(undefined); }); it('checking asyncForEach', async () => { diff --git a/dist/index.js b/dist/index.js index 73ff20a3..e2190853 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.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = 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.getInput = exports.readEnv = void 0; +exports.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = 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,15 +1095,34 @@ 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) { - switch (version) { - case 'latest': - return '8.0'; + const manifest = 'https://dl.bintray.com/shivammathur/php/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: @@ -1394,6 +1414,13 @@ async function customPackage(pkg, type, version, os_version) { exports.customPackage = customPackage; +/***/ }), + +/***/ 211: +/***/ (function(module) { + +module.exports = require("https"); + /***/ }), /***/ 357: @@ -2595,11 +2622,16 @@ exports.getScript = getScript; async function run() { try { const version = await utils.parseVersion(await utils.getInput('php-version', true)); - const os_version = process.platform; - const tool = await utils.scriptTool(os_version); - const script = os_version + (await utils.scriptExtension(os_version)); - const location = await getScript(script, version, os_version); - await exec_1.exec(await utils.joins(tool, location, version, __dirname)); + if (version) { + const os_version = process.platform; + const tool = await utils.scriptTool(os_version); + const script = os_version + (await utils.scriptExtension(os_version)); + const location = await getScript(script, version, os_version); + await exec_1.exec(await utils.joins(tool, location, version, __dirname)); + } + else { + core.setFailed('Unable to get the PHP version'); + } } catch (error) { core.setFailed(error.message); 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 25739d0c..48a9dd33 100644 --- a/src/install.ts +++ b/src/install.ts @@ -54,11 +54,15 @@ export async function run(): Promise { const version: string = await utils.parseVersion( await utils.getInput('php-version', true) ); - const os_version: string = process.platform; - const tool = await utils.scriptTool(os_version); - const script = os_version + (await utils.scriptExtension(os_version)); - const location = await getScript(script, version, os_version); - await exec(await utils.joins(tool, location, version, __dirname)); + if (version) { + const os_version: string = process.platform; + const tool = await utils.scriptTool(os_version); + const script = os_version + (await utils.scriptExtension(os_version)); + const location = await getScript(script, version, os_version); + await exec(await utils.joins(tool, location, version, __dirname)); + } 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 64094b03..5391cc59 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,15 +43,34 @@ 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 { - switch (version) { - case 'latest': - return '8.0'; + const manifest = 'https://dl.bintray.com/shivammathur/php/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: