Skip to content

Commit 4d2e5ba

Browse files
committed
Support .php-version file; closes #629
1 parent baf9535 commit 4d2e5ba

File tree

6 files changed

+101
-6
lines changed

6 files changed

+101
-6
lines changed

README.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -391,14 +391,23 @@ Disable coverage for these reasons:
391391

392392
> Specify using `with` keyword
393393

394-
#### `php-version` (required)
394+
#### `php-version` (optional)
395395

396396
- Specify the PHP version you want to set up.
397397
- Accepts a `string`. For example `'8.0'`.
398398
- Accepts `latest` to set up the latest stable PHP version.
399399
- Accepts `nightly` to set up a nightly build from the master branch of PHP.
400400
- Accepts the format `d.x`, where `d` is the major version. For example `5.x`, `7.x` and `8.x`.
401401
- See [PHP support](#tada-php-support) for supported PHP versions.
402+
- By default, the PHP version is read from `php-version-file`.
403+
- Required if `php-version-file` does not exist.
404+
405+
#### `php-version-file` (optional)
406+
407+
- Specify the PHP version file you want to read when `php-version` is not provided.
408+
- Accepts a `string`. For example `'.phpenv-version'`.
409+
- See [PHP support](#tada-php-support) for supported PHP versions.
410+
- By default, `.php-version` file is used.
402411

403412
#### `extensions` (optional)
404413

__tests__/install.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jest.mock('../src/install', () => ({
1010
.mockImplementation(async (os: string): Promise<string> => {
1111
const filename = os + (await utils.scriptExtension(os));
1212
const version: string = await utils.parseVersion(
13-
await utils.getInput('php-version', true)
13+
await utils.resolveVersion()
1414
);
1515
const ini_file: string = await utils.parseIniFile(
1616
await utils.getInput('ini-file', false)

__tests__/utils.test.ts

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import fs from 'fs';
12
import * as path from 'path';
23
import * as utils from '../src/utils';
34

@@ -7,7 +8,8 @@ import * as utils from '../src/utils';
78
jest.mock('@actions/core', () => ({
89
getInput: jest.fn().mockImplementation(key => {
910
return ['setup-php'].indexOf(key) !== -1 ? key : '';
10-
})
11+
}),
12+
info: jest.fn()
1113
}));
1214

1315
/**
@@ -261,6 +263,34 @@ describe('Utils tests', () => {
261263
);
262264
});
263265

266+
it('checking resolveVersion', async () => {
267+
// expect(await utils.resolveVersion()).toBe('setup-php');
268+
// expect(await utils.resolveVersion()).toBe('');
269+
270+
await expect(utils.resolveVersion()).rejects.toThrow(
271+
"Neither 'php-version' nor 'php-version-file' inputs were supplied, and could not find '.php-version' file."
272+
);
273+
274+
process.env['php-version-file'] = '.phpenv-version';
275+
await expect(utils.resolveVersion()).rejects.toThrow(
276+
"Could not find '.phpenv-version' file."
277+
);
278+
279+
const existsSync = jest.spyOn(fs, 'existsSync').mockImplementation();
280+
const readFileSync = jest.spyOn(fs, 'readFileSync').mockImplementation();
281+
282+
existsSync.mockReturnValue(true);
283+
readFileSync.mockReturnValue('8.1');
284+
285+
expect(await utils.resolveVersion()).toBe('8.1');
286+
287+
process.env['php-version'] = '8.2';
288+
expect(await utils.resolveVersion()).toBe('8.2');
289+
290+
existsSync.mockClear();
291+
readFileSync.mockClear();
292+
});
293+
264294
it('checking setVariable', async () => {
265295
let script: string = await utils.setVariable('var', 'command', 'linux');
266296
expect(script).toEqual('\nvar="$(command)"\n');

dist/index.js

+26-2
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ async function getScript(os) {
557557
const ini_values_csv = await utils.getInput('ini-values', false);
558558
const coverage_driver = await utils.getInput('coverage', false);
559559
const tools_csv = await utils.getInput('tools', false);
560-
const version = await utils.parseVersion(await utils.getInput('php-version', true));
560+
const version = await utils.parseVersion(await utils.resolveVersion());
561561
const ini_file = await utils.parseIniFile(await utils.getInput('ini-file', false));
562562
let script = await utils.joins('.', script_path, version, ini_file);
563563
if (extension_csv) {
@@ -1032,8 +1032,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
10321032
__setModuleDefault(result, mod);
10331033
return result;
10341034
};
1035+
var __importDefault = (this && this.__importDefault) || function (mod) {
1036+
return (mod && mod.__esModule) ? mod : { "default": mod };
1037+
};
10351038
Object.defineProperty(exports, "__esModule", ({ value: true }));
1036-
exports.setVariable = exports.parseExtensionSource = exports.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.parseIniFile = exports.parseVersion = exports.getManifestURL = exports.getInput = exports.readEnv = void 0;
1039+
exports.setVariable = exports.resolveVersion = exports.parseExtensionSource = exports.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.parseIniFile = exports.parseVersion = exports.getManifestURL = exports.getInput = exports.readEnv = void 0;
1040+
const fs_1 = __importDefault(__nccwpck_require__(7147));
10371041
const path = __importStar(__nccwpck_require__(1017));
10381042
const core = __importStar(__nccwpck_require__(2186));
10391043
const fetch = __importStar(__nccwpck_require__(2387));
@@ -1279,6 +1283,26 @@ async function parseExtensionSource(extension, prefix) {
12791283
return await joins('\nadd_extension_from_source', ...matches.splice(1, matches.length), prefix);
12801284
}
12811285
exports.parseExtensionSource = parseExtensionSource;
1286+
async function resolveVersion() {
1287+
let version = await getInput('php-version', false);
1288+
let versionFile = await getInput('php-version-file', false);
1289+
if (version) {
1290+
return version;
1291+
}
1292+
if (versionFile && !fs_1.default.existsSync(versionFile)) {
1293+
throw new Error(`Could not find '${versionFile}' file.`);
1294+
}
1295+
versionFile ??= '.php-version';
1296+
if (fs_1.default.existsSync(versionFile)) {
1297+
version = fs_1.default.readFileSync(versionFile, 'utf8');
1298+
core.info(`Resolved ${versionFile} as ${version}`);
1299+
}
1300+
if (!version) {
1301+
throw new Error("Neither 'php-version' nor 'php-version-file' inputs were supplied, and could not find '.php-version' file.");
1302+
}
1303+
return version;
1304+
}
1305+
exports.resolveVersion = resolveVersion;
12821306
async function setVariable(variable, command, os) {
12831307
switch (os) {
12841308
case 'win32':

src/install.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export async function getScript(os: string): Promise<string> {
2424
const coverage_driver: string = await utils.getInput('coverage', false);
2525
const tools_csv: string = await utils.getInput('tools', false);
2626
const version: string = await utils.parseVersion(
27-
await utils.getInput('php-version', true)
27+
await utils.resolveVersion()
2828
);
2929
const ini_file: string = await utils.parseIniFile(
3030
await utils.getInput('ini-file', false)

src/utils.ts

+32
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import fs from 'fs';
12
import * as path from 'path';
23
import * as core from '@actions/core';
34
import * as fetch from './fetch';
@@ -422,6 +423,37 @@ export async function parseExtensionSource(
422423
);
423424
}
424425

426+
/**
427+
* Resolve php version from input or file
428+
*/
429+
export async function resolveVersion(): Promise<string> {
430+
let version = await getInput('php-version', false);
431+
let versionFile = await getInput('php-version-file', false);
432+
433+
if (version) {
434+
return version;
435+
}
436+
437+
if (versionFile && !fs.existsSync(versionFile)) {
438+
throw new Error(`Could not find '${versionFile}' file.`);
439+
}
440+
441+
versionFile ??= '.php-version';
442+
443+
if (fs.existsSync(versionFile)) {
444+
version = fs.readFileSync(versionFile, 'utf8');
445+
core.info(`Resolved ${versionFile} as ${version}`);
446+
}
447+
448+
if (!version) {
449+
throw new Error(
450+
"Neither 'php-version' nor 'php-version-file' inputs were supplied, and could not find '.php-version' file."
451+
);
452+
}
453+
454+
return version;
455+
}
456+
425457
/**
426458
* Log to console
427459
*

0 commit comments

Comments
 (0)