Compare commits

...

24 Commits

Author SHA1 Message Date
fbdd58c5bc Bump version to 1.11.5
Replace husky with simple-git-hooks

Update Node.js dependencies
2021-09-28 01:51:40 +05:30
2c5cb7a75e Make all extension variables local 2021-09-28 01:42:44 +05:30
ab12e42197 Add support for expect and ssh2 using shivammathur/extensions on macOS
Add config to brew extensions and refactor add_brew_extension in darwin.sh to use it
2021-09-28 01:38:12 +05:30
5588437714 Update sponsors section 2021-09-28 01:28:53 +05:30
d7eb9ade23 Update SECURITY.md 2021-09-11 04:42:32 +05:30
938988b211 Bump version to 1.11.4
Update Node.js dependencies

Fix build error in install.ts

Add config to generate types

Add bugs, directories, files and types entries in package.json
2021-09-11 04:41:35 +05:30
e030852d0e Use PhpManager for all PHP versions on v1 2021-09-09 02:53:01 +05:30
3aa870b0fe Fix unsupported PHP versions warning on v1 2021-09-09 02:49:04 +05:30
1229133602 Use shivammathur/extensions tap to install vips on macOS 2021-09-09 02:40:49 +05:30
b1b8d8367c Run New-Item with -Force in Win32.ps1 2021-09-09 02:34:37 +05:30
60ff55130a Update sponsors info 2021-09-09 02:30:03 +05:30
e5690a9659 Add windows-2022 to the README 2021-09-09 02:27:14 +05:30
7958a5ccff Bump version 1.11.3
Sync tsconfig.json with v2

Update dependencies
2021-08-23 12:54:39 +05:30
113a31fceb Stop doing shallow clones on macOS self-hosted 2021-08-23 12:49:33 +05:30
c9aea8708f Set HOMEBREW_DEVELOPER=1 in macOS 2021-08-23 12:48:34 +05:30
7435bb8e4a Use --no-install-recommends with APT on Linux 2021-08-23 12:47:56 +05:30
5227e2cd5c Fix to make utils.readEnv more resilient to user input 2021-08-23 12:42:17 +05:30
906893d397 Use shivammathur/extensions tap on macOS for mongodb and yaml 2021-08-23 12:41:33 +05:30
f1b6b2bbe0 Rename macos-11.0 to macos-11 2021-08-23 12:39:55 +05:30
e59c938e82 Update Phive configuration 2021-08-23 12:38:05 +05:30
506357cdb9 Sunset support for Ubuntu 16.04 2021-08-02 22:55:00 +05:30
b57416e44d Fix composer permissions on unix 2021-07-21 18:58:36 +05:30
9d1fe69816 Revert PCRE2 Patch 2021-07-16 15:52:34 +05:30
fec64d1788 Bump version to 1.11.2
Update Node.js dependencies

Fix replacing v prefix in tool version

Use shivammathur/extensions tap for rdkafka on macOS

Update Ubuntu 16.04 warning in install.ts

Add patch for PCRE2
2021-07-13 15:13:18 +05:30
20 changed files with 2492 additions and 2996 deletions

6
.github/FUNDING.yml vendored
View File

@ -1,7 +1,3 @@
# These are supported funding model platforms # These are supported funding model platforms
open_collective: setup-php github:shivammathur
tidelift: "npm/setup-php"
community_bridge: setup-php
patreon: shivammathur
custom: https://www.paypal.me/shivammathur

3
.github/SECURITY.md vendored
View File

@ -7,7 +7,7 @@ The following versions of this project are supported for security updates.
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| 1.11.x | :white_check_mark: | | 1.11.x | :white_check_mark: |
| 2.11.x | :white_check_mark: | | 2.14.x | :white_check_mark: |
## Supported PHP Versions ## Supported PHP Versions
@ -18,6 +18,7 @@ This security policy only applies to the latest patches of the following PHP ver
| 7.3 | :white_check_mark: | | 7.3 | :white_check_mark: |
| 7.4 | :white_check_mark: | | 7.4 | :white_check_mark: |
| 8.0 | :white_check_mark: | | 8.0 | :white_check_mark: |
| 8.1 | :white_check_mark: |
## Reporting a Vulnerability ## Reporting a Vulnerability

View File

@ -20,7 +20,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
operating-system: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04, windows-latest, macos-latest] operating-system: [ubuntu-20.04, ubuntu-18.04, windows-latest, macos-latest]
php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0'] php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0']
steps: steps:
- name: Checkout - name: Checkout

View File

@ -58,12 +58,12 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
|Virtual environment|YAML workflow label|Pre-installed PHP| |Virtual environment|YAML workflow label|Pre-installed PHP|
|--- |--- |--- | |--- |--- |--- |
|Ubuntu 16.04 [(deprecated)](https://setup-php.com/i/452)|`ubuntu-16.04`|`PHP 5.6` to `PHP 8.0`|
|Ubuntu 18.04|`ubuntu-18.04`|`PHP 7.1` to `PHP 8.0`| |Ubuntu 18.04|`ubuntu-18.04`|`PHP 7.1` to `PHP 8.0`|
|Ubuntu 20.04|`ubuntu-latest` or `ubuntu-20.04`|`PHP 7.4` to `PHP 8.0`| |Ubuntu 20.04|`ubuntu-latest` or `ubuntu-20.04`|`PHP 7.4` to `PHP 8.0`|
|Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 8.0`| |Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 8.0`|
|Windows Server 2022|`windows-2022`|`PHP 8.0`|
|macOS 10.15 Catalina|`macos-latest` or `macos-10.15`|`PHP 8.0`| |macOS 10.15 Catalina|`macos-latest` or `macos-10.15`|`PHP 8.0`|
|macOS 11.0 Big Sur|`macos-11.0`|`PHP 8.0`| |macOS 11.x Big Sur|`macos-11`|`PHP 8.0`|
## :heavy_plus_sign: PHP Extension Support ## :heavy_plus_sign: PHP Extension Support
- On `ubuntu` by default extensions which are available as a package can be installed. If the extension is not available as a package but it is on `PECL`, it can be installed by specifying `pecl` in the tools input. - On `ubuntu` by default extensions which are available as a package can be installed. If the extension is not available as a package but it is on `PECL`, it can be installed by specifying `pecl` in the tools input.
@ -416,30 +416,23 @@ Contributions are welcome! See [Contributor's Guide](.github/CONTRIBUTING.md "sh
## :sparkling_heart: Support This Project ## :sparkling_heart: Support This Project
- If setup-php saved your developer time, please consider sponsoring setup-php: Please sponsor setup-php using [GitHub sponsors](https://github.com/sponsors/shivammathur).
- [Open Collective](https://opencollective.com/setup-php "setup-php Open Collective")
- [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal")
- [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon")
- Please [reach out](mailto:contact@setup-php.com) if you have any questions regarding sponsoring setup-php.
- Please star the project and share it. If you blog, please share your experience of using this action.
*Huge thanks to the following companies for supporting `setup-php`* [![Sponsor shivammathur](https://img.shields.io/badge/-Sponsor-fafbfc?logo=GitHub%20Sponsors)](https://github.com/sponsors/shivammathur)
<p> ### Corporate Sponsors
<a href="https://www.jetbrains.com/?from=setup-php">
<img src="https://setup-php.com/sponsors/jetbrains.svg" alt="JetBrains" width="106" height="60"> <p align="center">
<a href="https://setup-php.com/sponsors-corp/?">
<img src="https://setup-php.com/sponsors-corp/?" alt="Corporate sponsors of setup-php and related projects" width="100%">
</a> </a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<a href="https://blackfire.io/?utm_source=setup-php">
<img src="https://setup-php.com/sponsors//blackfire.svg" alt="Blackfire" width="212" height="60"> ### Individual Sponsors
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p align="center">
<a href="https://www.macstadium.com/?source=setup-php"> <a href="https://setup-php.com/sponsors/?">
<img src="https://setup-php.com/sponsors//macstadium.png" alt="Mac Stadium" width="148" height="60"> <img src="https://setup-php.com/sponsors/?" alt="Individual sponsors of setup-php and related projects" width="100%">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://tidelift.com/subscription/pkg/npm-setup-php">
<img src="https://setup-php.com/sponsors//tidelift.png" alt="Tidelift" width="70" height="60">
</a> </a>
</p> </p>

View File

@ -73,12 +73,13 @@ describe('Extension tests', () => {
it('checking addExtensionOnDarwin', async () => { it('checking addExtensionOnDarwin', async () => {
let darwin: string = await extensions.addExtension( let darwin: string = await extensions.addExtension(
'Xdebug, pcov, grpc, igbinary, imagick, phalcon3, phalcon4, protobuf, psr, swoole, sqlite, ast-beta', 'Xdebug, pcov, expect, grpc, igbinary, imagick, phalcon3, phalcon4, protobuf, psr, rdkafka, ssh2, swoole, vips, sqlite, ast-beta',
'7.2', '7.2',
'darwin' 'darwin'
); );
expect(darwin).toContain('add_brew_extension xdebug'); expect(darwin).toContain('add_brew_extension xdebug');
expect(darwin).toContain('add_brew_extension pcov'); expect(darwin).toContain('add_brew_extension pcov');
expect(darwin).toContain('add_brew_extension expect');
expect(darwin).toContain('add_brew_extension grpc'); expect(darwin).toContain('add_brew_extension grpc');
expect(darwin).toContain('add_brew_extension igbinary'); expect(darwin).toContain('add_brew_extension igbinary');
expect(darwin).toContain('add_brew_extension imagick'); expect(darwin).toContain('add_brew_extension imagick');
@ -86,7 +87,10 @@ describe('Extension tests', () => {
expect(darwin).toContain('add_brew_extension phalcon4'); expect(darwin).toContain('add_brew_extension phalcon4');
expect(darwin).toContain('add_brew_extension protobuf'); expect(darwin).toContain('add_brew_extension protobuf');
expect(darwin).toContain('add_brew_extension psr'); expect(darwin).toContain('add_brew_extension psr');
expect(darwin).toContain('add_brew_extension rdkafka');
expect(darwin).toContain('add_brew_extension ssh2');
expect(darwin).toContain('add_brew_extension swoole'); expect(darwin).toContain('add_brew_extension swoole');
expect(darwin).toContain('add_brew_extension vips');
expect(darwin).toContain('pecl_install sqlite3'); expect(darwin).toContain('pecl_install sqlite3');
expect(darwin).toContain('add_unstable_extension ast beta extension'); expect(darwin).toContain('add_unstable_extension ast beta extension');

View File

@ -127,6 +127,11 @@ describe('Tools tests', () => {
expect(script).toContain( expect(script).toContain(
'Add-Tool https://github.com/phar-io/phive/releases/download/0.13.5/phive-0.13.5.phar phive' 'Add-Tool https://github.com/phar-io/phive/releases/download/0.13.5/phive-0.13.5.phar phive'
); );
script = await tools.addPhive('latest', '7.2', 'win32');
expect(script).toContain(
'Add-Tool https://github.com/phar-io/phive/releases/download/0.14.5/phive-0.14.5.phar phive'
);
}); });
it('checking getPhpunitUri', async () => { it('checking getPhpunitUri', async () => {

View File

@ -23,7 +23,11 @@ async function cleanup(path: string): Promise<void> {
describe('Utils tests', () => { describe('Utils tests', () => {
it('checking readEnv', async () => { it('checking readEnv', async () => {
process.env['test'] = 'setup-php'; process.env['test'] = 'setup-php';
process.env['test-hyphen'] = 'setup-php';
expect(await utils.readEnv('test')).toBe('setup-php'); expect(await utils.readEnv('test')).toBe('setup-php');
expect(await utils.readEnv('TEST')).toBe('setup-php');
expect(await utils.readEnv('test_hyphen')).toBe('setup-php');
expect(await utils.readEnv('TEST_HYPHEN')).toBe('setup-php');
expect(await utils.readEnv('undefined')).toBe(''); expect(await utils.readEnv('undefined')).toBe('');
}); });

392
dist/index.js vendored
View File

@ -230,9 +230,10 @@ async function addExtensionDarwin(extension_csv, version) {
' ' + ' ' +
ext_prefix; ext_prefix;
return; return;
case /(5\.6|7\.[0-4]|8.0)(amqp|grpc|igbinary|imagick|imap|msgpack|^(pecl_)?http$|propro|protobuf|psr|raphf|redis|swoole|xdebug|xdebug2|zmq)/.test(version_extension): case /(5\.6|7\.[0-4]|8.0)(amqp|expect|grpc|igbinary|imagick|imap|mongodb|msgpack|^(pecl_)?http$|propro|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test(version_extension):
case /(7\.[1-4]|8\.0])pcov/.test(version_extension): case /(7\.[1-4]|8\.0])pcov/.test(version_extension):
case /^(5\.6|7\.[0-3])phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension): case /^(5\.6|7\.[0-3])phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /(7\.[0-4]|8\.0])vips/.test(version_extension):
command = 'add_brew_extension ' + extension_name.replace('pecl_', ''); command = 'add_brew_extension ' + extension_name.replace('pecl_', '');
break; break;
case /^sqlite$/.test(extension): case /^sqlite$/.test(extension):
@ -438,14 +439,15 @@ async function build(filename, version, os_version) {
exports.build = build; exports.build = build;
async function run() { async function run() {
try { try {
core.warning('setup-php v1 is deprecated.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2'); if ((await utils.readEnv('ImageOS')) == 'ubuntu16') {
const version = await utils.parseVersion(await utils.getInput('php-version', true)); core.setFailed('setup-php is not supported on Ubuntu 16.04. Please upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452');
if (version == '8.1') {
core.setFailed('PHP 8.1 is not supported on setup-php v1.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2');
return; return;
} }
if ((await utils.readEnv('ImageOS')) == 'ubuntu16') { core.warning('setup-php v1 is deprecated.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2');
core.warning('Ubuntu 16.04 is deprecated.\nPlease upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452'); const version = await utils.parseVersion(await utils.getInput('php-version', true));
if (parseFloat(version) < 5.6 || parseFloat(version) > 8.0) {
core.setFailed(`setup-php v1 supports only PHP 5.6 to 8.0.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2`);
return;
} }
if (version) { if (version) {
const os_version = process.platform; const os_version = process.platform;
@ -454,11 +456,11 @@ async function run() {
case 'darwin': case 'darwin':
case 'linux': case 'linux':
script_path = await build(os_version + '.sh', version, os_version); script_path = await build(os_version + '.sh', version, os_version);
await exec_1.exec('bash ' + script_path + ' ' + version + ' ' + __dirname); await (0, exec_1.exec)('bash ' + script_path + ' ' + version + ' ' + __dirname);
break; break;
case 'win32': case 'win32':
script_path = await build('win32.ps1', version, os_version); script_path = await build('win32.ps1', version, os_version);
await exec_1.exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); await (0, exec_1.exec)('pwsh ' + script_path + ' ' + version + ' ' + __dirname);
break; break;
} }
} }
@ -467,7 +469,7 @@ async function run() {
} }
} }
catch (error) { catch (error) {
core.setFailed(error.message); core.setFailed(error);
} }
} }
exports.run = run; exports.run = run;
@ -520,8 +522,8 @@ async function getCommand(os_version, suffix) {
exports.getCommand = getCommand; exports.getCommand = getCommand;
async function getToolVersion(version) { async function getToolVersion(version) {
const semver_regex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; const semver_regex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/; const composer_regex = /^stable$|^preview$|^snapshot$|^[1|2]$/;
version = version.replace(/[><=^]*/, ''); version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1');
switch (true) { switch (true) {
case composer_regex.test(version): case composer_regex.test(version):
case semver_regex.test(version): case semver_regex.test(version):
@ -570,6 +572,9 @@ async function addPhive(version, php_version, os_version) {
case /7\.1/.test(php_version): case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5'); version = version.replace('latest', '0.13.5');
break; break;
case /7\.2/.test(php_version):
version = version.replace('latest', '0.14.5');
break;
} }
switch (version) { switch (version) {
case 'latest': case 'latest':
@ -820,13 +825,14 @@ const https = __importStar(__nccwpck_require__(211));
const path = __importStar(__nccwpck_require__(622)); const path = __importStar(__nccwpck_require__(622));
const core = __importStar(__nccwpck_require__(186)); const core = __importStar(__nccwpck_require__(186));
async function readEnv(property) { async function readEnv(property) {
const value = process.env[property]; const property_lc = property.toLowerCase();
switch (value) { const property_uc = property.toUpperCase();
case undefined: return (process.env[property] ||
return ''; process.env[property_lc] ||
default: process.env[property_uc] ||
return value; process.env[property_lc.replace('_', '-')] ||
} process.env[property_uc.replace('_', '-')] ||
'');
} }
exports.readEnv = readEnv; exports.readEnv = readEnv;
async function getInput(name, mandatory) { async function getInput(name, mandatory) {
@ -1132,7 +1138,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}); });
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;
const command_1 = __nccwpck_require__(241); const command_1 = __nccwpck_require__(241);
const file_command_1 = __nccwpck_require__(717); const file_command_1 = __nccwpck_require__(717);
const utils_1 = __nccwpck_require__(278); const utils_1 = __nccwpck_require__(278);
@ -1218,6 +1224,21 @@ function getInput(name, options) {
return val.trim(); return val.trim();
} }
exports.getInput = getInput; exports.getInput = getInput;
/**
* Gets the values of an multiline input. Each value is also trimmed.
*
* @param name name of the input to get
* @param options optional. See InputOptions.
* @returns string[]
*
*/
function getMultilineInput(name, options) {
const inputs = getInput(name, options)
.split('\n')
.filter(x => x !== '');
return inputs;
}
exports.getMultilineInput = getMultilineInput;
/** /**
* Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification.
* Support boolean input list: `true | True | TRUE | false | False | FALSE` . * Support boolean input list: `true | True | TRUE | false | False | FALSE` .
@ -1295,19 +1316,30 @@ exports.debug = debug;
/** /**
* Adds an error issue * Adds an error issue
* @param message error issue message. Errors will be converted to string via toString() * @param message error issue message. Errors will be converted to string via toString()
* @param properties optional properties to add to the annotation.
*/ */
function error(message) { function error(message, properties = {}) {
command_1.issue('error', message instanceof Error ? message.toString() : message); command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
} }
exports.error = error; exports.error = error;
/** /**
* Adds an warning issue * Adds a warning issue
* @param message warning issue message. Errors will be converted to string via toString() * @param message warning issue message. Errors will be converted to string via toString()
* @param properties optional properties to add to the annotation.
*/ */
function warning(message) { function warning(message, properties = {}) {
command_1.issue('warning', message instanceof Error ? message.toString() : message); command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
} }
exports.warning = warning; exports.warning = warning;
/**
* Adds a notice issue
* @param message notice issue message. Errors will be converted to string via toString()
* @param properties optional properties to add to the annotation.
*/
function notice(message, properties = {}) {
command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
}
exports.notice = notice;
/** /**
* Writes info to log with console.log. * Writes info to log with console.log.
* @param message info message * @param message info message
@ -1439,7 +1471,7 @@ exports.issueCommand = issueCommand;
// We use any as a valid input type // We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.toCommandValue = void 0; exports.toCommandProperties = exports.toCommandValue = void 0;
/** /**
* Sanitizes an input into a string so it can be passed into issueCommand safely * Sanitizes an input into a string so it can be passed into issueCommand safely
* @param input input to sanitize into a string * @param input input to sanitize into a string
@ -1454,6 +1486,25 @@ function toCommandValue(input) {
return JSON.stringify(input); return JSON.stringify(input);
} }
exports.toCommandValue = toCommandValue; exports.toCommandValue = toCommandValue;
/**
*
* @param annotationProperties
* @returns The command properties to send with the actual annotation command
* See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
*/
function toCommandProperties(annotationProperties) {
if (!Object.keys(annotationProperties).length) {
return {};
}
return {
title: annotationProperties.title,
line: annotationProperties.startLine,
endLine: annotationProperties.endLine,
col: annotationProperties.startColumn,
endColumn: annotationProperties.endColumn
};
}
exports.toCommandProperties = toCommandProperties;
//# sourceMappingURL=utils.js.map //# sourceMappingURL=utils.js.map
/***/ }), /***/ }),
@ -1462,6 +1513,25 @@ exports.toCommandValue = toCommandValue;
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
@ -1471,14 +1541,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getExecOutput = exports.exec = void 0;
const string_decoder_1 = __nccwpck_require__(304);
const tr = __importStar(__nccwpck_require__(159)); const tr = __importStar(__nccwpck_require__(159));
/** /**
* Exec a command. * Exec a command.
@ -1504,6 +1569,51 @@ function exec(commandLine, args, options) {
}); });
} }
exports.exec = exec; exports.exec = exec;
/**
* Exec a command and get the output.
* Output will be streamed to the live console.
* Returns promise with the exit code and collected stdout and stderr
*
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
* @param args optional arguments for tool. Escaping is handled by the lib.
* @param options optional exec options. See ExecOptions
* @returns Promise<ExecOutput> exit code, stdout, and stderr
*/
function getExecOutput(commandLine, args, options) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
let stdout = '';
let stderr = '';
//Using string decoder covers the case where a mult-byte character is split
const stdoutDecoder = new string_decoder_1.StringDecoder('utf8');
const stderrDecoder = new string_decoder_1.StringDecoder('utf8');
const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout;
const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr;
const stdErrListener = (data) => {
stderr += stderrDecoder.write(data);
if (originalStdErrListener) {
originalStdErrListener(data);
}
};
const stdOutListener = (data) => {
stdout += stdoutDecoder.write(data);
if (originalStdoutListener) {
originalStdoutListener(data);
}
};
const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener });
const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners }));
//flush any remaining characters
stdout += stdoutDecoder.end();
stderr += stderrDecoder.end();
return {
exitCode,
stdout,
stderr
};
});
}
exports.getExecOutput = getExecOutput;
//# sourceMappingURL=exec.js.map //# sourceMappingURL=exec.js.map
/***/ }), /***/ }),
@ -1512,6 +1622,25 @@ exports.exec = exec;
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
@ -1521,20 +1650,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.argStringToArray = exports.ToolRunner = void 0;
const os = __importStar(__nccwpck_require__(87)); const os = __importStar(__nccwpck_require__(87));
const events = __importStar(__nccwpck_require__(614)); const events = __importStar(__nccwpck_require__(614));
const child = __importStar(__nccwpck_require__(129)); const child = __importStar(__nccwpck_require__(129));
const path = __importStar(__nccwpck_require__(622)); const path = __importStar(__nccwpck_require__(622));
const io = __importStar(__nccwpck_require__(351)); const io = __importStar(__nccwpck_require__(351));
const ioUtil = __importStar(__nccwpck_require__(962)); const ioUtil = __importStar(__nccwpck_require__(962));
const timers_1 = __nccwpck_require__(213);
/* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable @typescript-eslint/unbound-method */
const IS_WINDOWS = process.platform === 'win32'; const IS_WINDOWS = process.platform === 'win32';
/* /*
@ -1604,11 +1728,12 @@ class ToolRunner extends events.EventEmitter {
s = s.substring(n + os.EOL.length); s = s.substring(n + os.EOL.length);
n = s.indexOf(os.EOL); n = s.indexOf(os.EOL);
} }
strBuffer = s; return s;
} }
catch (err) { catch (err) {
// streaming lines to console is best effort. Don't fail a build. // streaming lines to console is best effort. Don't fail a build.
this._debug(`error processing line. Failed with error ${err}`); this._debug(`error processing line. Failed with error ${err}`);
return '';
} }
} }
_getSpawnFileName() { _getSpawnFileName() {
@ -1890,7 +2015,7 @@ class ToolRunner extends events.EventEmitter {
// if the tool is only a file name, then resolve it from the PATH // if the tool is only a file name, then resolve it from the PATH
// otherwise verify it exists (add extension on Windows if necessary) // otherwise verify it exists (add extension on Windows if necessary)
this.toolPath = yield io.which(this.toolPath, true); this.toolPath = yield io.which(this.toolPath, true);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
this._debug(`exec tool: ${this.toolPath}`); this._debug(`exec tool: ${this.toolPath}`);
this._debug('arguments:'); this._debug('arguments:');
for (const arg of this.args) { for (const arg of this.args) {
@ -1904,9 +2029,12 @@ class ToolRunner extends events.EventEmitter {
state.on('debug', (message) => { state.on('debug', (message) => {
this._debug(message); this._debug(message);
}); });
if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) {
return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`));
}
const fileName = this._getSpawnFileName(); const fileName = this._getSpawnFileName();
const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));
const stdbuffer = ''; let stdbuffer = '';
if (cp.stdout) { if (cp.stdout) {
cp.stdout.on('data', (data) => { cp.stdout.on('data', (data) => {
if (this.options.listeners && this.options.listeners.stdout) { if (this.options.listeners && this.options.listeners.stdout) {
@ -1915,14 +2043,14 @@ class ToolRunner extends events.EventEmitter {
if (!optionsNonNull.silent && optionsNonNull.outStream) { if (!optionsNonNull.silent && optionsNonNull.outStream) {
optionsNonNull.outStream.write(data); optionsNonNull.outStream.write(data);
} }
this._processLineBuffer(data, stdbuffer, (line) => { stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => {
if (this.options.listeners && this.options.listeners.stdline) { if (this.options.listeners && this.options.listeners.stdline) {
this.options.listeners.stdline(line); this.options.listeners.stdline(line);
} }
}); });
}); });
} }
const errbuffer = ''; let errbuffer = '';
if (cp.stderr) { if (cp.stderr) {
cp.stderr.on('data', (data) => { cp.stderr.on('data', (data) => {
state.processStderr = true; state.processStderr = true;
@ -1937,7 +2065,7 @@ class ToolRunner extends events.EventEmitter {
: optionsNonNull.outStream; : optionsNonNull.outStream;
s.write(data); s.write(data);
} }
this._processLineBuffer(data, errbuffer, (line) => { errbuffer = this._processLineBuffer(data, errbuffer, (line) => {
if (this.options.listeners && this.options.listeners.errline) { if (this.options.listeners && this.options.listeners.errline) {
this.options.listeners.errline(line); this.options.listeners.errline(line);
} }
@ -1984,7 +2112,7 @@ class ToolRunner extends events.EventEmitter {
} }
cp.stdin.end(this.options.input); cp.stdin.end(this.options.input);
} }
}); }));
}); });
} }
} }
@ -2070,7 +2198,7 @@ class ExecState extends events.EventEmitter {
this._setResult(); this._setResult();
} }
else if (this.processExited) { else if (this.processExited) {
this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this);
} }
} }
_debug(message) { _debug(message) {
@ -2118,6 +2246,25 @@ class ExecState extends events.EventEmitter {
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
@ -2127,16 +2274,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var _a; var _a;
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
const assert_1 = __nccwpck_require__(357); exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rename = exports.readlink = exports.readdir = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0;
const fs = __importStar(__nccwpck_require__(747)); const fs = __importStar(__nccwpck_require__(747));
const path = __importStar(__nccwpck_require__(622)); const path = __importStar(__nccwpck_require__(622));
_a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; _a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;
@ -2179,49 +2319,6 @@ function isRooted(p) {
return p.startsWith('/'); return p.startsWith('/');
} }
exports.isRooted = isRooted; exports.isRooted = isRooted;
/**
* Recursively create a directory at `fsPath`.
*
* This implementation is optimistic, meaning it attempts to create the full
* path first, and backs up the path stack from there.
*
* @param fsPath The path to create
* @param maxDepth The maximum recursion depth
* @param depth The current recursion depth
*/
function mkdirP(fsPath, maxDepth = 1000, depth = 1) {
return __awaiter(this, void 0, void 0, function* () {
assert_1.ok(fsPath, 'a path argument must be provided');
fsPath = path.resolve(fsPath);
if (depth >= maxDepth)
return exports.mkdir(fsPath);
try {
yield exports.mkdir(fsPath);
return;
}
catch (err) {
switch (err.code) {
case 'ENOENT': {
yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);
yield exports.mkdir(fsPath);
return;
}
default: {
let stats;
try {
stats = yield exports.stat(fsPath);
}
catch (err2) {
throw err;
}
if (!stats.isDirectory())
throw err;
}
}
}
});
}
exports.mkdirP = mkdirP;
/** /**
* Best effort attempt to determine whether a file exists and is executable. * Best effort attempt to determine whether a file exists and is executable.
* @param filePath file path to check * @param filePath file path to check
@ -2318,6 +2415,12 @@ function isUnixExecutable(stats) {
((stats.mode & 8) > 0 && stats.gid === process.getgid()) || ((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
((stats.mode & 64) > 0 && stats.uid === process.getuid())); ((stats.mode & 64) > 0 && stats.uid === process.getuid()));
} }
// Get the path of cmd.exe in windows
function getCmdPath() {
var _a;
return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`;
}
exports.getCmdPath = getCmdPath;
//# sourceMappingURL=io-util.js.map //# sourceMappingURL=io-util.js.map
/***/ }), /***/ }),
@ -2326,6 +2429,25 @@ function isUnixExecutable(stats) {
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
@ -2335,19 +2457,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = void 0;
const assert_1 = __nccwpck_require__(357);
const childProcess = __importStar(__nccwpck_require__(129)); const childProcess = __importStar(__nccwpck_require__(129));
const path = __importStar(__nccwpck_require__(622)); const path = __importStar(__nccwpck_require__(622));
const util_1 = __nccwpck_require__(669); const util_1 = __nccwpck_require__(669);
const ioUtil = __importStar(__nccwpck_require__(962)); const ioUtil = __importStar(__nccwpck_require__(962));
const exec = util_1.promisify(childProcess.exec); const exec = util_1.promisify(childProcess.exec);
const execFile = util_1.promisify(childProcess.execFile);
/** /**
* Copies a file or folder. * Copies a file or folder.
* Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
@ -2358,14 +2476,14 @@ const exec = util_1.promisify(childProcess.exec);
*/ */
function cp(source, dest, options = {}) { function cp(source, dest, options = {}) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const { force, recursive } = readCopyOptions(options); const { force, recursive, copySourceDirectory } = readCopyOptions(options);
const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;
// Dest is an existing file, but not forcing // Dest is an existing file, but not forcing
if (destStat && destStat.isFile() && !force) { if (destStat && destStat.isFile() && !force) {
return; return;
} }
// If dest is an existing directory, should copy inside. // If dest is an existing directory, should copy inside.
const newDest = destStat && destStat.isDirectory() const newDest = destStat && destStat.isDirectory() && copySourceDirectory
? path.join(dest, path.basename(source)) ? path.join(dest, path.basename(source))
: dest; : dest;
if (!(yield ioUtil.exists(source))) { if (!(yield ioUtil.exists(source))) {
@ -2430,12 +2548,22 @@ function rmRF(inputPath) {
if (ioUtil.IS_WINDOWS) { if (ioUtil.IS_WINDOWS) {
// Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
// program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del. // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
// Check for invalid characters
// https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
if (/[*"<>|]/.test(inputPath)) {
throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows');
}
try { try {
const cmdPath = ioUtil.getCmdPath();
if (yield ioUtil.isDirectory(inputPath, true)) { if (yield ioUtil.isDirectory(inputPath, true)) {
yield exec(`rd /s /q "${inputPath}"`); yield exec(`${cmdPath} /s /c "rd /s /q "%inputPath%""`, {
env: { inputPath }
});
} }
else { else {
yield exec(`del /f /a "${inputPath}"`); yield exec(`${cmdPath} /s /c "del /f /a "%inputPath%""`, {
env: { inputPath }
});
} }
} }
catch (err) { catch (err) {
@ -2468,7 +2596,7 @@ function rmRF(inputPath) {
return; return;
} }
if (isDir) { if (isDir) {
yield exec(`rm -rf "${inputPath}"`); yield execFile(`rm`, [`-rf`, `${inputPath}`]);
} }
else { else {
yield ioUtil.unlink(inputPath); yield ioUtil.unlink(inputPath);
@ -2486,7 +2614,8 @@ exports.rmRF = rmRF;
*/ */
function mkdirP(fsPath) { function mkdirP(fsPath) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
yield ioUtil.mkdirP(fsPath); assert_1.ok(fsPath, 'a path argument must be provided');
yield ioUtil.mkdir(fsPath, { recursive: true });
}); });
} }
exports.mkdirP = mkdirP; exports.mkdirP = mkdirP;
@ -2584,7 +2713,10 @@ exports.findInPath = findInPath;
function readCopyOptions(options) { function readCopyOptions(options) {
const force = options.force == null ? true : options.force; const force = options.force == null ? true : options.force;
const recursive = Boolean(options.recursive); const recursive = Boolean(options.recursive);
return { force, recursive }; const copySourceDirectory = options.copySourceDirectory == null
? true
: Boolean(options.copySourceDirectory);
return { force, recursive, copySourceDirectory };
} }
function cpDirRecursive(sourceDir, destDir, currentDepth, force) { function cpDirRecursive(sourceDir, destDir, currentDepth, force) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
@ -2643,56 +2775,70 @@ function copyFile(srcFile, destFile, force) {
/***/ 357: /***/ 357:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("assert");; module.exports = require("assert");
/***/ }), /***/ }),
/***/ 129: /***/ 129:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("child_process");; module.exports = require("child_process");
/***/ }), /***/ }),
/***/ 614: /***/ 614:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("events");; module.exports = require("events");
/***/ }), /***/ }),
/***/ 747: /***/ 747:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("fs");; module.exports = require("fs");
/***/ }), /***/ }),
/***/ 211: /***/ 211:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("https");; module.exports = require("https");
/***/ }), /***/ }),
/***/ 87: /***/ 87:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("os");; module.exports = require("os");
/***/ }), /***/ }),
/***/ 622: /***/ 622:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("path");; module.exports = require("path");
/***/ }),
/***/ 304:
/***/ ((module) => {
module.exports = require("string_decoder");
/***/ }),
/***/ 213:
/***/ ((module) => {
module.exports = require("timers");
/***/ }), /***/ }),
/***/ 669: /***/ 669:
/***/ ((module) => { /***/ ((module) => {
module.exports = require("util");; module.exports = require("util");
/***/ }) /***/ })
@ -2731,7 +2877,9 @@ module.exports = require("util");;
/************************************************************************/ /************************************************************************/
/******/ /* webpack/runtime/compat */ /******/ /* webpack/runtime/compat */
/******/ /******/
/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";
/******/
/************************************************************************/
/******/ /******/
/******/ // startup /******/ // startup
/******/ // Load entry module and return exports /******/ // Load entry module and return exports

4791
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,24 @@
{ {
"name": "setup-php", "name": "setup-php",
"version": "1.11.1", "version": "1.11.5",
"private": false, "private": false,
"description": "Setup PHP for use with GitHub Actions", "description": "Setup PHP for use with GitHub Actions",
"main": "lib/install.js", "main": "lib/install.js",
"types": "lib/install.d.ts",
"directories": {
"lib": "lib",
"test": "__tests__",
"src": "src"
},
"files": [
"lib",
"src"
],
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"lint": "eslint **/*.ts --cache --fix", "lint": "eslint **/src/*.ts --cache --fix",
"format": "prettier --write **/*.ts && git add .", "format": "prettier --write **/src/*.ts && git add .",
"format-check": "prettier --check **/*.ts", "format-check": "prettier --check **/src/*.ts",
"release": "ncc build -o dist && git add -f dist/", "release": "ncc build -o dist && git add -f dist/",
"test": "jest" "test": "jest"
}, },
@ -24,33 +34,33 @@
"author": "shivammathur", "author": "shivammathur",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.3.0", "@actions/core": "^1.5.0",
"@actions/exec": "^1.0.4", "@actions/exec": "^1.1.0",
"@actions/io": "^1.1.0", "@actions/io": "^1.1.1",
"fs": "0.0.1-security" "fs": "0.0.1-security"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^26.0.23", "@types/jest": "^27.0.2",
"@types/node": "^15.6.1", "@types/node": "^16.10.1",
"@typescript-eslint/eslint-plugin": "^4.25.0", "@typescript-eslint/eslint-plugin": "^4.32.0",
"@typescript-eslint/parser": "^4.25.0", "@typescript-eslint/parser": "^4.32.0",
"@vercel/ncc": "^0.28.6", "@vercel/ncc": "^0.31.1",
"eslint": "^7.27.0", "eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.24.2",
"eslint-plugin-jest": "^24.3.6", "eslint-plugin-jest": "^24.4.2",
"eslint-plugin-prettier": "^3.4.0", "eslint-plugin-prettier": "^4.0.0",
"husky": "^4.3.8", "jest": "^27.2.2",
"jest": "^27.0.3", "jest-circus": "^27.2.2",
"jest-circus": "^27.0.3", "prettier": "^2.4.1",
"prettier": "^2.3.0", "simple-git-hooks": "^2.6.1",
"ts-jest": "^27.0.1", "ts-jest": "^27.0.5",
"typescript": "^4.3.2" "typescript": "^4.4.3"
}, },
"husky": { "bugs": {
"skipCI": true, "url": "https://github.com/shivammathur/setup-php/issues"
"hooks": { },
"simple-git-hooks": {
"pre-commit": "npm run format && npm run lint && npm run test && npm run build && npm run release" "pre-commit": "npm run format && npm run lint && npm run test && npm run build && npm run release"
} }
}
} }

View File

@ -0,0 +1,28 @@
amqp=amqp
apcu=apcu
expect=expect
grpc=grpc
igbinary=igbinary
imagick=imagick
imap=imap
memcache=memcache
memcached=memcached
mongodb=mongodb
msgpack=msgpack
pcov=pcov
pecl_http=http
phalcon3=phalcon
phalcon4=phalcon
propro=propro
protobuf=protobuf
psr=psr
raphf=raphf
rdkafka=rdkafka
redis=redis
ssh2=ssh2
swoole=swoole
vips=vips
xdebug=xdebug
xdebug2=xdebug
yaml=yaml
zmq=zmq

View File

@ -30,15 +30,17 @@ export async function addExtensionDarwin(
' ' + ' ' +
ext_prefix; ext_prefix;
return; return;
// match 5.6 to 8.0 amqp, grpc, igbinary, imagick, imap, msgpack, pecl_http, propro, protobuf, raphf, redis, swoole, xdebug, xdebug2, zmq // match 5.6 to 8.0 amqp, expect, grpc, igbinary, imagick, imap, mongodb, msgpack, pecl_http, propro, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq
// match 7.1pcov to 8.0pcov // match 7.1pcov to 8.0pcov
case /(5\.6|7\.[0-4]|8.0)(amqp|grpc|igbinary|imagick|imap|msgpack|^(pecl_)?http$|propro|protobuf|psr|raphf|redis|swoole|xdebug|xdebug2|zmq)/.test( // match 7.0vips to 8.0vips
case /(5\.6|7\.[0-4]|8.0)(amqp|expect|grpc|igbinary|imagick|imap|mongodb|msgpack|^(pecl_)?http$|propro|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test(
version_extension version_extension
): ):
case /(7\.[1-4]|8\.0])pcov/.test(version_extension): case /(7\.[1-4]|8\.0])pcov/.test(version_extension):
case /^(5\.6|7\.[0-3])phalcon3$|^7\.[2-4]phalcon4$/.test( case /^(5\.6|7\.[0-3])phalcon3$|^7\.[2-4]phalcon4$/.test(
version_extension version_extension
): ):
case /(7\.[0-4]|8\.0])vips/.test(version_extension):
command = 'add_brew_extension ' + extension_name.replace('pecl_', ''); command = 'add_brew_extension ' + extension_name.replace('pecl_', '');
break; break;
// match sqlite // match sqlite

View File

@ -55,23 +55,24 @@ export async function build(
*/ */
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
if ((await utils.readEnv('ImageOS')) == 'ubuntu16') {
core.setFailed(
'setup-php is not supported on Ubuntu 16.04. Please upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452'
);
return;
}
core.warning( core.warning(
'setup-php v1 is deprecated.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2' 'setup-php v1 is deprecated.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2'
); );
const version: string = await utils.parseVersion( const version: string = await utils.parseVersion(
await utils.getInput('php-version', true) await utils.getInput('php-version', true)
); );
if (version == '8.1') { if (parseFloat(version) < 5.6 || parseFloat(version) > 8.0) {
core.setFailed( core.setFailed(
'PHP 8.1 is not supported on setup-php v1.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2' `setup-php v1 supports only PHP 5.6 to 8.0.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2`
); );
return; return;
} }
if ((await utils.readEnv('ImageOS')) == 'ubuntu16') {
core.warning(
'Ubuntu 16.04 is deprecated.\nPlease upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452'
);
}
if (version) { if (version) {
const os_version: string = process.platform; const os_version: string = process.platform;
// check the os version and run the respective script // check the os version and run the respective script
@ -91,7 +92,7 @@ export async function run(): Promise<void> {
core.setFailed('Unable to get the PHP version'); core.setFailed('Unable to get the PHP version');
} }
} catch (error) { } catch (error) {
core.setFailed(error.message); core.setFailed(error as Error);
} }
} }

View File

@ -18,7 +18,7 @@ add_log() {
# Function to remove extensions # Function to remove extensions
remove_extension() { remove_extension() {
extension=$1 local extension=$1
sudo sed -Ei '' "/=(.*\/)?\"?$extension/d" "$ini_file" sudo sed -Ei '' "/=(.*\/)?\"?$extension/d" "$ini_file"
sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1 sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
@ -26,7 +26,7 @@ remove_extension() {
# Function to test if extension is loaded # Function to test if extension is loaded
check_extension() { check_extension() {
extension=$1 local extension=$1
if [ "$extension" != "mysql" ]; then if [ "$extension" != "mysql" ]; then
php -m | grep -i -q -w "$extension" php -m | grep -i -q -w "$extension"
else else
@ -42,7 +42,7 @@ pecl_install() {
# Function to get the PECL version # Function to get the PECL version
get_pecl_version() { get_pecl_version() {
extension=$1 local extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")" stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")"
pecl_rest='https://pecl.php.net/rest/r/' pecl_rest='https://pecl.php.net/rest/r/'
response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml) response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
@ -55,7 +55,7 @@ get_pecl_version() {
# Function to install a PECL version # Function to install a PECL version
add_pecl_extension() { add_pecl_extension() {
extension=$1 local extension=$1
pecl_version=$2 pecl_version=$2
prefix=$3 prefix=$3
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
@ -95,7 +95,7 @@ add_brew_tap() {
if ! [ -d "$tap_dir/$tap" ]; then if ! [ -d "$tap_dir/$tap" ]; then
fetch_brew_tap "$tap" >/dev/null 2>&1 fetch_brew_tap "$tap" >/dev/null 2>&1
if ! [ -d "$tap_dir/$tap" ]; then if ! [ -d "$tap_dir/$tap" ]; then
brew tap --shallow "$tap" >/dev/null 2>&1 brew tap "$tap" >/dev/null 2>&1
fi fi
fi fi
} }
@ -103,7 +103,8 @@ add_brew_tap() {
# Function to install a php extension from shivammathur/extensions tap. # Function to install a php extension from shivammathur/extensions tap.
add_brew_extension() { add_brew_extension() {
formula=$1 formula=$1
extension=${formula//[0-9]/} extension=$(grep "$formula=" "$dist"/../src/configs/brew_extensions | cut -d '=' -f 2)
[[ -z "$extension" ]] && extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")"
add_brew_tap shivammathur/homebrew-php add_brew_tap shivammathur/homebrew-php
add_brew_tap shivammathur/homebrew-extensions add_brew_tap shivammathur/homebrew-extensions
sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
@ -113,7 +114,7 @@ add_brew_extension() {
# Function to setup extensions # Function to setup extensions
add_extension() { add_extension() {
extension=$1 local extension=$1
install_command=$2 install_command=$2
prefix=$3 prefix=$3
if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
@ -131,7 +132,7 @@ add_extension() {
# Function to pre-release extensions using PECL # Function to pre-release extensions using PECL
add_unstable_extension() { add_unstable_extension() {
extension=$1 local extension=$1
stability=$2 stability=$2
prefix=$3 prefix=$3
pecl_version=$(get_pecl_version "$extension" "$stability") pecl_version=$(get_pecl_version "$extension" "$stability")
@ -147,9 +148,14 @@ configure_composer() {
add_log "$cross" "composer" "Could not download composer" add_log "$cross" "composer" "Could not download composer"
exit 1; exit 1;
fi fi
if ! [ -d "$composer_home" ]; then
sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home"
else
sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home"
fi
if ! [ -e "$composer_json" ]; then if ! [ -e "$composer_json" ]; then
echo '{}' | tee "$composer_json" >/dev/null 2>&1 echo '{}' | tee "$composer_json" >/dev/null
sudo chmod 644 "$composer_json" chmod 644 "$composer_json"
fi fi
composer -q config -g process-timeout 0 composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH" echo "$composer_bin" >> "$GITHUB_PATH"
@ -297,14 +303,16 @@ version=$1
dist=$2 dist=$2
tool_path_dir="/usr/local/bin" tool_path_dir="/usr/local/bin"
curl_opts=(-sL) curl_opts=(-sL)
composer_bin="$HOME/.composer/vendor/bin" composer_home="$HOME/.composer"
composer_json="$HOME/.composer/composer.json" composer_bin="$composer_home/vendor/bin"
composer_lock="$HOME/.composer/composer.lock" composer_json="$composer_home/composer.json"
composer_lock="$composer_home/composer.lock"
brew_prefix="$(brew --prefix)" brew_prefix="$(brew --prefix)"
brew_repo="$(brew --repository)" brew_repo="$(brew --repository)"
tap_dir="$brew_repo"/Library/Taps tap_dir="$brew_repo"/Library/Taps
existing_version=$(get_brewed_php) existing_version=$(get_brewed_php)
export HOMEBREW_CHANGE_ARCH_TO_ARM=1 export HOMEBREW_CHANGE_ARCH_TO_ARM=1
export HOMEBREW_DEVELOPER=1
export HOMEBREW_NO_INSTALL_CLEANUP=1 export HOMEBREW_NO_INSTALL_CLEANUP=1
export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1

View File

@ -20,7 +20,7 @@ update_ppa() {
# Function to install phalcon # Function to install phalcon
install_phalcon() { install_phalcon() {
extension=$1 local extension=$1
version=$2 version=$2
(update_ppa && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "php$version-psr" "php$version-$extension" >/dev/null 2>&1 && add_log "$tick" "$extension" "Installed and enabled") || (update_ppa && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "php$version-psr" "php$version-$extension" >/dev/null 2>&1 && add_log "$tick" "$extension" "Installed and enabled") ||
add_log "$cross" "$extension" "Could not install $extension on PHP $semver" add_log "$cross" "$extension" "Could not install $extension on PHP $semver"

View File

@ -30,18 +30,10 @@ cleanup_lists() {
# Function to add ppa:ondrej/php. # Function to add ppa:ondrej/php.
add_ppa() { add_ppa() {
ppa=${1:-ondrej/php} ppa=${1:-ondrej/php}
if [ "$DISTRIB_RELEASE" = "16.04" ] && [ "$ppa" = "ondrej/php" ]; then if ! apt-cache policy | grep -q "$ppa"; then
LC_ALL=C.UTF-8 sudo apt-add-repository --remove ppa:"$ppa" -y || true
LC_ALL=C.UTF-8 sudo apt-add-repository http://setup-php.com/ondrej/php/ubuntu -y
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 4f4ea0aae5267a6c
elif ! apt-cache policy | grep -q "$ppa"; then
cleanup_lists "$(dirname "$ppa")" cleanup_lists "$(dirname "$ppa")"
LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y
fi fi
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
sudo "$debconf_fix" apt-get update
fi
} }
# Function to update the package lists. # Function to update the package lists.
@ -70,7 +62,7 @@ configure_pecl() {
# Function to get the PECL version # Function to get the PECL version
get_pecl_version() { get_pecl_version() {
extension=$1 local extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")" stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")"
pecl_rest='https://pecl.php.net/rest/r/' pecl_rest='https://pecl.php.net/rest/r/'
response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml) response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
@ -97,7 +89,7 @@ enable_extension() {
# Function to test if extension is loaded # Function to test if extension is loaded
check_extension() { check_extension() {
extension=$1 local extension=$1
if [ "$extension" != "mysql" ]; then if [ "$extension" != "mysql" ]; then
php -m | grep -i -q -w "$extension" php -m | grep -i -q -w "$extension"
else else
@ -107,7 +99,7 @@ check_extension() {
# Function to delete extensions # Function to delete extensions
delete_extension() { delete_extension() {
extension=$1 local extension=$1
sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file" sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file"
sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file" sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file"
sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1 sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
@ -117,7 +109,7 @@ delete_extension() {
# Function to disable and delete extensions # Function to disable and delete extensions
remove_extension() { remove_extension() {
extension=$1 local extension=$1
if [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then if [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
sudo phpdismod -v "$version" "$extension" sudo phpdismod -v "$version" "$extension"
fi fi
@ -126,7 +118,7 @@ remove_extension() {
# Function to setup extensions # Function to setup extensions
add_extension() { add_extension() {
extension=$1 local extension=$1
install_command=$2 install_command=$2
prefix=$3 prefix=$3
enable_extension "$extension" "$prefix" enable_extension "$extension" "$prefix"
@ -143,7 +135,7 @@ add_extension() {
# Function to install a PECL version # Function to install a PECL version
add_pecl_extension() { add_pecl_extension() {
extension=$1 local extension=$1
pecl_version=$2 pecl_version=$2
prefix=$3 prefix=$3
configure_pecl configure_pecl
@ -166,7 +158,7 @@ add_pecl_extension() {
# Function to pre-release extensions using PECL # Function to pre-release extensions using PECL
add_unstable_extension() { add_unstable_extension() {
extension=$1 local extension=$1
stability=$2 stability=$2
prefix=$3 prefix=$3
pecl_version=$(get_pecl_version "$extension" "$stability") pecl_version=$(get_pecl_version "$extension" "$stability")
@ -182,10 +174,14 @@ configure_composer() {
add_log "$cross" "composer" "Could not download composer" add_log "$cross" "composer" "Could not download composer"
exit 1; exit 1;
fi fi
if ! [ -d "$composer_home" ]; then
sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home"
else
sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home"
fi
if ! [ -e "$composer_json" ]; then if ! [ -e "$composer_json" ]; then
sudo mkdir -p "$(dirname "$composer_json")" echo '{}' | tee "$composer_json" >/dev/null
echo '{}' | tee "$composer_json" >/dev/null 2>&1 chmod 644 "$composer_json"
sudo chmod 644 "$composer_json"
fi fi
composer -q config -g process-timeout 0 composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH" echo "$composer_bin" >> "$GITHUB_PATH"
@ -317,12 +313,13 @@ cross="✗"
version=$1 version=$1
dist=$2 dist=$2
debconf_fix="DEBIAN_FRONTEND=noninteractive" debconf_fix="DEBIAN_FRONTEND=noninteractive"
apt_install="sudo $debconf_fix apt-fast install -y" apt_install="sudo $debconf_fix apt-fast install -y --no-install-recommends"
tool_path_dir="/usr/local/bin" tool_path_dir="/usr/local/bin"
curl_opts=(-sL) curl_opts=(-sL)
composer_bin="$HOME/.composer/vendor/bin" composer_home="$HOME/.composer"
composer_json="$HOME/.composer/composer.json" composer_bin="$composer_home/vendor/bin"
composer_lock="$HOME/.composer/composer.lock" composer_json="$composer_home/composer.json"
composer_lock="$composer_home/composer.lock"
existing_version=$(php-config --version 2>/dev/null | cut -c 1-3) existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
# Setup PHP # Setup PHP

View File

@ -46,13 +46,13 @@ Function Add-ToProfile {
Function Add-Printf { Function Add-Printf {
if (-not(Test-Path "C:\Program Files\Git\usr\bin\printf.exe")) { if (-not(Test-Path "C:\Program Files\Git\usr\bin\printf.exe")) {
if(Test-Path "C:\msys64\usr\bin\printf.exe") { if(Test-Path "C:\msys64\usr\bin\printf.exe") {
New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe -Force > $null 2>&1
} else { } else {
Invoke-WebRequest -UseBasicParsing -Uri "$github/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$php_dir\printf.zip" Invoke-WebRequest -UseBasicParsing -Uri "$github/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$php_dir\printf.zip"
Expand-Archive -Path $php_dir\printf.zip -DestinationPath $php_dir -Force Expand-Archive -Path $php_dir\printf.zip -DestinationPath $php_dir -Force
} }
} else { } else {
New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe" New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe" -Force > $null 2>&1
} }
} }
@ -277,7 +277,6 @@ $github = 'https://github.com'
$composer_bin = "$env:APPDATA\Composer\vendor\bin" $composer_bin = "$env:APPDATA\Composer\vendor\bin"
$composer_json = "$env:APPDATA\Composer\composer.json" $composer_json = "$env:APPDATA\Composer\composer.json"
$composer_lock = "$env:APPDATA\Composer\composer.lock" $composer_lock = "$env:APPDATA\Composer\composer.lock"
$master_version = '8.0'
$arch = 'x64' $arch = 'x64'
if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') { if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') {
$arch = 'x86' $arch = 'x86'
@ -308,13 +307,7 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1 Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1
} }
try { try {
if ($version -eq $master_version) {
$version = 'master'
Invoke-WebRequest -UseBasicParsing -Uri https://github.com/shivammathur/php-builder-windows/releases/latest/download/Get-Php.ps1 -OutFile $php_dir\Get-Php.ps1 > $null 2>&1
& $php_dir\Get-Php.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1 Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
}
} catch { } } catch { }
} else { } else {
$status = "Found" $status = "Found"
@ -329,5 +322,5 @@ if($installed.MajorMinorVersion -ne $version) {
Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir
Update-PhpCAInfo -Path $php_dir -Source CurrentUser Update-PhpCAInfo -Path $php_dir -Source CurrentUser
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE
New-Item -ItemType Directory -Path $composer_bin -Force 2>&1 | Out-Null New-Item -ItemType Directory -Path $composer_bin -Force > $null 2>&1
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)" Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"

View File

@ -34,8 +34,8 @@ export async function getToolVersion(version: string): Promise<string> {
// semver_regex - https://semver.org/ // semver_regex - https://semver.org/
const semver_regex = const semver_regex =
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/; const composer_regex = /^stable$|^preview$|^snapshot$|^[1|2]$/;
version = version.replace(/[><=^]*/, ''); version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1');
switch (true) { switch (true) {
case composer_regex.test(version): case composer_regex.test(version):
case semver_regex.test(version): case semver_regex.test(version):
@ -119,6 +119,9 @@ export async function addPhive(
case /7\.1/.test(php_version): case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5'); version = version.replace('latest', '0.13.5');
break; break;
case /7\.2/.test(php_version):
version = version.replace('latest', '0.14.5');
break;
} }
switch (version) { switch (version) {
case 'latest': case 'latest':

View File

@ -10,13 +10,16 @@ import * as core from '@actions/core';
* @param property * @param property
*/ */
export async function readEnv(property: string): Promise<string> { export async function readEnv(property: string): Promise<string> {
const value = process.env[property]; const property_lc: string = property.toLowerCase();
switch (value) { const property_uc: string = property.toUpperCase();
case undefined: return (
return ''; process.env[property] ||
default: process.env[property_lc] ||
return value; process.env[property_uc] ||
} process.env[property_lc.replace('_', '-')] ||
process.env[property_uc.replace('_', '-')] ||
''
);
} }
/** /**

View File

@ -1,8 +1,9 @@
{ {
"compilerOptions": { "compilerOptions": {
"declaration": true,
"esModuleInterop": true, "esModuleInterop": true,
"lib": [ "lib": [
"ESNext" "ES2020"
], ],
"module": "commonjs", "module": "commonjs",
"moduleResolution": "node", "moduleResolution": "node",
@ -12,7 +13,7 @@
"rootDir": "./src", "rootDir": "./src",
"sourceMap": true, "sourceMap": true,
"strict": true, "strict": true,
"target": "ESNext" "target": "ES2019"
}, },
"exclude": ["__tests__", "lib", "node_modules"] "exclude": ["__tests__", "lib", "node_modules"]
} }