Compare commits

...

93 Commits

Author SHA1 Message Date
cb746892c2 Use packages from shivammathur/php-ubuntu 2021-03-11 03:44:33 +05:30
8f542eae1a Fix linking old_libraries in macOS 2021-03-08 19:46:30 +05:30
0769672a24 Link libs of updated PHP dependencies on macOS 2021-02-28 19:08:35 +05:30
c20693a6ca Bump version to 1.11.0
Update dependencies

Update prettier plugin in .eslintrc.json
2021-02-22 15:37:37 +05:30
0c0ae39775 Assorted fixes 2021-02-22 15:37:36 +05:30
d27996462b Set up codeception using composer
Add fixes for global composer tools
2021-02-22 12:01:59 +05:30
0a5e543af7 Improve regexes in extensions.ts 2021-02-22 11:49:32 +05:30
0cc14f65a2 Do not quote ini values with error constants 2021-02-22 11:48:35 +05:30
1ecc5fdca3 Fix composer config syntax 2021-02-22 11:48:34 +05:30
5520fdb61a Add support to specify version in \d.x notation 2021-02-22 11:48:28 +05:30
d0f1a91dfd Add support for quoted csv in ini-values 2021-02-22 11:04:31 +05:30
276480411d Change Node.js version in the workflow 2021-02-22 11:02:09 +05:30
827b051fea Sync brew params from v2
Add check for image constants
2021-02-22 10:58:46 +05:30
fdaf1f0003 Sync symfony examples from v2 2021-02-22 10:55:37 +05:30
030f4839d4 Update Pre-installed PHP in README 2021-02-22 10:55:36 +05:30
1bb08cc017 Improve pecl support 2021-02-22 10:55:35 +05:30
678ad243bf Exit on failing to setup PHP 2021-02-22 10:55:29 +05:30
20b87bc786 Fetch homebrew taps manually 2021-02-22 10:33:58 +05:30
288f9953ef Add sponsor logos 2021-02-22 10:30:18 +05:30
77ac7d57f1 Improve support for phive 2021-02-22 10:09:52 +05:30
8983fb3ae2 Remove bintray from win32.ps1 2021-02-22 09:59:07 +05:30
87a933f720 Improve extension support
Add support for xdebug2 coverage
2021-02-22 09:19:08 +05:30
847ea65468 Fix php 8 on macos 2020-11-28 15:05:48 +05:30
c52ce057af Bump version to 1.10.1 2020-11-26 23:55:29 +05:30
46b357b6c2 Setup Xdebug 2.9.8 on PHP 7.2 2020-11-26 23:50:49 +05:30
2fc508f43d Fix shellcheck warning in add_tool 2020-11-26 11:30:29 +05:30
d8de30560b Fix fetching extension version from PECL on macOS 2020-11-26 11:06:55 +05:30
02db83ef5f Fix deleting extensions 2020-11-26 11:05:02 +05:30
6728eaf2ad Change description in actions.yml 2020-11-26 11:02:13 +05:30
ca291eadaf Sync dependencies from tap in add_brew_extension 2020-11-26 11:00:53 +05:30
8185c8186b Fix tool setup on windows 2020-11-26 07:32:04 +05:30
44cf056ba8 Bump version to 1.10.0 2020-11-16 03:26:49 +05:30
9bfde13f48 Update README 2020-11-16 03:26:46 +05:30
e38eccad04 Fetch release with tool when latest one does not 2020-11-16 03:01:31 +05:30
fa211a9d07 Improve regexes for pre-release extensions 2020-11-16 02:55:14 +05:30
5865982519 Fix contribution docs 2020-11-16 02:46:39 +05:30
e201830bdd Refactor composer setup 2020-11-16 02:43:59 +05:30
5c4074b01a Adjust filtered composer version 2020-11-16 02:40:00 +05:30
48f537d6d0 Allow installing a specific Composer version 2020-11-16 02:37:19 +05:30
bc40a61480 Install VcRedist from GitHub 2020-11-16 02:32:09 +05:30
3d5fae7917 Use PECL directly for nightly versions 2020-11-16 02:23:20 +05:30
d0591e6d7c Fix composer version for prestissimo & composer-prefetcher to v1 2020-11-16 02:20:15 +05:30
b108a66489 Fix version change if composer is a dependency 2020-11-16 02:09:15 +05:30
f0a05b4f6e Revert "Switch to apt-get"
This reverts commit 1d1c0f2595.
2020-11-16 01:56:09 +05:30
5070ebd871 Revert "Remove dashes from step ids"
This reverts commit b9ef39c812.
2020-11-16 01:55:15 +05:30
bea4065e11 Update dependencies as per runner on macOS 2020-10-23 07:17:55 +05:30
c3875408ad Bump version to 1.9.8 2020-10-19 15:14:40 +05:30
1d1c0f2595 Switch to apt-get 2020-10-19 15:14:39 +05:30
1ac189066e Add warnings to v1 2020-10-19 15:14:32 +05:30
74cdfb97c1 Add support for imagick and igbinary on macOS using shivammathur/homebrew-extensions 2020-10-19 15:05:09 +05:30
ee05ca54f6 Fix matchers setup when action is called twice 2020-10-19 14:58:36 +05:30
12b1061a6b Perform only one URL call to download latest PhpManager.zip asset 2020-10-19 14:58:24 +05:30
1c6058bc18 Update Node.js dependencies 2020-10-15 14:26:38 +05:30
2f8045c593 Minor fixes in scripts 2020-10-15 14:26:37 +05:30
6597a6a15b Fix dependency mess in phalcon4 setup on ubuntu 2020-10-15 14:26:36 +05:30
1cc85eb670 Bump version to 1.9.7 2020-10-15 14:26:36 +05:30
6cba0a914f Move matchers setup to scripts 2020-10-15 14:26:35 +05:30
c43f842cf3 Prioritize with over env for inputs 2020-10-15 14:26:34 +05:30
11e062bf23 Switch to environment files. Apply GHSA-mfwh-5m23-j46w (CVE-2020-15228) 2020-10-15 14:26:34 +05:30
dee3cfee50 Improve problem matchers section in README 2020-10-15 14:26:33 +05:30
26b0fcc6cd Bump version to 1.9.6 2020-10-15 14:26:32 +05:30
ab62fff526 Make sure printf is in PATH in Windows 2020-10-15 14:26:32 +05:30
446bccb14d Download release assets for PowerShell PhpManager
Downloading such assets is preferable since:
- they contain updated metadata (useful for debugging)
- they contain only the production files
- they are pre-built: GitHub doesn't have to create a ZIP from a tag
2020-09-07 02:31:33 +05:30
29d99c6866 Use releases instead of tags to download PowerShell PhpManager
I just started to publish PhpManager to GitHub Releases too
2020-09-07 02:20:16 +05:30
1444e002ab Replace fedora with valid platform name 2020-09-07 02:16:49 +05:30
03b97e24e9 Remove unnecessary parameter version from addArchive 2020-09-07 02:14:46 +05:30
f7fb800623 Bump version to 1.9.5
Switch to fixed getcomposer.org links

Add composer fallback
2020-08-16 07:26:49 +05:30
5593bd4bd3 Remove old PHPUnit on linux 2020-08-16 02:51:32 +05:30
3160874a27 Bump version to 1.9.4 2020-08-10 16:43:54 +05:30
db0bbd209b Change cURL opts 2020-08-10 16:43:54 +05:30
d920044a54 Limit swoole support to PHP 7.4 2020-08-10 16:43:53 +05:30
818ca89f55 Accept PECL default parameters 2020-08-10 16:43:47 +05:30
8876ac788f Use shivammathur/php-builder-windows for PHP 8 on Windows 2020-08-03 14:18:17 +05:30
0390a48770 Remove obsolete pcov.sh 2020-08-03 14:09:32 +05:30
274e348895 Use default packagist mirror for old PHP 2020-08-03 14:06:14 +05:30
37d7b37f43 Remove update_extension from linux.sh 2020-08-03 14:05:42 +05:30
d058d52012 Bump supported version in SECURITY.md 2020-08-03 14:00:18 +05:30
17983e66e5 Bump version to 1.9.3 2020-07-20 20:58:08 +05:30
33a005dd90 Fix logs 2020-07-20 20:58:07 +05:30
1870ffc08c Fix Typo 2020-07-20 17:32:29 +05:30
70fd71ab48 Set memory_limit=-1 on Windows and macOS 2020-07-20 17:28:41 +05:30
2f1900f7bc Fix support for pre-release extensions 2020-07-20 17:25:25 +05:30
19497a0597 Improve updating lists 2020-07-20 17:20:16 +05:30
5b2e081bc0 Install only cli on linux 2020-07-20 17:10:20 +05:30
66fa82fbca Fix coverage 2020-07-20 17:10:19 +05:30
4aa42214b1 Update extensions.test.ts 2020-07-20 17:10:18 +05:30
1e2c96a4b4 Fixed xdebug version for PHP 5.6 and 7.0 2020-07-20 17:10:17 +05:30
3e8d887b0d Set ini values after coverage setup 2020-07-20 17:10:16 +05:30
a3d5500a6a Improve composer setup 2020-07-20 17:10:09 +05:30
e763fddf01 Remove update_formulae in darwin.sh 2020-07-07 00:47:45 +05:30
3cd5c7fd3a Bump version to 1.9.2 2020-07-03 17:46:15 +05:30
988cef62da Add ondrej's PPA on focal 2020-07-03 15:18:11 +05:30
be3ee05178 Use shivammathur/extensions tap for grpc, swoole, protobuf on macos 2020-07-03 15:06:42 +05:30
56 changed files with 13128 additions and 5469 deletions

View File

@ -10,7 +10,7 @@
"plugin:import/warnings", "plugin:import/warnings",
"plugin:import/typescript", "plugin:import/typescript",
"plugin:prettier/recommended", "plugin:prettier/recommended",
"prettier/@typescript-eslint" "prettier"
], ],
"plugins": ["@typescript-eslint", "jest"] "plugins": ["@typescript-eslint", "jest"]
} }

View File

@ -17,13 +17,6 @@ Due to time constraints, you may not always get a quick response. Please do not
## Coding Guidelines ## Coding Guidelines
This project comes with `.prettierrc.json` and `eslintrc.json` configuration files. Please run the following commands to format the code before committing it.
```bash
$ npm run format
$ npm run lint
```
## Using setup-php from a Git checkout ## Using setup-php from a Git checkout
The following commands can be used to perform the initial checkout of setup-php: The following commands can be used to perform the initial checkout of setup-php:
@ -40,6 +33,19 @@ Install setup-php dependencies using [npm](https://www.npmjs.com/):
$ npm install $ npm install
``` ```
If you are using `Windows` configure `git` to handle line endings.
```cmd
git config --local core.autocrlf true
```
This project comes with `.prettierrc.json` and `eslintrc.json` configuration files. Please run the following commands to fix and verify the code quality.
```bash
$ npm run format
$ npm run lint
```
## Running the test suite ## Running the test suite
After following the steps shown above, The `setup-php` tests in the `__tests__` directory can be run using this command: After following the steps shown above, The `setup-php` tests in the `__tests__` directory can be run using this command:

5
.github/FUNDING.yml vendored
View File

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

View File

@ -26,7 +26,12 @@ This PR [briefly explain what it does]
- [ ] I have run `npm run format` before the commit. - [ ] I have run `npm run format` before the commit.
- [ ] I have run `npm run lint` before the commit. - [ ] I have run `npm run lint` before the commit.
- [ ] I have run `npm run release` before the commit. - [ ] I have run `npm run release` before the commit.
- [ ] `npm test` returns with no unit test errors. - [ ] `npm test` returns with no unit test errors and all code covered.
> In case this PR edits any scripts:
- [ ] I have checked the edited scripts for syntax.
- [ ] I have tested the changes in an integration test (If yes, provide workflow YAML and link).
<!-- <!--
- Please target the develop branch when submitting the pull request. - Please target the develop branch when submitting the pull request.

8
.github/SECURITY.md vendored
View File

@ -4,10 +4,10 @@
The following versions of this project are supported for security updates. The following versions of this project are supported for security updates.
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | -------- | ------------------ |
| 1.9.x | :white_check_mark: | | 1.10.x | :white_check_mark: |
| 2.3.x | :white_check_mark: | | 2.8.x | :white_check_mark: |
## Supported PHP Versions ## Supported PHP Versions

View File

@ -1,5 +1,6 @@
name: Main workflow name: Main workflow
on: on:
workflow_dispatch:
pull_request: pull_request:
branches: branches:
- releases/v1 - releases/v1
@ -49,6 +50,7 @@ jobs:
php -r "if(phpversion()>=7.1 && ! extension_loaded('pcov')) {throw new Exception('PCOV not found');}" php -r "if(phpversion()>=7.1 && ! extension_loaded('pcov')) {throw new Exception('PCOV not found');}"
- name: Testing ini values - name: Testing ini values
run: | run: |
php -r "if(ini_get('memory_limit')!='-1') {throw new Exception('memory_limit not disabled');}"
php -r "if(ini_get('post_max_size')!='256M') {throw new Exception('post_max_size not added');}" php -r "if(ini_get('post_max_size')!='256M') {throw new Exception('post_max_size not added');}"
php -r "if(ini_get('short_open_tag')!=1) {throw new Exception('short_open_tag not added');}" php -r "if(ini_get('short_open_tag')!=1) {throw new Exception('short_open_tag not added');}"
php -r "if(ini_get('date.timezone')!='Asia/Kolkata') {throw new Exception('date.timezone not added');}" php -r "if(ini_get('date.timezone')!='Asia/Kolkata') {throw new Exception('date.timezone not added');}"

View File

@ -24,10 +24,10 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup Node.js 12.x - name: Setup Node.js 14.x
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: 12.x node-version: 14.x
- name: Install dependencies - name: Install dependencies
run: npm install run: npm install

140
README.md
View File

@ -8,7 +8,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/shivammathur/setup-php" title="GitHub action to setup PHP"><img alt="GitHub Actions status" src="https://github.com/shivammathur/setup-php/workflows/Main%20workflow/badge.svg"></a> <a href="https://github.com/shivammathur/setup-php" title="GitHub action to setup PHP"><img alt="GitHub Actions status" src="https://github.com/shivammathur/setup-php/workflows/Main%20workflow/badge.svg"></a>
<a href="https://codecov.io/gh/shivammathur/setup-php" title="Code coverage"><img alt="Codecov Code Coverage" src="https://codecov.io/gh/shivammathur/setup-php/branch/master/graph/badge.svg"></a> <a href="https://codecov.io/gh/shivammathur/setup-php" title="Code coverage"><img alt="Codecov Code Coverage" src="https://img.shields.io/codecov/c/github/shivammathur/setup-php?logo=codecov"></a>
<a href="https://github.com/shivammathur/setup-php/blob/master/LICENSE" title="license"><img alt="LICENSE" src="https://img.shields.io/badge/license-MIT-428f7e.svg"></a> <a href="https://github.com/shivammathur/setup-php/blob/master/LICENSE" title="license"><img alt="LICENSE" src="https://img.shields.io/badge/license-MIT-428f7e.svg"></a>
<a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-%3E%3D%205.6-8892BF.svg"></a> <a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-%3E%3D%205.6-8892BF.svg"></a>
</p> </p>
@ -58,11 +58,13 @@ 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|`ubuntu-16.04`|`PHP 5.6` to `PHP 7.4`| |Ubuntu 16.04|`ubuntu-16.04`|`PHP 5.6` to `PHP 8.0`|
|Ubuntu 18.04|`ubuntu-latest` or `ubuntu-18.04`|`PHP 7.1` to `PHP 7.4`| |Ubuntu 18.04|`ubuntu-18.04`|`PHP 7.1` to `PHP 8.0`|
|Ubuntu 20.04|`ubuntu-20.04`|`PHP 7.4`| |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 7.4`| |Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 8.0`|
|macOS 10.15 Catalina|`macos-latest` or `macos-10.15`|`PHP 7.4`| |macOS 10.15 Catalina|`macos-latest` or `macos-10.15`|`PHP 8.0`|
|macOS 11.0 Big Sur|`macos-11.0`|`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.
@ -85,8 +87,9 @@ with:
tools: php-cs-fixer, phpunit tools: php-cs-fixer, phpunit
``` ```
To setup a particular version of a tool, specify it in the form `tool:version`. To set up a particular version of a tool, specify it in the form `tool:version`.
Latest stable version of `composer` is setup by default and accepts `v1`, `v2`, `snapshot` and `preview` as versions.
The latest stable version of `composer` is set up by default. You can set up the required `composer` version by specifying `v1`, `v2`, `snapshot` or `preview` as versions or the exact version in semver format.
```yaml ```yaml
uses: shivammathur/setup-php@v1 uses: shivammathur/setup-php@v1
@ -95,6 +98,8 @@ with:
tools: composer:v2 tools: composer:v2
``` ```
If you have specified composer plugins `prestissimo` or `composer-prefetcher` in tools, the latest stable version of `composer v1` will be setup. Unless some of your packages require `composer v1`, it is recommended to drop `prestissimo` and use `composer v2`.
Version for other tools should be in `semver` format and a valid release of the tool. Version for other tools should be in `semver` format and a valid release of the tool.
```yaml ```yaml
@ -214,7 +219,6 @@ jobs:
> Setup a nightly build of `PHP 8.0.0-dev` from the [master branch](https://github.com/php/php-src/tree/master "Master branch on PHP source repository") of PHP. > Setup a nightly build of `PHP 8.0.0-dev` from the [master branch](https://github.com/php/php-src/tree/master "Master branch on PHP source repository") of PHP.
- `PECL` is installed by default with this version on `Ubuntu` and `macOS`.
- Some extensions might not support this version currently. - Some extensions might not support this version currently.
- Refer to this [RFC](https://wiki.php.net/rfc/jit "PHP JIT RFC configuration") for configuring `PHP JIT` on this version. - Refer to this [RFC](https://wiki.php.net/rfc/jit "PHP JIT RFC configuration") for configuring `PHP JIT` on this version.
- Refer to this [list of RFCs](https://wiki.php.net/rfc#php_80 "List of RFCs implemented in PHP8") implemented in this version. - Refer to this [list of RFCs](https://wiki.php.net/rfc#php_80 "List of RFCs implemented in PHP8") implemented in this version.
@ -264,14 +268,14 @@ You can persist composer's internal cache directory using the [`action/cache`](h
**Note:** Please do not cache `vendor` directory using `action/cache` as that will have side-effects. **Note:** Please do not cache `vendor` directory using `action/cache` as that will have side-effects.
```yaml ```yaml
- name: Get composer cache directory - name: Get Composer Cache Directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
@ -279,10 +283,15 @@ You can persist composer's internal cache directory using the [`action/cache`](h
run: composer install --prefer-dist run: composer install --prefer-dist
``` ```
In the above example, if you support a range of `composer` dependencies and do not commit `composer.lock`, you can use the hash of `composer.json` as the key for your cache. - If you do not commit `composer.lock`, you can use the hash of `composer.json` as the key for your cache.
```yaml ```yaml
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
```
- If you support a range of `composer` dependencies and use `prefer-lowest` and `prefer-stable` options, you can store them in your matrix add them to the keys.
```yaml
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}-${{ matrix.prefer }}-
restore-keys: ${{ runner.os }}-composer-${{ matrix.prefer }}-
``` ```
### Composer GitHub OAuth ### Composer GitHub OAuth
@ -300,31 +309,72 @@ If you have a number of workflows which setup multiple tools or have many compos
### Problem Matchers ### Problem Matchers
#### PHPUnit Problem matchers are `json` configurations which identify errors and warnings in your logs and surface that information prominently in the GitHub Actions UI by highlighting them and creating code annotations.
You can setup problem matchers for your `PHPUnit` output by adding this step after the `setup-php` step. This will scan the logs for failing tests and surface that information prominently in the GitHub Actions UI by creating annotations and log file decorations. #### PHP
Setup problem matchers for your `PHP` output by adding this step after the `setup-php` step.
```yaml ```yaml
- name: Setup Problem Matchers for PHPUnit - name: Setup problem matchers for PHP
run: echo "::add-matcher::${{ runner.tool_cache }}/php.json"
```
#### PHPUnit
Setup problem matchers for your `PHPUnit` output by adding this step after the `setup-php` step.
```yaml
- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
``` ```
#### Other Tools #### PHPStan
For tools that support `checkstyle` reporting like `phpstan`, `psalm`, `php-cs-fixer` and `phpcs` you can use `cs2pr` to annotate your code. PHPStan supports error reporting in GitHub Actions, so no problem matchers are required.
For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-pull-request-from-checkstyle).
> Here is an example with `phpstan`.
```yaml ```yaml
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v1 uses: shivammathur/setup-php@v2
with: with:
php-version: '7.4' php-version: '7.4'
tools: cs2pr, phpstan tools: phpstan
- name: PHPStan - name: Run PHPStan
run: phpstan analyse src --error-format=checkstyle | cs2pr run: phpstan analyse src
```
#### Psalm
Psalm supports error reporting in GitHub Actions with an output format `github`.
```yaml
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: psalm
- name: Run Psalm
run: psalm --output-format=github
```
#### Tools with checkstyle support
For tools that support `checkstyle` reporting like `phpstan`, `psalm`, `php-cs-fixer` and `phpcs` you can use `cs2pr` to annotate your code.
For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-pull-request-from-checkstyle).
> Here is an example with `phpcs`.
```yaml
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: cs2pr, phpcs
- name: Run phpcs
run: phpcs -q --report=checkstyle src | cs2pr
``` ```
### Examples ### Examples
@ -357,7 +407,9 @@ Examples for setting up this GitHub Action with different PHP Frameworks/Package
## :scroll: License ## :scroll: License
The scripts and documentation in this project are released under the [MIT License](LICENSE "License for shivammathur/setup-php"). This project has multiple [dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Dependencies for this PHP Action") and uses [various works](#bookmark-dependencies "Tools used by this action"). Their licenses can be found in their respective repositories. - The scripts and documentation in this project are released under the [MIT License](LICENSE "License for shivammathur/setup-php").
- This project has multiple [dependencies](#bookmark-dependencies "Dependencies for this PHP Action"). Their licenses can be found in their respective repositories.
- The logo for `setup-php` is a derivative work of [php.net logo](https://www.php.net/download-logos.php) and is licensed under the [CC BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/ "Creative Commons License").
## :+1: Contributions ## :+1: Contributions
@ -365,19 +417,41 @@ Contributions are welcome! See [Contributor's Guide](.github/CONTRIBUTING.md "sh
## :sparkling_heart: Support This Project ## :sparkling_heart: Support This Project
If this action helped you. - If setup-php saved your developer time, please consider sponsoring setup-php:
- [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.
- To support this project subscribe on [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon") or sponsor using [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal"). *Huge thanks to the following companies for supporting `setup-php`*
- Please star the project and share it with the community.
- If you blog, write about your experience of using this action. <p>
- If you need any help using this, please contact me using [Codementor](https://www.codementor.io/shivammathur "Shivam Mathur Codementor") <a href="https://www.jetbrains.com/?from=setup-php">
<img src="https://setup-php.com/sponsors/jetbrains.svg" alt="JetBrains" width="106" height="60">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://blackfire.io/?utm_source=setup-php">
<img src="https://setup-php.com/sponsors//blackfire.svg" alt="Blackfire" width="212" height="60">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.macstadium.com/?source=setup-php">
<img src="https://setup-php.com/sponsors//macstadium.png" alt="Mac Stadium" width="148" height="60">
</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>
</p>
## :bookmark: Dependencies ## :bookmark: Dependencies
- [Node.js dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Node.js dependencies") - [Node.js dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Node.js dependencies")
- [aaronparker/VcRedist](https://github.com/aaronparker/VcRedist "VcRedist PowerShell package")
- [mlocati/powershell-phpmanager](https://github.com/mlocati/powershell-phpmanager "Package to handle PHP on windows") - [mlocati/powershell-phpmanager](https://github.com/mlocati/powershell-phpmanager "Package to handle PHP on windows")
- [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Packaging active PHP packages") - [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Packaging active PHP packages")
- [shivammathur/homebrew-php](https://github.com/shivammathur/homebrew-php "Tap for PHP builds for MacOS") - [shivammathur/homebrew-php](https://github.com/shivammathur/homebrew-php "Tap for PHP builds for MacOS")
- [shivammathur/homebrew-extensions](https://github.com/shivammathur/homebrew-extensions "Tap for PHP extensions for MacOS")
- [shivammathur/php-builder](https://github.com/shivammathur/php-builder "Nightly PHP package") - [shivammathur/php-builder](https://github.com/shivammathur/php-builder "Nightly PHP package")
## :bookmark_tabs: Further Reading ## :bookmark_tabs: Further Reading

View File

@ -12,9 +12,9 @@ describe('Config tests', () => {
win32 = await config.addINIValues( win32 = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata', 'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'fedora' 'openbsd'
); );
expect(win32).toContain('Platform fedora is not supported'); expect(win32).toContain('Platform openbsd is not supported');
}); });
it('checking addINIValuesOnLinux', async () => { it('checking addINIValuesOnLinux', async () => {
@ -29,9 +29,9 @@ describe('Config tests', () => {
linux = await config.addINIValues( linux = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata', 'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'fedora' 'openbsd'
); );
expect(linux).toContain('Platform fedora is not supported'); expect(linux).toContain('Platform openbsd is not supported');
}); });
it('checking addINIValuesOnDarwin', async () => { it('checking addINIValuesOnDarwin', async () => {
@ -45,8 +45,8 @@ describe('Config tests', () => {
darwin = await config.addINIValues( darwin = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata', 'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'fedora' 'openbsd'
); );
expect(darwin).toContain('Platform fedora is not supported'); expect(darwin).toContain('Platform openbsd is not supported');
}); });
}); });

View File

@ -1,15 +1,9 @@
import * as coverage from '../src/coverage'; import * as coverage from '../src/coverage';
jest.mock('../src/extensions', () => ({
addExtension: jest.fn().mockImplementation(extension => {
return 'add_extension ' + extension + '\n';
})
}));
describe('Config tests', () => { describe('Config tests', () => {
it('checking addCoverage with PCOV on windows', async () => { it('checking addCoverage with PCOV on windows', async () => {
let win32: string = await coverage.addCoverage('PCOV', '7.4', 'win32'); let win32: string = await coverage.addCoverage('PCOV', '7.4', 'win32');
expect(win32).toContain('add_extension pcov'); expect(win32).toContain('Add-Extension pcov');
expect(win32).toContain('Remove-Extension xdebug'); expect(win32).toContain('Remove-Extension xdebug');
win32 = await coverage.addCoverage('pcov', '7.0', 'win32'); win32 = await coverage.addCoverage('pcov', '7.0', 'win32');
@ -27,24 +21,38 @@ describe('Config tests', () => {
it('checking addCoverage with PCOV on darwin', async () => { it('checking addCoverage with PCOV on darwin', async () => {
const darwin: string = await coverage.addCoverage('pcov', '7.4', 'darwin'); const darwin: string = await coverage.addCoverage('pcov', '7.4', 'darwin');
expect(darwin).toContain('add_extension pcov'); expect(darwin).toContain('add_brew_extension pcov');
expect(darwin).toContain('remove_extension xdebug'); expect(darwin).toContain('remove_extension xdebug');
}); });
it('checking addCoverage with Xdebug on windows', async () => { it('checking addCoverage with Xdebug on windows', async () => {
const win32: string = await coverage.addCoverage('xdebug', '7.4', 'win32'); const win32: string = await coverage.addCoverage('xdebug', '7.4', 'win32');
expect(win32).toContain('add_extension xdebug'); expect(win32).toContain('Add-Extension xdebug');
}); });
it('checking addCoverage with Xdebug on linux', async () => { it('checking addCoverage with Xdebug3 on windows', async () => {
const linux: string = await coverage.addCoverage('xdebug', '7.4', 'linux'); const win32: string = await coverage.addCoverage('xdebug3', '7.4', 'win32');
expect(linux).toContain('add_extension xdebug'); expect(win32).toContain('Add-Extension xdebug');
});
it('checking addCoverage with Xdebug2 on windows', async () => {
const win32: string = await coverage.addCoverage('xdebug2', '7.4', 'win32');
expect(win32).toContain('Add-Extension xdebug stable 2.9.8');
}); });
it('checking addCoverage with Xdebug on linux', async () => { it('checking addCoverage with Xdebug on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux'); const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug'); expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"'); });
it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
});
it('checking addCoverage with Xdebug2 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug2', '7.4', 'linux');
expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension');
}); });
it('checking addCoverage with Xdebug on darwin', async () => { it('checking addCoverage with Xdebug on darwin', async () => {
@ -53,7 +61,25 @@ describe('Config tests', () => {
'7.4', '7.4',
'darwin' 'darwin'
); );
expect(darwin).toContain('add_extension xdebug'); expect(darwin).toContain('add_brew_extension xdebug');
});
it('checking addCoverage with Xdebug3 on darwin', async () => {
const darwin: string = await coverage.addCoverage(
'xdebug3',
'7.4',
'darwin'
);
expect(darwin).toContain('add_brew_extension xdebug');
});
it('checking addCoverage with Xdebug2 on darwin', async () => {
const darwin: string = await coverage.addCoverage(
'xdebug2',
'7.4',
'darwin'
);
expect(darwin).toContain('add_brew_extension xdebug2');
}); });
it('checking disableCoverage windows', async () => { it('checking disableCoverage windows', async () => {

View File

@ -1,12 +1,6 @@
import * as extensions from '../src/extensions'; import * as extensions from '../src/extensions';
describe('Extension tests', () => { describe('Extension tests', () => {
it('checking getXdebugVersion', async () => {
expect(await extensions.getXdebugVersion('5.3')).toContain('2.2.7');
expect(await extensions.getXdebugVersion('5.4')).toContain('2.4.1');
expect(await extensions.getXdebugVersion('5.5')).toContain('2.5.5');
expect(await extensions.getXdebugVersion('5.6')).toContain('2.9.6');
});
it('checking addExtensionOnWindows', async () => { it('checking addExtensionOnWindows', async () => {
let win32: string = await extensions.addExtension( let win32: string = await extensions.addExtension(
'Xdebug, pcov, sqlite, phalcon4, ast-beta', 'Xdebug, pcov, sqlite, phalcon4, ast-beta',
@ -19,6 +13,9 @@ describe('Extension tests', () => {
expect(win32).toContain('phalcon.ps1 phalcon4'); expect(win32).toContain('phalcon.ps1 phalcon4');
expect(win32).toContain('Add-Extension ast beta'); expect(win32).toContain('Add-Extension ast beta');
win32 = await extensions.addExtension('xdebug2', '7.2', 'win32');
expect(win32).toContain('Add-Extension xdebug stable 2.9.8');
win32 = await extensions.addExtension('mysql', '7.4', 'win32'); win32 = await extensions.addExtension('mysql', '7.4', 'win32');
expect(win32).toContain('Add-Extension mysqli'); expect(win32).toContain('Add-Extension mysqli');
expect(win32).toContain('Add-Extension mysqlnd'); expect(win32).toContain('Add-Extension mysqlnd');
@ -41,8 +38,8 @@ describe('Extension tests', () => {
expect(win32).toContain('phalcon.ps1 phalcon3'); expect(win32).toContain('phalcon.ps1 phalcon3');
expect(win32).toContain('Add-Extension does_not_exist'); expect(win32).toContain('Add-Extension does_not_exist');
win32 = await extensions.addExtension('xdebug', '7.2', 'fedora'); win32 = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(win32).toContain('Platform fedora is not supported'); expect(win32).toContain('Platform openbsd is not supported');
}); });
it('checking addExtensionOnLinux', async () => { it('checking addExtensionOnLinux', async () => {
@ -51,7 +48,6 @@ describe('Extension tests', () => {
'7.4', '7.4',
'linux' 'linux'
); );
expect(linux).toContain('update_extension xdebug 2.9.2');
expect(linux).toContain('sudo $debconf_fix apt-get install -y php7.4-pcov'); expect(linux).toContain('sudo $debconf_fix apt-get install -y php7.4-pcov');
expect(linux).toContain( expect(linux).toContain(
'sudo $debconf_fix apt-get install -y php7.4-sqlite3' 'sudo $debconf_fix apt-get install -y php7.4-sqlite3'
@ -75,8 +71,11 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('gearman', '7.4', 'linux'); linux = await extensions.addExtension('gearman', '7.4', 'linux');
expect(linux).toContain('gearman.sh 7.4'); expect(linux).toContain('gearman.sh 7.4');
linux = await extensions.addExtension('xdebug', '7.2', 'fedora'); linux = await extensions.addExtension('xdebug2', '7.2', 'linux');
expect(linux).toContain('Platform fedora is not supported'); expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension');
linux = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(linux).toContain('Platform openbsd is not supported');
linux = await extensions.addExtension('phalcon3, phalcon4', '7.3', 'linux'); linux = await extensions.addExtension('phalcon3, phalcon4', '7.3', 'linux');
expect(linux).toContain('phalcon.sh phalcon3 7.3'); expect(linux).toContain('phalcon.sh phalcon3 7.3');
@ -85,13 +84,18 @@ 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, sqlite, ast-beta', 'Xdebug, pcov, grpc, igbinary, imagick, protobuf, swoole, 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('sudo pecl install -f sqlite3'); expect(darwin).toContain('add_brew_extension grpc');
expect(darwin).toContain('add_brew_extension igbinary');
expect(darwin).toContain('add_brew_extension imagick');
expect(darwin).toContain('add_brew_extension protobuf');
expect(darwin).toContain('add_brew_extension swoole');
expect(darwin).toContain('pecl_install sqlite3');
expect(darwin).toContain('add_unstable_extension ast beta extension'); expect(darwin).toContain('add_unstable_extension ast beta extension');
darwin = await extensions.addExtension('phalcon3', '7.0', 'darwin'); darwin = await extensions.addExtension('phalcon3', '7.0', 'darwin');
@ -101,7 +105,7 @@ describe('Extension tests', () => {
expect(darwin).toContain('phalcon_darwin.sh phalcon4 7.3'); expect(darwin).toContain('phalcon_darwin.sh phalcon4 7.3');
darwin = await extensions.addExtension('pcov', '5.6', 'darwin'); darwin = await extensions.addExtension('pcov', '5.6', 'darwin');
expect(darwin).toContain('sudo pecl install -f pcov'); expect(darwin).toContain('pecl_install pcov');
darwin = await extensions.addExtension('pcov', '7.2', 'darwin'); darwin = await extensions.addExtension('pcov', '7.2', 'darwin');
expect(darwin).toContain('add_brew_extension pcov'); expect(darwin).toContain('add_brew_extension pcov');
@ -112,22 +116,8 @@ describe('Extension tests', () => {
darwin = await extensions.addExtension('xdebug', '7.0', 'darwin'); darwin = await extensions.addExtension('xdebug', '7.0', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug'); expect(darwin).toContain('add_brew_extension xdebug');
darwin = await extensions.addExtension('xdebug', '7.2', 'darwin'); darwin = await extensions.addExtension('xdebug2', '7.2', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug'); expect(darwin).toContain('add_brew_extension xdebug2');
darwin = await extensions.addExtension('redis', '5.6', 'darwin');
expect(darwin).toContain('sudo pecl install -f redis-2.2.8');
darwin = await extensions.addExtension('redis', '7.2', 'darwin');
expect(darwin).toContain('sudo pecl install -f redis');
darwin = await extensions.addExtension('imagick', '5.6', 'darwin');
expect(darwin).toContain('brew install pkg-config imagemagick');
expect(darwin).toContain('sudo pecl install -f imagick');
darwin = await extensions.addExtension('imagick', '7.4', 'darwin');
expect(darwin).toContain('brew install pkg-config imagemagick');
expect(darwin).toContain('sudo pecl install -f imagick');
darwin = await extensions.addExtension( darwin = await extensions.addExtension(
'does_not_exist', 'does_not_exist',
@ -137,7 +127,7 @@ describe('Extension tests', () => {
); );
expect(darwin).toContain('add_extension does_not_exist'); expect(darwin).toContain('add_extension does_not_exist');
darwin = await extensions.addExtension('xdebug', '7.2', 'fedora'); darwin = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(darwin).toContain('Platform fedora is not supported'); expect(darwin).toContain('Platform openbsd is not supported');
}); });
}); });

View File

@ -26,12 +26,12 @@ jest.mock('../src/install', () => ({
if (extension_csv) { if (extension_csv) {
script += 'install extensions'; script += 'install extensions';
} }
if (ini_values_csv) {
script += 'edit php.ini';
}
if (coverage_driver) { if (coverage_driver) {
script += 'set coverage driver'; script += 'set coverage driver';
} }
if (ini_values_csv) {
script += 'edit php.ini';
}
return script; return script;
} }

View File

@ -1,24 +0,0 @@
import * as io from '@actions/io';
import * as matchers from '../src/matchers';
jest.mock('@actions/io');
describe('Matchers', () => {
it('Add matchers', async () => {
process.env['RUNNER_TOOL_CACHE'] = __dirname;
await matchers.addMatchers();
const spy = jest.spyOn(io, 'cp');
expect(spy).toHaveBeenCalledTimes(1);
});
it('Test Regex', async () => {
const regex1 = /^\d+\)\s.*$/;
const regex2 = /^(.*Failed\sasserting\sthat.*)$/;
const regex3 = /^\s*$/;
const regex4 = /^(.*):(\d+)$/;
expect(regex1.test('1) Tests\\Test::it_tests')).toBe(true);
expect(regex2.test('Failed asserting that false is true')).toBe(true);
expect(regex3.test('\n')).toBe(true);
expect(regex4.test('/path/to/file.php:42')).toBe(true);
});
});

View File

@ -5,8 +5,8 @@ describe('Tools tests', () => {
expect(await tools.getCommand('linux', 'tool')).toBe('add_tool '); expect(await tools.getCommand('linux', 'tool')).toBe('add_tool ');
expect(await tools.getCommand('darwin', 'tool')).toBe('add_tool '); expect(await tools.getCommand('darwin', 'tool')).toBe('add_tool ');
expect(await tools.getCommand('win32', 'tool')).toBe('Add-Tool '); expect(await tools.getCommand('win32', 'tool')).toBe('Add-Tool ');
expect(await tools.getCommand('fedora', 'tool')).toContain( expect(await tools.getCommand('openbsd', 'tool')).toContain(
'Platform fedora is not supported' 'Platform openbsd is not supported'
); );
}); });
@ -20,8 +20,8 @@ describe('Tools tests', () => {
expect(await tools.getCommand('win32', 'composertool')).toBe( expect(await tools.getCommand('win32', 'composertool')).toBe(
'Add-Composertool ' 'Add-Composertool '
); );
expect(await tools.getCommand('fedora', 'composertool')).toContain( expect(await tools.getCommand('openbsd', 'composertool')).toContain(
'Platform fedora is not supported' 'Platform openbsd is not supported'
); );
}); });
@ -29,8 +29,8 @@ describe('Tools tests', () => {
expect(await tools.getCommand('linux', 'pecl')).toBe('add_pecl '); expect(await tools.getCommand('linux', 'pecl')).toBe('add_pecl ');
expect(await tools.getCommand('darwin', 'pecl')).toBe('add_pecl '); expect(await tools.getCommand('darwin', 'pecl')).toBe('add_pecl ');
expect(await tools.getCommand('win32', 'pecl')).toBe('Add-Pecl '); expect(await tools.getCommand('win32', 'pecl')).toBe('Add-Pecl ');
expect(await tools.getCommand('fedora', 'pecl')).toContain( expect(await tools.getCommand('openbsd', 'pecl')).toContain(
'Platform fedora is not supported' 'Platform openbsd is not supported'
); );
}); });
@ -112,102 +112,20 @@ describe('Tools tests', () => {
).toBe('releases/download/v1.2.3/tool.phar'); ).toBe('releases/download/v1.2.3/tool.phar');
}); });
it('checking getCodeceptionUriBuilder', async () => {
expect(await tools.getCodeceptionUriBuilder('3.2.1', 'php56')).toBe(
'releases/3.2.1/php56/codecept.phar'
);
expect(await tools.getCodeceptionUriBuilder('3.2.1', 'php54')).toBe(
'releases/3.2.1/php54/codecept.phar'
);
expect(await tools.getCodeceptionUriBuilder('3.2.1', '')).toBe(
'releases/3.2.1/codecept.phar'
);
});
it('checking getCodeceptionUri', async () => {
expect(await tools.getCodeceptionUri('latest', '5.6')).toBe(
'php56/codecept.phar'
);
expect(await tools.getCodeceptionUri('latest', '7.0')).toBe(
'php56/codecept.phar'
);
expect(await tools.getCodeceptionUri('latest', '7.1')).toBe(
'php56/codecept.phar'
);
expect(await tools.getCodeceptionUri('latest', '7.2')).toBe(
'codecept.phar'
);
expect(await tools.getCodeceptionUri('latest', '7.3')).toBe(
'codecept.phar'
);
expect(await tools.getCodeceptionUri('latest', '7.4')).toBe(
'codecept.phar'
);
expect(await tools.getCodeceptionUri('4.0.0', '7.4')).toBe(
'releases/4.0.0/codecept.phar'
);
expect(await tools.getCodeceptionUri('4.0.0', '5.6')).toBe(
'releases/4.0.0/php56/codecept.phar'
);
expect(await tools.getCodeceptionUri('4.0.0', '7.1')).toBe(
'releases/4.0.0/php56/codecept.phar'
);
expect(await tools.getCodeceptionUri('3.1.0', '7.4')).toBe(
'releases/3.1.0/codecept.phar'
);
expect(await tools.getCodeceptionUri('3.1.0', '5.6')).toBe(
'releases/3.1.0/php54/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.5.4', '7.4')).toBe(
'releases/2.5.4/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.5.4', '5.6')).toBe(
'releases/2.5.4/php54/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.3.4', '7.4')).toBe(
'releases/2.3.4/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.3.4', '5.4')).toBe(
'releases/2.3.4/php54/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.2.4', '5.6')).toBe(
'releases/2.2.4/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.2.4', '7.4')).toBe(
'releases/2.2.4/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.2.4', '5.4')).toBe(
'releases/2.2.4/php54/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.1.7', '5.6')).toBe(
'releases/2.1.7/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.1.7', '5.4')).toBe(
'releases/2.1.7/php54/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.1.5', '5.4')).toBe(
'releases/2.1.5/codecept.phar'
);
expect(await tools.getCodeceptionUri('2.1.5', '7.4')).toBe(
'releases/2.1.5/codecept.phar'
);
expect(await tools.getCodeceptionUri('1.6.9', '7.4')).toBe(
'releases/1.6.9/codecept.phar'
);
expect(await tools.getCodeceptionUri('1.5.0', '7.4')).toBe(
'releases/1.5.0/codecept.phar'
);
});
it('checking addPhive', async () => { it('checking addPhive', async () => {
let script: string = await tools.addPhive('1.2.3', 'linux'); let script: string = await tools.addPhive('1.2.3', '7.4', 'linux');
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/phar-io/phive/releases/download/1.2.3/phive-1.2.3.phar phive' 'add_tool https://github.com/phar-io/phive/releases/download/1.2.3/phive-1.2.3.phar phive'
); );
script = await tools.addPhive('latest', 'win32'); script = await tools.addPhive('latest', '5.6', 'win32');
expect(script).toContain( expect(script).toContain(
'Add-Tool https://phar.io/releases/phive.phar phive' 'Add-Tool https://github.com/phar-io/phive/releases/download/0.12.1/phive-0.12.1.phar phive'
);
script = await tools.addPhive('latest', '7.1', 'win32');
expect(script).toContain(
'Add-Tool https://github.com/phar-io/phive/releases/download/0.13.5/phive-0.13.5.phar phive'
); );
}); });
@ -240,9 +158,17 @@ describe('Tools tests', () => {
'a', 'a',
'b' 'b'
]); ]);
expect(await tools.addComposer(['a', 'b', 'composer:1.2'])).toStrictEqual([
'composer',
'a',
'b'
]);
expect( expect(
await tools.addComposer(['a', 'b', 'composer:1.2.3']) await tools.addComposer(['a', 'b', 'composer:1.2.3'])
).toStrictEqual(['composer', 'a', 'b']); ).toStrictEqual(['composer:1.2.3', 'a', 'b']);
expect(
await tools.addComposer(['a', 'b', 'composer:v1.2.3'])
).toStrictEqual(['composer:1.2.3', 'a', 'b']);
expect( expect(
await tools.addComposer(['a', 'b', 'composer:snapshot']) await tools.addComposer(['a', 'b', 'composer:snapshot'])
).toStrictEqual(['composer:snapshot', 'a', 'b']); ).toStrictEqual(['composer:snapshot', 'a', 'b']);
@ -261,22 +187,44 @@ describe('Tools tests', () => {
expect( expect(
await tools.addComposer(['a', 'b', 'c', 'composer:v2']) await tools.addComposer(['a', 'b', 'c', 'composer:v2'])
).toStrictEqual(['composer:2', 'a', 'b', 'c']); ).toStrictEqual(['composer:2', 'a', 'b', 'c']);
expect(
await tools.addComposer(['hirak', 'b', 'c', 'composer:v2'])
).toStrictEqual(['composer:1', 'hirak', 'b', 'c']);
}); });
it('checking updateComposer', async () => { it('checking getComposerUrl', async () => {
expect(await tools.updateComposer('latest', 'linux')).toContain(''); expect(await tools.getComposerUrl('latest')).toContain(
expect(await tools.updateComposer('stable', 'win32')).toContain(''); 'https://getcomposer.org/composer-stable.phar'
expect(await tools.updateComposer('snapshot', 'darwin')).toContain(
'\ncomposer self-update --snapshot'
); );
expect(await tools.updateComposer('preview', 'linux')).toContain( expect(await tools.getComposerUrl('stable')).toContain(
'\ncomposer self-update --preview' 'https://getcomposer.org/composer-stable.phar'
); );
expect(await tools.updateComposer('1', 'win32')).toContain( expect(await tools.getComposerUrl('snapshot')).toContain(
'\ncomposer self-update --1' 'https://getcomposer.org/composer.phar'
); );
expect(await tools.updateComposer('2', 'darwin')).toContain( expect(await tools.getComposerUrl('preview')).toContain(
'\ncomposer self-update --2' 'https://getcomposer.org/composer-preview.phar'
);
expect(await tools.getComposerUrl('1')).toContain(
'https://getcomposer.org/composer-1.phar'
);
expect(await tools.getComposerUrl('2')).toContain(
'https://getcomposer.org/composer-2.phar'
);
expect(await tools.getComposerUrl('1.7.2')).toContain(
'https://github.com/composer/composer/releases/download/1.7.2/composer.phar'
);
expect(await tools.getComposerUrl('1.7.2')).toContain(
'https://getcomposer.org/composer-1.7.2.phar'
);
expect(await tools.getComposerUrl('2.0.0-RC2')).toContain(
'https://github.com/composer/composer/releases/download/2.0.0-RC2/composer.phar'
);
expect(await tools.getComposerUrl('2.0.0-RC2')).toContain(
'https://getcomposer.org/composer-2.0.0-RC2.phar'
);
expect(await tools.getComposerUrl('wrong')).toContain(
'https://getcomposer.org/composer-stable.phar'
); );
}); });
@ -299,42 +247,33 @@ describe('Tools tests', () => {
expect(await tools.getSymfonyUri('1.2.3', 'win32')).toContain( expect(await tools.getSymfonyUri('1.2.3', 'win32')).toContain(
'releases/download/v1.2.3/symfony_windows_amd64' 'releases/download/v1.2.3/symfony_windows_amd64'
); );
expect(await tools.getSymfonyUri('1.2.3', 'fedora')).toContain( expect(await tools.getSymfonyUri('1.2.3', 'openbsd')).toContain(
'Platform fedora is not supported' 'Platform openbsd is not supported'
); );
}); });
it('checking getCleanedToolsList', async () => { it('checking getCleanedToolsList', async () => {
const tools_list: string[] = await tools.getCleanedToolsList( const tools_list: string[] = await tools.getCleanedToolsList(
'tool, composer:1.2.3, robmorgan/phinx, hirak/prestissimo, narrowspark/automatic-composer-prefetcher' 'tool, composer:1.2.3, robmorgan/phinx'
); );
expect(tools_list).toStrictEqual([ expect(tools_list).toStrictEqual(['composer:1.2.3', 'tool', 'phinx']);
'composer',
'tool',
'phinx',
'prestissimo',
'composer-prefetcher'
]);
}); });
it('checking addArchive', async () => { it('checking addArchive', async () => {
let script: string = await tools.addArchive( let script: string = await tools.addArchive(
'tool', 'tool',
'1.2.3',
'https://tool.com/tool.phar', 'https://tool.com/tool.phar',
'linux' 'linux'
); );
expect(script).toContain('add_tool https://tool.com/tool.phar tool'); expect(script).toContain('add_tool https://tool.com/tool.phar tool');
script = await tools.addArchive( script = await tools.addArchive(
'tool', 'tool',
'1.2.3',
'https://tool.com/tool.phar', 'https://tool.com/tool.phar',
'darwin' 'darwin'
); );
expect(script).toContain('add_tool https://tool.com/tool.phar tool'); expect(script).toContain('add_tool https://tool.com/tool.phar tool');
script = await tools.addArchive( script = await tools.addArchive(
'tool', 'tool',
'1.2.3',
'https://tool.com/tool.phar', 'https://tool.com/tool.phar',
'win32' 'win32'
); );
@ -342,11 +281,10 @@ describe('Tools tests', () => {
script = await tools.addArchive( script = await tools.addArchive(
'tool', 'tool',
'1.2.3',
'https://tool.com/tool.phar', 'https://tool.com/tool.phar',
'fedora' 'openbsd'
); );
expect(script).toContain('Platform fedora is not supported'); expect(script).toContain('Platform openbsd is not supported');
}); });
it('checking addDevTools', async () => { it('checking addDevTools', async () => {
@ -374,8 +312,8 @@ describe('Tools tests', () => {
'Add-Log "$cross" "php-config" "php-config is not a windows tool"' 'Add-Log "$cross" "php-config" "php-config is not a windows tool"'
); );
script = await tools.addDevTools('tool', 'fedora'); script = await tools.addDevTools('tool', 'openbsd');
expect(script).toContain('Platform fedora is not supported'); expect(script).toContain('Platform openbsd is not supported');
}); });
it('checking addPackage', async () => { it('checking addPackage', async () => {
@ -393,8 +331,8 @@ describe('Tools tests', () => {
script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'win32'); script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'win32');
expect(script).toContain('Add-Composertool tool tool:1.2.3 user/'); expect(script).toContain('Add-Composertool tool tool:1.2.3 user/');
script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'fedora'); script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'openbsd');
expect(script).toContain('Platform fedora is not supported'); expect(script).toContain('Platform openbsd is not supported');
}); });
it('checking addTools on linux', async () => { it('checking addTools on linux', async () => {
@ -404,7 +342,7 @@ describe('Tools tests', () => {
'linux' 'linux'
); );
expect(script).toContain( expect(script).toContain(
'add_tool https://getcomposer.org/composer-stable.phar composer' 'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-stable.phar,https://getcomposer.org/composer-stable.phar composer'
); );
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr' 'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr'
@ -433,12 +371,12 @@ describe('Tools tests', () => {
}); });
it('checking addTools on darwin', async () => { it('checking addTools on darwin', async () => {
const script: string = await tools.addTools( const script: string = await tools.addTools(
'phpcs, phpcbf, phpcpd, phpmd, psalm, phinx, phive:1.2.3, cs2pr:1.2.3, composer-prefetcher:1.2.3, phpize, php-config, symfony, symfony:1.2.3', 'phpcs, phpcbf, phpcpd, phpmd, psalm, phinx, phive:1.2.3, cs2pr:1.2.3, phpize, php-config, symfony:1.2.3',
'7.4', '7.4',
'darwin' 'darwin'
); );
expect(script).toContain( expect(script).toContain(
'add_tool https://getcomposer.org/composer-stable.phar composer' 'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-stable.phar,https://getcomposer.org/composer-stable.phar composer'
); );
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/download/1.2.3/cs2pr cs2pr' 'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/download/1.2.3/cs2pr cs2pr'
@ -462,12 +400,6 @@ describe('Tools tests', () => {
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/phar-io/phive/releases/download/1.2.3/phive-1.2.3.phar phive' 'add_tool https://github.com/phar-io/phive/releases/download/1.2.3/phive-1.2.3.phar phive'
); );
expect(script).toContain(
'add_composertool composer-prefetcher composer-prefetcher:1.2.3 narrowspark/automatic-'
);
expect(script).toContain(
'add_tool https://github.com/symfony/cli/releases/latest/download/symfony_darwin_amd64 symfony'
);
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/symfony/cli/releases/download/v1.2.3/symfony_darwin_amd64 symfony' 'add_tool https://github.com/symfony/cli/releases/download/v1.2.3/symfony_darwin_amd64 symfony'
); );
@ -476,12 +408,12 @@ describe('Tools tests', () => {
}); });
it('checking addTools on windows', async () => { it('checking addTools on windows', async () => {
const script: string = await tools.addTools( const script: string = await tools.addTools(
'codeception, cs2pr, deployer, prestissimo, phpmd, phinx, phive:0.13.2, php-config, phpize, symfony, does_not_exit', 'cs2pr, deployer, phpmd, phinx, phive:0.13.2, php-config, phpize, symfony, does_not_exist, composer',
'7.4', '7.4',
'win32' 'win32'
); );
expect(script).toContain( expect(script).toContain(
'Add-Tool https://getcomposer.org/composer-stable.phar composer' 'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-stable.phar,https://getcomposer.org/composer-stable.phar composer'
); );
expect(script).toContain( expect(script).toContain(
'Add-Tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr' 'Add-Tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr'
@ -489,7 +421,6 @@ describe('Tools tests', () => {
expect(script).toContain( expect(script).toContain(
'Add-Tool https://deployer.org/deployer.phar deployer' 'Add-Tool https://deployer.org/deployer.phar deployer'
); );
expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/');
expect(script).toContain( expect(script).toContain(
'Add-Tool https://github.com/phpmd/phpmd/releases/latest/download/phpmd.phar phpmd' 'Add-Tool https://github.com/phpmd/phpmd/releases/latest/download/phpmd.phar phpmd'
); );
@ -502,17 +433,16 @@ describe('Tools tests', () => {
); );
expect(script).toContain('phpize is not a windows tool'); expect(script).toContain('phpize is not a windows tool');
expect(script).toContain('php-config is not a windows tool'); expect(script).toContain('php-config is not a windows tool');
expect(script).toContain('Tool does_not_exit is not supported'); expect(script).toContain('Tool does_not_exist is not supported');
expect(script).toContain('Tool does_not_exit is not supported');
}); });
it('checking addTools with composer tool using user/tool as input', async () => { it('checking addTools with composer tool using user/tool as input', async () => {
const script: string = await tools.addTools( const script: string = await tools.addTools(
'hirak/prestissimo, narrowspark/automatic-composer-prefetcher, robmorgan/phinx', 'codeception/codeception, hirak/prestissimo, narrowspark/automatic-composer-prefetcher, robmorgan/phinx',
'7.4', '7.4',
'win32' 'win32'
); );
expect(script).toContain( expect(script).toContain(
'Add-Tool https://getcomposer.org/composer-stable.phar composer' 'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-1.phar,https://getcomposer.org/composer-1.phar composer'
); );
expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/'); expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/');
expect(script).toContain('Add-Composertool phinx phinx robmorgan/'); expect(script).toContain('Add-Composertool phinx phinx robmorgan/');
@ -527,17 +457,20 @@ describe('Tools tests', () => {
'linux' 'linux'
); );
expect(script).toContain( expect(script).toContain(
'add_tool https://getcomposer.org/composer-stable.phar composer' 'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-1.phar,https://getcomposer.org/composer-1.phar composer'
); );
expect(script).toContain('composer self-update --1');
script = await tools.addTools('composer:preview', '7.4', 'linux'); script = await tools.addTools('composer:preview', '7.4', 'linux');
expect(script).toContain('composer self-update --preview'); expect(script).toContain(
'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-preview.phar,https://getcomposer.org/composer-preview.phar composer'
);
script = await tools.addTools( script = await tools.addTools(
'composer:v1, composer:preview, composer:snapshot', 'composer:v1, composer:preview, composer:snapshot',
'7.4', '7.4',
'linux' 'linux'
); );
expect(script).toContain('composer self-update --snapshot'); expect(script).toContain(
'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-snapshot.phar,https://getcomposer.org/composer.phar composer'
);
}); });
}); });

View File

@ -8,6 +8,12 @@ jest.mock('@actions/core', () => ({
}) })
})); }));
jest.spyOn(utils, 'fetch').mockImplementation(
async (url): Promise<string> => {
return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`;
}
);
async function cleanup(path: string): Promise<void> { async function cleanup(path: string): Promise<void> {
fs.unlink(path, error => { fs.unlink(path, error => {
if (error) { if (error) {
@ -17,23 +23,44 @@ async function cleanup(path: string): Promise<void> {
} }
describe('Utils tests', () => { describe('Utils tests', () => {
it('checking getInput', async () => { it('checking readEnv', async () => {
process.env['test'] = 'setup-php'; process.env['test'] = 'setup-php';
process.env['undefined'] = ''; expect(await utils.readEnv('test')).toBe('setup-php');
expect(await utils.readEnv('undefined')).toBe('');
});
it('checking getInput', async () => {
expect(await utils.getInput('test', false)).toBe('setup-php'); expect(await utils.getInput('test', false)).toBe('setup-php');
expect(await utils.getInput('undefined', false)).toBe('');
expect(await utils.getInput('setup-php', false)).toBe('setup-php'); expect(await utils.getInput('setup-php', false)).toBe('setup-php');
expect(await utils.getInput('DoesNotExist', false)).toBe(''); expect(await utils.getInput('DoesNotExist', false)).toBe('');
expect(async () => {
await utils.getInput('DoesNotExist', true);
}).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 () => { it('checking asyncForEach', async () => {
const array: Array<string> = ['a', 'b', 'c']; const array: Array<string> = ['a', 'b', 'c'];
let concat = ''; let concat = '';
await utils.asyncForEach(array, async function ( await utils.asyncForEach(
str: string array,
): Promise<void> { async function (str: string): Promise<void> {
concat += str; concat += str;
}); }
);
expect(concat).toBe('abc'); expect(concat).toBe('abc');
}); });
@ -70,10 +97,7 @@ describe('Utils tests', () => {
const runner_dir: string = process.env['RUNNER_TOOL_CACHE'] || ''; const runner_dir: string = process.env['RUNNER_TOOL_CACHE'] || '';
const script_path: string = path.join(runner_dir, 'test.sh'); const script_path: string = path.join(runner_dir, 'test.sh');
await utils.writeScript('test.sh', testString); await utils.writeScript('test.sh', testString);
await fs.readFile(script_path, function ( fs.readFile(script_path, function (error: Error | null, data: Buffer) {
error: Error | null,
data: Buffer
) {
expect(testString).toBe(data.toString()); expect(testString).toBe(data.toString());
}); });
await cleanup(script_path); await cleanup(script_path);
@ -97,6 +121,28 @@ describe('Utils tests', () => {
'b=2', 'b=2',
'c=3' 'c=3'
]); ]);
expect(await utils.CSVArray('\'a=1,2\', "b=3, 4", c=5, d=~e~')).toEqual([
'a=1,2',
'b=3, 4',
'c=5',
"d='~e~'"
]);
expect(await utils.CSVArray('a=\'1,2\', b="3, 4", c=5')).toEqual([
'a=1,2',
'b=3, 4',
'c=5'
]);
expect(await utils.CSVArray('\'a=1,2\', "b=3, 4", c=5, d=~e~')).toEqual([
'a=1,2',
'b=3, 4',
'c=5',
"d='~e~'"
]);
expect(await utils.CSVArray('a=\'1,2\', b="3, 4", c=5')).toEqual([
'a=1,2',
'b=3, 4',
'c=5'
]);
expect(await utils.CSVArray('')).toEqual([]); expect(await utils.CSVArray('')).toEqual([]);
expect(await utils.CSVArray(' ')).toEqual([]); expect(await utils.CSVArray(' ')).toEqual([]);
}); });
@ -131,8 +177,8 @@ describe('Utils tests', () => {
expect(step_log).toEqual('step_log "Test message"'); expect(step_log).toEqual('step_log "Test message"');
step_log = await utils.stepLog(message, 'darwin'); step_log = await utils.stepLog(message, 'darwin');
expect(step_log).toEqual('step_log "Test message"'); expect(step_log).toEqual('step_log "Test message"');
step_log = await utils.stepLog(message, 'fedora'); step_log = await utils.stepLog(message, 'openbsd');
expect(step_log).toContain('Platform fedora is not supported'); expect(step_log).toContain('Platform openbsd is not supported');
let add_log: string = await utils.addLog( let add_log: string = await utils.addLog(
'tick', 'tick',
@ -145,8 +191,8 @@ describe('Utils tests', () => {
expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"');
add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'darwin'); add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'darwin');
expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"');
add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'fedora'); add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'openbsd');
expect(add_log).toContain('Platform fedora is not supported'); expect(add_log).toContain('Platform openbsd is not supported');
}); });
it('checking getExtensionPrefix', async () => { it('checking getExtensionPrefix', async () => {
@ -162,8 +208,8 @@ describe('Utils tests', () => {
expect(await utils.suppressOutput('win32')).toEqual(' >$null 2>&1'); expect(await utils.suppressOutput('win32')).toEqual(' >$null 2>&1');
expect(await utils.suppressOutput('linux')).toEqual(' >/dev/null 2>&1'); expect(await utils.suppressOutput('linux')).toEqual(' >/dev/null 2>&1');
expect(await utils.suppressOutput('darwin')).toEqual(' >/dev/null 2>&1'); expect(await utils.suppressOutput('darwin')).toEqual(' >/dev/null 2>&1');
expect(await utils.suppressOutput('fedora')).toContain( expect(await utils.suppressOutput('openbsd')).toContain(
'Platform fedora is not supported' 'Platform openbsd is not supported'
); );
}); });
}); });

View File

@ -1,6 +1,6 @@
name: 'Setup PHP Action' name: 'Setup PHP Action'
author: shivammathur author: shivammathur
description: 'Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer' description: 'GitHub Action for PHP'
branding: branding:
color: 'purple' color: 'purple'
icon: 'play-circle' icon: 'play-circle'

3764
dist/index.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -17,11 +17,11 @@ jobs:
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- uses: actions/cache@v2 - uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -37,12 +37,12 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -70,12 +70,12 @@ jobs:
php-version: '7.3' php-version: '7.3'
extensions: mbstring, intl extensions: mbstring, intl
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -98,12 +98,12 @@ jobs:
extensions: mbstring, intl extensions: mbstring, intl
tools: phpstan tools: phpstan
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -35,12 +35,12 @@ jobs:
extensions: mbstring, intl, redis, pdo_pgsql extensions: mbstring, intl, redis, pdo_pgsql
coverage: pcov coverage: pcov
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -68,12 +68,12 @@ jobs:
php-version: '7.3' php-version: '7.3'
extensions: mbstring, intl extensions: mbstring, intl
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -96,12 +96,12 @@ jobs:
extensions: mbstring, intl extensions: mbstring, intl
tools: phpstan tools: phpstan
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -19,12 +19,12 @@ jobs:
extensions: mbstring, intl, pdo_sqlite, pdo_mysql extensions: mbstring, intl, pdo_sqlite, pdo_mysql
coverage: pcov #optional coverage: pcov #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -48,12 +48,12 @@ jobs:
php-version: '7.3' php-version: '7.3'
extensions: mbstring, intl extensions: mbstring, intl
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
@ -76,12 +76,12 @@ jobs:
extensions: mbstring, intl extensions: mbstring, intl
tools: phpstan tools: phpstan
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -18,12 +18,12 @@ jobs:
extensions: mbstring, intl, curl, dom extensions: mbstring, intl, curl, dom
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -44,12 +44,12 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -44,12 +44,12 @@ jobs:
extensions: mbstring, dom, fileinfo, pgsql extensions: mbstring, dom, fileinfo, pgsql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -20,12 +20,12 @@ jobs:
extensions: mbstring, dom, fileinfo extensions: mbstring, dom, fileinfo
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -44,12 +44,12 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -44,12 +44,12 @@ jobs:
extensions: mbstring, dom, fileinfo, pgsql extensions: mbstring, dom, fileinfo, pgsql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -20,12 +20,12 @@ jobs:
extensions: mbstring, dom, fileinfo, mysql extensions: mbstring, dom, fileinfo, mysql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -44,12 +44,12 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -43,12 +43,12 @@ jobs:
extensions: mbstring, dom, zip, phalcon4, pgsql #use phalcon3 for the phalcon 3.x extensions: mbstring, dom, zip, phalcon4, pgsql #use phalcon3 for the phalcon 3.x
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -33,12 +33,12 @@ jobs:
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn- restore-keys: ${{ runner.os }}-yarn-
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -18,12 +18,12 @@ jobs:
extensions: mbstring, simplexml, dom extensions: mbstring, simplexml, dom
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -23,7 +23,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup PHP, with composer and extensions - name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v1 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql
@ -31,22 +31,23 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies - name: Install Composer dependencies
run: | run: |
composer require --dev symfony/orm-pack symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Migration - name: Run Migration
run: | run: |
composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed" php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed" php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env: env:

View File

@ -23,28 +23,29 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup PHP, with composer and extensions - name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v1 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, pgsql extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, pgsql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies - name: Install Composer dependencies
run: | run: |
composer require --dev symfony/orm-pack symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Migration - name: Run Migration
run: | run: |
composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed" php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed" php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env: env:

View File

@ -14,25 +14,26 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup PHP, with composer and extensions - name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v1 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies - name: Install Composer dependencies
run: | run: |
composer require symfony/orm-pack composer require --dev symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Tests - name: Run Tests
run: php bin/phpunit --coverage-text run: php bin/phpunit --coverage-text

View File

@ -41,12 +41,12 @@ jobs:
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -39,12 +39,12 @@ jobs:
extensions: mbstring, intl, gd, imagick, zip, dom, pgsql extensions: mbstring, intl, gd, imagick, zip, dom, pgsql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -18,12 +18,12 @@ jobs:
extensions: mbstring, bcmath, curl, intl extensions: mbstring, bcmath, curl, intl
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composercache id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composercache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

12943
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
{ {
"name": "setup-php", "name": "setup-php",
"version": "1.9.1", "version": "1.11.0",
"private": false, "private": false,
"description": "Setup PHP for use with GitHub Actions", "description": "Setup PHP for use with GitHub Actions",
"main": "dist/index.js", "main": "dist/index.js",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"lint": "eslint **/*.ts --cache", "lint": "eslint **/*.ts --cache --fix",
"format": "prettier --write **/*.ts && git add .", "format": "prettier --write **/*.ts && git add .",
"format-check": "prettier --check **/*.ts", "format-check": "prettier --check **/*.ts",
"release": "ncc build src/install.ts -o dist && git add -f dist/", "release": "ncc build src/install.ts -o dist && git add -f dist/",
@ -24,33 +24,33 @@
"author": "shivammathur", "author": "shivammathur",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.2.4", "@actions/core": "^1.2.6",
"@actions/exec": "^1.0.4", "@actions/exec": "^1.0.4",
"@actions/io": "^1.0.2", "@actions/io": "^1.0.2",
"fs": "0.0.1-security" "fs": "0.0.1-security"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^26.0.0", "@types/jest": "^26.0.20",
"@types/node": "^14.0.13", "@types/node": "^14.14.31",
"@typescript-eslint/eslint-plugin": "^3.3.0", "@typescript-eslint/eslint-plugin": "^4.15.1",
"@typescript-eslint/parser": "^3.3.0", "@typescript-eslint/parser": "^4.15.1",
"@zeit/ncc": "^0.22.3", "@vercel/ncc": "^0.27.0",
"eslint": "^7.2.0", "eslint": "^7.20.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^8.0.0",
"eslint-plugin-import": "^2.21.2", "eslint-plugin-import": "^2.22.1",
"eslint-plugin-jest": "^23.13.2", "eslint-plugin-jest": "^24.1.5",
"eslint-plugin-prettier": "^3.1.4", "eslint-plugin-prettier": "^3.3.1",
"husky": "^4.2.5", "husky": "^4.3.8",
"jest": "^26.0.1", "jest": "^26.6.3",
"jest-circus": "^26.0.1", "jest-circus": "^26.6.3",
"prettier": "^2.0.5", "prettier": "^2.2.1",
"ts-jest": "^26.1.0", "ts-jest": "^26.5.1",
"typescript": "^3.9.5" "typescript": "^4.1.5"
}, },
"husky": { "husky": {
"skipCI": true, "skipCI": true,
"hooks": { "hooks": {
"pre-commit": "npm run format && npm run lint && 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

@ -14,7 +14,9 @@ export async function addINIValuesUnix(
script += script +=
(await utils.addLog('$tick', line, 'Added to php.ini', 'linux')) + '\n'; (await utils.addLog('$tick', line, 'Added to php.ini', 'linux')) + '\n';
}); });
return 'echo "' + ini_values.join('\n') + '" >> $ini_file' + script; return (
'echo "' + ini_values.join('\n') + '" >> ${pecl_file:-$ini_file}' + script
);
} }
/** /**

View File

@ -1,58 +0,0 @@
variants:
dev:
bcmath:
calendar:
cli:
ctype:
dom:
fileinfo:
filter:
ipc:
iconv:
json:
mbregex:
mbstring:
mhash:
mcrypt:
pcntl:
pcre:
pdo:
phar:
posix:
sockets:
tokenizer:
xml:
curl:
openssl:
zip:
gd:
- --with-freetype
- --with-pdo-mysql=mysqlnd
- --with-mysqli=mysqlnd
- --with-pgsql
- --with-pdo-pgsql
- --with-gmp=/usr/local/opt/gmp
- --with-openssl
- --with-pear
- --with-zip
- --with-libxml
- --with-kerberos
- --with-gd
- --with-ffi
- --with-curl
- --with-mhash
- --with-readline=/usr/local/opt/readline
- --with-iconv=/usr/local/opt/libiconv
- --with-icu-dir=/usr/local/opt/icu4c
- --with-config-file-path=/etc
- --enable-intl
- --enable-xml
- --enable-sysvsem
- --enable-sysvshm
- --enable-sysvmsg
- --enable-phpdbg
- --enable-exif
- --enable-gd
- --enable-soap
- --enable-xmlreader
- --enable-zend-test=shared

View File

@ -0,0 +1,6 @@
{
"latest": "8.0",
"5.x": "5.6",
"7.x": "7.4",
"8.x": "8.0"
}

View File

@ -2,38 +2,22 @@ import * as utils from './utils';
import * as extensions from './extensions'; import * as extensions from './extensions';
import * as config from './config'; import * as config from './config';
/**
* Function to setup Xdebug
*
* @param version
* @param os_version
* @param pipe
*/
export async function addCoverageXdebug( export async function addCoverageXdebug(
extension: string,
version: string, version: string,
os_version: string, os_version: string,
pipe: string pipe: string
): Promise<string> { ): Promise<string> {
const xdebug = const xdebug =
(await extensions.addExtension('xdebug', version, os_version, true)) + pipe; (await extensions.addExtension(extension, version, os_version, true)) +
const ini = await config.addINIValues( pipe;
'xdebug.mode=coverage',
os_version,
true
);
const log = await utils.addLog( const log = await utils.addLog(
'$tick', '$tick',
'xdebug', extension,
'Xdebug enabled as coverage driver', 'Xdebug enabled as coverage driver',
os_version os_version
); );
switch (true) { return xdebug + '\n' + log;
case /8.[0-9]/.test(version):
return xdebug + '\n' + ini + '\n' + log;
case /5\.[3-6]|7.[0-4]/.test(version):
default:
return xdebug + '\n' + log;
}
} }
/** /**
@ -146,7 +130,14 @@ export async function addCoverage(
case 'pcov': case 'pcov':
return script + (await addCoveragePCOV(version, os_version, pipe)); return script + (await addCoveragePCOV(version, os_version, pipe));
case 'xdebug': case 'xdebug':
return script + (await addCoverageXdebug(version, os_version, pipe)); case 'xdebug3':
return (
script + (await addCoverageXdebug('xdebug', version, os_version, pipe))
);
case 'xdebug2':
return (
script + (await addCoverageXdebug('xdebug2', version, os_version, pipe))
);
case 'none': case 'none':
return script + (await disableCoverage(version, os_version, pipe)); return script + (await disableCoverage(version, os_version, pipe));
default: default:

View File

@ -1,35 +1,15 @@
import * as path from 'path'; import * as path from 'path';
import * as utils from './utils'; import * as utils from './utils';
/**
* Function to get Xdebug version compatible with php versions
*
* @param version
*/
export async function getXdebugVersion(version: string): Promise<string> {
switch (version) {
case '5.3':
return '2.2.7';
case '5.4':
return '2.4.1';
case '5.5':
return '2.5.5';
default:
return '2.9.6';
}
}
/** /**
* Install and enable extensions for darwin * Install and enable extensions for darwin
* *
* @param extension_csv * @param extension_csv
* @param version * @param version
* @param pipe
*/ */
export async function addExtensionDarwin( export async function addExtensionDarwin(
extension_csv: string, extension_csv: string,
version: string, version: string
pipe: string
): Promise<string> { ): Promise<string> {
const extensions: Array<string> = await utils.extensionArray(extension_csv); const extensions: Array<string> = await utils.extensionArray(extension_csv);
let script = '\n'; let script = '\n';
@ -37,11 +17,11 @@ export async function addExtensionDarwin(
const version_extension: string = version + extension; const version_extension: string = version + extension;
const [extension_name, stability]: string[] = extension.split('-'); const [extension_name, stability]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(extension_name); const ext_prefix = await utils.getExtensionPrefix(extension_name);
const command_prefix = 'sudo pecl install -f '; const command_prefix = 'pecl_install ';
let command = ''; let command = '';
switch (true) { switch (true) {
// match pre-release versions // match pre-release versions
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension): case /.+-(beta|alpha|devel|snapshot)/.test(extension):
script += script +=
'\nadd_unstable_extension ' + '\nadd_unstable_extension ' +
extension_name + extension_name +
@ -50,27 +30,13 @@ export async function addExtensionDarwin(
' ' + ' ' +
ext_prefix; ext_prefix;
return; return;
// match 5.6xdebug, 7.0xdebug...7.4xdebug, 8.0xdebug // match 5.6 to 8.0 amqp, grpc, igbinary, imagick, imap, msgpack, pecl_http, propro, protobuf, raphf, redis, swoole, xdebug, xdebug2, zmq
case /(5\.6|7\.[0-4]|8\.[0-9])xdebug/.test(version_extension): // match 7.1pcov to 8.0pcov
command = 'add_brew_extension xdebug'; case /(5\.6|7\.[0-4]|8.0)(amqp|grpc|igbinary|imagick|imap|msgpack|^(pecl_)?http$|propro|protobuf|raphf|redis|swoole|xdebug|xdebug2|zmq)/.test(
break; version_extension
// match 7.1pcov...7.4pcov, 8.0pcov ):
case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension): case /(7\.[1-4]|8\.0])pcov/.test(version_extension):
command = 'add_brew_extension pcov'; command = 'add_brew_extension ' + extension_name.replace('pecl_', '');
break;
// match 5.6redis
case /5\.6redis/.test(version_extension):
command = command_prefix + 'redis-2.2.8';
break;
// match imagick
case /^imagick$/.test(extension):
command =
'brew install pkg-config imagemagick' +
pipe +
' && ' +
command_prefix +
'imagick' +
pipe;
break; break;
// match sqlite // match sqlite
case /^sqlite$/.test(extension): case /^sqlite$/.test(extension):
@ -119,7 +85,7 @@ export async function addExtensionWindows(
const version_extension: string = version + extension; const version_extension: string = version + extension;
switch (true) { switch (true) {
// match pre-release versions // match pre-release versions
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension): case /.+-(beta|alpha|devel|snapshot)/.test(extension):
script += '\nAdd-Extension ' + extension_name + ' ' + stability; script += '\nAdd-Extension ' + extension_name + ' ' + stability;
break; break;
// match 5.6mysql, 5.6mysqli, 5.6mysqlnd // match 5.6mysql, 5.6mysqli, 5.6mysqlnd
@ -127,6 +93,10 @@ export async function addExtensionWindows(
script += script +=
'\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd'; '\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd';
break; break;
// match 7.2xdebug2 to 7.4xdebug2
case /7\.[2-4]xdebug2/.test(version_extension):
script += '\nAdd-Extension xdebug stable 2.9.8';
break;
// match 7.0mysql..8.0mysql // match 7.0mysql..8.0mysql
// match 7.0mysqli..8.0mysqli // match 7.0mysqli..8.0mysqli
// match 7.0mysqlnd..8.0mysqlnd // match 7.0mysqlnd..8.0mysqlnd
@ -179,7 +149,7 @@ export async function addExtensionLinux(
let command = ''; let command = '';
switch (true) { switch (true) {
// match pre-release versions // match pre-release versions
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension): case /.+-(beta|alpha|devel|snapshot)/.test(extension):
script += script +=
'\nadd_unstable_extension ' + '\nadd_unstable_extension ' +
extension_name + extension_name +
@ -207,13 +177,9 @@ export async function addExtensionLinux(
' ' + ' ' +
version; version;
return; return;
// match 7.0xdebug..7.4xdebug // match 7.2xdebug2 to 7.4xdebug2
case /^7\.[0-4]xdebug$/.test(version_extension): case /^7\.[2-4]xdebug2$/.test(version_extension):
script += script += '\nadd_pecl_extension xdebug 2.9.8 ' + ext_prefix;
'\nupdate_extension xdebug 2.9.2' +
pipe +
'\n' +
(await utils.addLog('$tick', 'xdebug', 'Enabled', 'linux'));
return; return;
// match sqlite // match sqlite
case /^sqlite$/.test(extension): case /^sqlite$/.test(extension):
@ -265,7 +231,7 @@ export async function addExtension(
case 'win32': case 'win32':
return script + (await addExtensionWindows(extension_csv, version)); return script + (await addExtensionWindows(extension_csv, version));
case 'darwin': case 'darwin':
return script + (await addExtensionDarwin(extension_csv, version, pipe)); return script + (await addExtensionDarwin(extension_csv, version));
case 'linux': case 'linux':
return script + (await addExtensionLinux(extension_csv, version, pipe)); return script + (await addExtensionLinux(extension_csv, version, pipe));
default: default:

View File

@ -5,7 +5,6 @@ import * as coverage from './coverage';
import * as extensions from './extensions'; import * as extensions from './extensions';
import * as tools from './tools'; import * as tools from './tools';
import * as utils from './utils'; import * as utils from './utils';
import * as matchers from './matchers';
/** /**
* Build the script * Build the script
@ -20,6 +19,8 @@ export async function build(
os_version: string os_version: string
): Promise<string> { ): Promise<string> {
// taking inputs // taking inputs
const name = 'setup-php';
const url = 'https://setup-php.com/support';
const extension_csv: string = const extension_csv: string =
(await utils.getInput('extensions', false)) || (await utils.getInput('extensions', false)) ||
(await utils.getInput('extension', false)) || (await utils.getInput('extension', false)) ||
@ -28,14 +29,7 @@ export async function build(
(await utils.getInput('ini-values', false)) || (await utils.getInput('ini-values', false)) ||
(await utils.getInput('ini-values-csv', false)); (await utils.getInput('ini-values-csv', false));
const coverage_driver: string = await utils.getInput('coverage', false); const coverage_driver: string = await utils.getInput('coverage', false);
const pecl: string = await utils.getInput('pecl', false); const tools_csv: string = await utils.getInput('tools', false);
let tools_csv: string = await utils.getInput('tools', false);
if (
pecl == 'true' ||
/.*-(beta|alpha|devel|snapshot).*/.test(extension_csv)
) {
tools_csv = 'pecl, ' + tools_csv;
}
let script: string = await utils.readScript(filename); let script: string = await utils.readScript(filename);
script += await tools.addTools(tools_csv, version, os_version); script += await tools.addTools(tools_csv, version, os_version);
@ -43,12 +37,15 @@ export async function build(
if (extension_csv) { if (extension_csv) {
script += await extensions.addExtension(extension_csv, version, os_version); script += await extensions.addExtension(extension_csv, version, os_version);
} }
if (ini_values_csv) {
script += await config.addINIValues(ini_values_csv, os_version);
}
if (coverage_driver) { if (coverage_driver) {
script += await coverage.addCoverage(coverage_driver, version, os_version); script += await coverage.addCoverage(coverage_driver, version, os_version);
} }
if (ini_values_csv) {
script += await config.addINIValues(ini_values_csv, os_version);
}
script += '\n' + (await utils.stepLog('Support this project', os_version));
script += '\n' + (await utils.addLog('$tick', name, url, os_version));
return await utils.writeScript(filename, script); return await utils.writeScript(filename, script);
} }
@ -58,23 +55,36 @@ export async function build(
*/ */
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
const os_version: string = process.platform; core.warning(
let version: string = await utils.getInput('php-version', true); 'setup-php v1 is deprecated.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2'
version = version.length > 1 ? version.slice(0, 3) : version + '.0'; );
// check the os version and run the respective script const version: string = await utils.parseVersion(
let script_path = ''; await utils.getInput('php-version', true)
switch (os_version) { );
case 'darwin': if (version == '8.1') {
case 'linux': core.setFailed(
script_path = await build(os_version + '.sh', version, os_version); 'PHP 8.1 is not supported on setup-php v1.\nPlease upgrade to v2 - https://github.com/shivammathur/setup-php/wiki/Switch-to-v2'
await exec('bash ' + script_path + ' ' + version + ' ' + __dirname); );
break; return;
case 'win32': }
script_path = await build('win32.ps1', version, os_version); if (version) {
await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); const os_version: string = process.platform;
break; // 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');
} }
await matchers.addMatchers();
} catch (error) { } catch (error) {
core.setFailed(error.message); core.setFailed(error.message);
} }

View File

@ -1,18 +0,0 @@
import * as path from 'path';
import * as utils from './utils';
import * as io from '@actions/io';
/**
* Cache json files for problem matchers
*/
export async function addMatchers(): Promise<void> {
const config_path = path.join(
__dirname,
'..',
'src',
'configs',
'phpunit.json'
);
const runner_dir: string = await utils.getInput('RUNNER_TOOL_CACHE', false);
await io.cp(config_path, runner_dir);
}

View File

@ -19,7 +19,7 @@ add_log() {
# Function to remove extensions # Function to remove extensions
remove_extension() { remove_extension() {
extension=$1 extension=$1
sudo sed -i '' "/$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
} }
@ -34,15 +34,21 @@ check_extension() {
fi fi
} }
# Fuction to get the PECL version # Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1
yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
}
# Function to get the PECL version
get_pecl_version() { get_pecl_version() {
extension=$1 extension=$1
stability=$2 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 -q -sSL "$pecl_rest$extension"/allreleases.xml) response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
pecl_version=$(echo "$response" | grep -m 1 -Eo "(\d*\.\d*\.\d*$stability\d*)") pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)")
if [ ! "$pecl_version" ]; then if [ ! "$pecl_version" ]; then
pecl_version=$(echo "$response" | grep -m 1 -Eo "(\d*\.\d*\.\d*)") pecl_version=$(echo "$response" | grep -m 1 -Eo "([0-9]+\.[0-9]+\.[0-9]+)")
fi fi
echo "$pecl_version" echo "$pecl_version"
} }
@ -52,6 +58,9 @@ add_pecl_extension() {
extension=$1 extension=$1
pecl_version=$2 pecl_version=$2
prefix=$3 prefix=$3
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
pecl_version=$(get_pecl_version "$extension" "$pecl_version")
fi
if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
echo "$prefix=$ext_dir/$extension.so" >>"$ini_file" echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"
fi fi
@ -61,21 +70,45 @@ add_pecl_extension() {
else else
remove_extension "$extension" remove_extension "$extension"
( (
sudo pecl install -f "$extension-$pecl_version" >/dev/null 2>&1 && pecl_install "$extension-$pecl_version" >/dev/null 2>&1 &&
check_extension "$extension" && check_extension "$extension" &&
add_log "$tick" "$extension" "Installed and enabled" add_log "$tick" "$extension" "Installed and enabled"
) || add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver" ) || add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver"
fi fi
} }
# Function to fetch a brew tap
fetch_brew_tap() {
tap=$1
tap_user=$(dirname "$tap")
tap_name=$(basename "$tap")
mkdir -p "$tap_dir/$tap_user"
sudo curl "${curl_opts[@]}" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
fi
}
# Function to add a brew tap.
add_brew_tap() {
tap=$1
if ! [ -d "$tap_dir/$tap" ]; then
fetch_brew_tap "$tap" >/dev/null 2>&1
if ! [ -d "$tap_dir/$tap" ]; then
brew tap --shallow "$tap" >/dev/null 2>&1
fi
fi
}
# 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() {
extension=$1 formula=$1
if ! brew tap | grep shivammathur/extensions; then extension=${formula//[0-9]/}
brew tap --shallow shivammathur/extensions add_brew_tap shivammathur/homebrew-php
fi add_brew_tap shivammathur/homebrew-extensions
brew install "$extension@$version" sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
sudo cp "$(brew --prefix)/opt/$extension@$version/$extension.so" "$ext_dir" brew install "$formula@$version"
sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
} }
# Function to setup extensions # Function to setup extensions
@ -105,7 +138,27 @@ add_unstable_extension() {
add_pecl_extension "$extension" "$pecl_version" "$prefix" add_pecl_extension "$extension" "$pecl_version" "$prefix"
} }
# Function to setup a remote tool # Function to configure composer
configure_composer() {
tool_path=$1
sudo ln -sf "$tool_path" "$tool_path.phar"
php -r "try {\$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception \$e) {exit(1);}"
if [ $? -eq 1 ]; then
add_log "$cross" "composer" "Could not download composer"
exit 1;
fi
if ! [ -e "$composer_json" ]; then
echo '{}' | tee "$composer_json" >/dev/null 2>&1
sudo chmod 644 "$composer_json"
fi
composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
fi
}
# Function to setup a remote tool.
add_tool() { add_tool() {
url=$1 url=$1
tool=$2 tool=$2
@ -113,20 +166,28 @@ add_tool() {
if [ ! -e "$tool_path" ]; then if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path" rm -rf "$tool_path"
fi fi
if [ "$tool" = "composer" ]; then
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" -L "$url") IFS="," read -r -a urls <<< "$url"
status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
else
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
fi
if [ "$status_code" != "200" ] && [[ "$url" =~ .*github.com.*releases.*latest.* ]]; then
url="${url//releases\/latest\/download/releases/download/$(curl "${curl_opts[@]}" "$(echo "$url" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "$url" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
fi
if [ "$status_code" = "200" ]; then if [ "$status_code" = "200" ]; then
sudo chmod a+x "$tool_path" sudo chmod a+x "$tool_path"
if [ "$tool" = "composer" ]; then if [ "$tool" = "composer" ]; then
composer -q global config process-timeout 0 configure_composer "$tool_path"
echo "::add-path::/Users/$USER/.composer/vendor/bin" elif [ "$tool" = "phan" ]; then
if [ -n "$COMPOSER_TOKEN" ]; then add_extension fileinfo "pecl_install fileinfo" extension >/dev/null 2>&1
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN" add_extension ast "pecl_install ast" extension >/dev/null 2>&1
fi
elif [ "$tool" = "phive" ]; then elif [ "$tool" = "phive" ]; then
add_extension curl "sudo pecl install -f curl" extension >/dev/null 2>&1 add_extension curl "pecl_install curl" extension >/dev/null 2>&1
add_extension mbstring "sudo pecl install -f mbstring" extension >/dev/null 2>&1 add_extension mbstring "pecl_install mbstring" extension >/dev/null 2>&1
add_extension xml "sudo pecl install -f xml" extension >/dev/null 2>&1 add_extension xml "pecl_install xml" extension >/dev/null 2>&1
elif [ "$tool" = "cs2pr" ]; then elif [ "$tool" = "cs2pr" ]; then
sudo sed -i '' 's/exit(9)/exit(0)/' "$tool_path" sudo sed -i '' 's/exit(9)/exit(0)/' "$tool_path"
tr -d '\r' < "$tool_path" | sudo tee "$tool_path.tmp" >/dev/null 2>&1 && sudo mv "$tool_path.tmp" "$tool_path" tr -d '\r' < "$tool_path" | sudo tee "$tool_path.tmp" >/dev/null 2>&1 && sudo mv "$tool_path.tmp" "$tool_path"
@ -144,16 +205,22 @@ add_composertool() {
release=$2 release=$2
prefix=$3 prefix=$3
( (
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
composer global require "$prefix$release" >/dev/null 2>&1 && composer global require "$prefix$release" >/dev/null 2>&1 &&
add_log "$tick" "$tool" "Added" add_log "$tick" "$tool" "Added"
) || add_log "$cross" "$tool" "Could not setup $tool" ) || add_log "$cross" "$tool" "Could not setup $tool"
if [ -e "$composer_bin/composer" ]; then
sudo cp -p "$tool_path_dir/composer" "$composer_bin"
fi
if [ "$tool" = "codeception" ]; then
sudo ln -s "$composer_bin"/codecept "$composer_bin"/codeception
fi
} }
# Function to configure PECL # Function to configure PECL
configure_pecl() { configure_pecl() {
for tool in pear pecl; do for tool in pear pecl; do
sudo "$tool" config-set php_ini "$ini_file" >/dev/null 2>&1 sudo "$tool" config-set php_ini "$ini_file" >/dev/null 2>&1
sudo "$tool" config-set auto_discover 1 >/dev/null 2>&1
sudo "$tool" channel-update "$tool".php.net >/dev/null 2>&1 sudo "$tool" channel-update "$tool".php.net >/dev/null 2>&1
done done
} }
@ -163,33 +230,67 @@ add_pecl() {
add_log "$tick" "PECL" "Added" add_log "$tick" "PECL" "Added"
} }
# Function to fetch updated formulas # Function to backup all libraries of a formula
update_formulae() { link_libraries() {
brew_dir=$(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula formula=$1
for formula in httpd pkg-config apr apr-util argon2 aspell autoconf bison curl-openssl freetds freetype gettext glib gmp icu4c jpeg krb5 libffi libpng libpq libsodium libzip oniguruma openldap openssl@1.1 re2c sqlite tidyp unixodbc webp; do formula_prefix="$(brew --prefix "$formula")"
sudo curl -o "$brew_dir"/"$formula".rb -sSL https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/"$formula".rb & sudo mkdir -p "$formula_prefix"/lib
to_wait+=( $! ) for lib in "$formula_prefix"/lib/*.dylib; do
lib_name=$(basename "$lib")
sudo cp -a "$lib" "$brew_prefix/lib/old_$lib_name" 2>/dev/null || true
sudo ln -sf "$brew_prefix/lib/old_$lib_name" "$brew_prefix/lib/$lib_name"
done done
wait "${to_wait[@]}" }
# Function to update dependencies
update_dependencies() {
if [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
while read -r formula; do
(
curl -o "$tap_dir/homebrew/homebrew-core/Formula/$formula.rb" "${curl_opts[@]}" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$formula.rb"
link_libraries "$formula"
) &
to_wait+=( $! )
done < "$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}"
wait "${to_wait[@]}"
fi
} }
# Function to setup PHP and composer # Function to setup PHP and composer
setup_php() { setup_php() {
if [ "$version" = "8.0" ]; then add_brew_tap shivammathur/homebrew-php
update_formulae update_dependencies
fi brew upgrade shivammathur/php/php@"$version" 2>/dev/null || brew install shivammathur/php/php@"$version"
export HOMEBREW_NO_INSTALL_CLEANUP=TRUE
brew tap --shallow shivammathur/homebrew-php
brew install shivammathur/php/php@"$version"
brew link --force --overwrite php@"$version" brew link --force --overwrite php@"$version"
} }
# Function to configure PHP
configure_php() {
(
echo -e "date.timezone=UTC\nmemory_limit=-1"
[[ "$version" =~ 8.0 ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
[[ "$version" =~ 7.[2-4]|8.0 ]] && echo -e "xdebug.mode=coverage"
) | sudo tee -a "$ini_file" >/dev/null
}
# Variables # Variables
tick="✓" tick="✓"
cross="✗" cross="✗"
version=$1 version=$1
dist=$2
tool_path_dir="/usr/local/bin" tool_path_dir="/usr/local/bin"
curl_opts=(-sL)
composer_bin="$HOME/.composer/vendor/bin"
composer_json="$HOME/.composer/composer.json"
composer_lock="$HOME/.composer/composer.lock"
brew_prefix="$(brew --prefix)"
brew_repo="$(brew --repository)"
tap_dir="$brew_repo"/Library/Taps
existing_version=$(php-config --version 2>/dev/null | cut -c 1-3) existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
export HOMEBREW_CHANGE_ARCH_TO_ARM=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
# Setup PHP # Setup PHP
step_log "Setup PHP" step_log "Setup PHP"
@ -201,10 +302,15 @@ else
fi fi
ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
sudo chmod 777 "$ini_file" "$tool_path_dir" sudo chmod 777 "$ini_file" "$tool_path_dir"
echo "date.timezone=UTC" >>"$ini_file" configure_php
ext_dir=$(php -i | grep -Ei "extension_dir => /(usr|opt)" | sed -e "s|.*=> s*||") ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||") scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
sudo mkdir -p "$ext_dir" sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
semver=$(php -v | head -n 1 | cut -f 2 -d ' ') semver=$(php -v | head -n 1 | cut -f 2 -d ' ')
if [ "${semver%.*}" != "$version" ]; then
add_log "$cross" "PHP" "Could not setup PHP $version"
exit 1
fi
configure_pecl configure_pecl
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "$tick" "PHP" "$status PHP $semver" add_log "$tick" "PHP" "$status PHP $semver"

View File

@ -1,5 +0,0 @@
cd ~ && git clone --depth=1 https://github.com/krakjoe/pcov.git
cd pcov && phpize
./configure --enable-pcov
make
sudo make install

View File

@ -22,7 +22,7 @@ update_ppa() {
install_phalcon() { install_phalcon() {
extension=$1 extension=$1
version=$2 version=$2
(update_ppa && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "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

@ -1,3 +0,0 @@
cd ~ && git clone --depth=1 https://github.com/xdebug/xdebug.git
cd xdebug || echo "Failed to clone Xdebug"
sudo ./rebuild.sh

View File

@ -1,6 +0,0 @@
cd ~ && git clone --depth=1 https://github.com/xdebug/xdebug.git
cd xdebug || echo "Failed to clone Xdebug"
sudo phpize
sudo ./configure
sudo make
sudo cp modules/xdebug.so "$(php -i | grep "extension_dir => /opt" | sed -e "s|.*=> s*||")"

View File

@ -16,38 +16,71 @@ add_log() {
fi fi
} }
# Function to update php ppa # Function to backup and cleanup package lists.
cleanup_lists() {
if [ ! -e /etc/apt/sources.list.d.save ]; then
sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
sudo mkdir /etc/apt/sources.list.d
sudo mv /etc/apt/sources.list.d.save/*ondrej*.list /etc/apt/sources.list.d/
sudo mv /etc/apt/sources.list.d.save/*dotdeb*.list /etc/apt/sources.list.d/ 2>/dev/null || true
trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/ 2>/dev/null" exit
fi
}
# Function to add ppa:ondrej/php.
add_ppa() {
if ! apt-cache policy | grep -q ondrej/php; then
cleanup_lists
LC_ALL=C.UTF-8 sudo apt-add-repository ppa:ondrej/php -y
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
sudo "$debconf_fix" apt-get update
fi
fi
}
# Function to update the package lists.
update_lists() { update_lists() {
if [ "$lists_updated" = "false" ]; then if [ ! -e /tmp/setup_php ]; then
[ "$DISTRIB_RELEASE" = "20.04" ] && add_ppa >/dev/null 2>&1
cleanup_lists
sudo "$debconf_fix" apt-get update >/dev/null 2>&1 sudo "$debconf_fix" apt-get update >/dev/null 2>&1
echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1
fi fi
} }
# Function to configure PECL # Function to configure PECL
configure_pecl() { configure_pecl() {
if [ "$pecl_config" = "false" ] && [ -e /usr/bin/pecl ]; then if ! [ -e /tmp/pecl_config ]; then
for tool in pear pecl; do if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then
sudo "$tool" config-set php_ini "$pecl_file" >/dev/null 2>&1 add_pecl >/dev/null 2>&1
sudo "$tool" config-set auto_discover 1 >/dev/null 2>&1 fi
sudo "$tool" channel-update "$tool".php.net >/dev/null 2>&1 for script in pear pecl; do
sudo "$script" config-set php_ini "${pecl_file:-$ini_file}" >/dev/null 2>&1
sudo "$script" channel-update "$script".php.net >/dev/null 2>&1
done done
pecl_config="true" echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
fi fi
} }
# Fuction to get the PECL version # Function to get the PECL version
get_pecl_version() { get_pecl_version() {
extension=$1 extension=$1
stability=$2 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 -q -sSL "$pecl_rest$extension"/allreleases.xml) response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
pecl_version=$(echo "$response" | grep -m 1 -Po "(\d*\.\d*\.\d*$stability\d*)") pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)")
if [ ! "$pecl_version" ]; then if [ ! "$pecl_version" ]; then
pecl_version=$(echo "$response" | grep -m 1 -Po "(\d*\.\d*\.\d*)") pecl_version=$(echo "$response" | grep -m 1 -Eo "([0-9]+\.[0-9]+\.[0-9]+)")
fi fi
echo "$pecl_version" echo "$pecl_version"
} }
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1
yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
}
# Function to test if extension is loaded # Function to test if extension is loaded
check_extension() { check_extension() {
extension=$1 extension=$1
@ -61,8 +94,8 @@ check_extension() {
# Function to delete extensions # Function to delete extensions
delete_extension() { delete_extension() {
extension=$1 extension=$1
sudo sed -i "/$extension/d" "$ini_file" sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file"
sudo sed -i "/$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
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
} }
@ -87,8 +120,7 @@ add_extension() {
add_log "$tick" "$extension" "Enabled" add_log "$tick" "$extension" "Enabled"
elif ! check_extension "$extension"; then elif ! check_extension "$extension"; then
eval "$install_command" >/dev/null 2>&1 || eval "$install_command" >/dev/null 2>&1 ||
(update_lists && eval "$install_command" >/dev/null 2>&1) || (update_lists && eval "$install_command" >/dev/null 2>&1) || pecl_install "$extension"
sudo pecl install -f "$extension" >/dev/null 2>&1
(check_extension "$extension" && add_log "$tick" "$extension" "Installed and enabled") || (check_extension "$extension" && 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"
fi fi
@ -100,6 +132,10 @@ add_pecl_extension() {
extension=$1 extension=$1
pecl_version=$2 pecl_version=$2
prefix=$3 prefix=$3
configure_pecl
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
pecl_version=$(get_pecl_version "$extension" "$pecl_version")
fi
if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
echo "$prefix=$ext_dir/$extension.so" >>"$pecl_file" echo "$prefix=$ext_dir/$extension.so" >>"$pecl_file"
fi fi
@ -125,22 +161,27 @@ add_unstable_extension() {
add_pecl_extension "$extension" "$pecl_version" "$prefix" add_pecl_extension "$extension" "$pecl_version" "$prefix"
} }
# Function to update extension # Function to configure composer
update_extension() { configure_composer() {
extension=$1 tool_path=$1
latest_version=$2 sudo ln -sf "$tool_path" "$tool_path.phar"
current_version=$(php -r "echo phpversion('$extension');") php -r "try {\$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception \$e) {exit(1);}"
final_version=$(printf "%s\n%s" "$current_version" "$latest_version" | sort | tail -n 1) if [ $? -eq 1 ]; then
if [ "$final_version" != "$current_version" ]; then add_log "$cross" "composer" "Could not download composer"
version_exists=$(apt-cache policy -- *"$extension" | grep "$final_version") exit 1;
if [ -z "$version_exists" ]; then fi
update_lists if ! [ -e "$composer_json" ]; then
fi echo '{}' | tee "$composer_json" >/dev/null 2>&1
$apt_install php"$version"-"$extension" sudo chmod 644 "$composer_json"
fi
composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
fi fi
} }
# Function to setup a remote tool # Function to setup a remote tool.
add_tool() { add_tool() {
url=$1 url=$1
tool=$2 tool=$2
@ -148,15 +189,21 @@ add_tool() {
if [ ! -e "$tool_path" ]; then if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path" rm -rf "$tool_path"
fi fi
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" -L "$url") if [ "$tool" = "composer" ]; then
IFS="," read -r -a urls <<< "$url"
status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
else
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
fi
if [ "$status_code" != "200" ] && [[ "$url" =~ .*github.com.*releases.*latest.* ]]; then
url="${url//releases\/latest\/download/releases/download/$(curl "${curl_opts[@]}" "$(echo "$url" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "$url" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
fi
if [ "$status_code" = "200" ]; then if [ "$status_code" = "200" ]; then
sudo chmod a+x "$tool_path" sudo chmod a+x "$tool_path"
if [ "$tool" = "composer" ]; then if [ "$tool" = "composer" ]; then
composer -q global config process-timeout 0 configure_composer "$tool_path"
echo "::add-path::/home/$USER/.composer/vendor/bin"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
fi
elif [ "$tool" = "cs2pr" ]; then elif [ "$tool" = "cs2pr" ]; then
sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path" sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
elif [ "$tool" = "phive" ]; then elif [ "$tool" = "phive" ]; then
@ -167,6 +214,7 @@ add_tool() {
add_log "$tick" "$tool" "Added" add_log "$tick" "$tool" "Added"
else else
add_log "$cross" "$tool" "Could not setup $tool" add_log "$cross" "$tool" "Could not setup $tool"
[ "$tool" = "composer" ] && exit 1
fi fi
} }
@ -176,9 +224,16 @@ add_composertool() {
release=$2 release=$2
prefix=$3 prefix=$3
( (
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
composer global require "$prefix$release" >/dev/null 2>&1 && composer global require "$prefix$release" >/dev/null 2>&1 &&
add_log "$tick" "$tool" "Added" add_log "$tick" "$tool" "Added"
) || add_log "$cross" "$tool" "Could not setup $tool" ) || add_log "$cross" "$tool" "Could not setup $tool"
if [ -e "$composer_bin/composer" ]; then
sudo cp -p "$tool_path_dir/composer" "$composer_bin"
fi
if [ "$tool" = "codeception" ]; then
sudo ln -s "$composer_bin"/codecept "$composer_bin"/codeception
fi
} }
# Function to setup phpize and php-config # Function to setup phpize and php-config
@ -193,7 +248,17 @@ add_devtools() {
# Function to setup the nightly build from master branch # Function to setup the nightly build from master branch
setup_master() { setup_master() {
curl -sSL https://github.com/shivammathur/php-builder/releases/latest/download/install.sh | bash -s "github" curl "${curl_opts[@]}" https://github.com/shivammathur/php-builder/releases/latest/download/install.sh | bash -s "github"
}
add_packaged_php() {
if [ "${use_package_cache:-true}" = "false" ]; then
update_lists
IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
$apt_install "${packages[@]}"
else
curl "${curl_opts[@]}" https://github.com/shivammathur/php-ubuntu/releases/latest/download/install.sh | bash -s "$version"
fi
} }
# Function to setup PECL # Function to setup PECL
@ -224,29 +289,40 @@ php_semver() {
fi fi
} }
# Function to configure PHP
configure_php() {
(
echo -e "date.timezone=UTC\nmemory_limit=-1"
[[ "$version" =~ 8.0 ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
[[ "$version" =~ 7.[2-4]|8.0 ]] && echo -e "xdebug.mode=coverage"
) | sudo tee -a "$pecl_file" >/dev/null
}
# Variables # Variables
tick="✓" tick="✓"
cross="✗" cross="✗"
lists_updated="false"
pecl_config="false"
version=$1 version=$1
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"
tool_path_dir="/usr/local/bin" tool_path_dir="/usr/local/bin"
curl_opts=(-sL)
composer_bin="$HOME/.composer/vendor/bin"
composer_json="$HOME/.composer/composer.json"
composer_lock="$HOME/.composer/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
step_log "Setup PHP" step_log "Setup PHP"
sudo mkdir -p /var/run /run/php sudo mkdir -m 777 -p "$HOME/.composer" /var/run /run/php
. /etc/lsb-release
if [ "$existing_version" != "$version" ]; then if [ "$existing_version" != "$version" ]; then
if [ ! -e "/usr/bin/php$version" ]; then if [ ! -e "/usr/bin/php$version" ]; then
if [ "$version" = "8.0" ]; then if [ "$version" = "8.0" ]; then
setup_master >/dev/null 2>&1 setup_master >/dev/null 2>&1
else else
update_lists add_packaged_php >/dev/null 2>&1
IFS=' ' read -r -a packages <<< "$(echo "curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
$apt_install php"$version" "${packages[@]}" >/dev/null 2>&1
fi fi
status="Installed" status="Installed"
else else
@ -258,11 +334,18 @@ else
status="Found" status="Found"
fi fi
if ! command -v php"$version" >/dev/null; then
add_log "$cross" "PHP" "Could not setup PHP $version"
exit 1
fi
semver=$(php_semver) semver=$(php_semver)
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||") scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||") ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
pecl_file="$scan_dir"/99-pecl.ini pecl_file="$scan_dir"/99-pecl.ini
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1 echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
configure_php
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir" sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir"
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "$tick" "PHP" "$status PHP $semver" add_log "$tick" "PHP" "$status PHP $semver"

View File

@ -8,7 +8,7 @@ param (
[ValidateNotNull()] [ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)] [ValidateLength(1, [int]::MaxValue)]
[string] [string]
$dir $dist
) )
Function Step-Log($message) { Function Step-Log($message) {
@ -43,15 +43,36 @@ Function Add-ToProfile {
} }
} }
Function Install-PhpManager() { Function Add-Printf {
$repo = "mlocati/powershell-phpmanager" if (-not(Test-Path "C:\Program Files\Git\usr\bin\printf.exe")) {
$zip_file = "$php_dir\PhpManager.zip" if(Test-Path "C:\msys64\usr\bin\printf.exe") {
$tag = (Invoke-RestMethod https://api.github.com/repos/$repo/tags)[0].Name New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe
$module_path = "$php_dir\PhpManager\powershell-phpmanager-$tag\PhpManager" } else {
Invoke-WebRequest -UseBasicParsing -Uri https://github.com/$repo/archive/$tag.zip -OutFile $zip_file Invoke-WebRequest -UseBasicParsing -Uri "$github/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$php_dir\printf.zip"
Expand-Archive -Path $zip_file -DestinationPath $php_dir\PhpManager -Force Expand-Archive -Path $php_dir\printf.zip -DestinationPath $php_dir -Force
}
} else {
New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe"
}
}
Function Install-PSPackage() {
param(
[Parameter(Position = 0, Mandatory = $true)]
$package,
[Parameter(Position = 1, Mandatory = $true)]
$psm1_path,
[Parameter(Position = 2, Mandatory = $true)]
$url
)
$module_path = "$php_dir\$psm1_path.psm1"
if(-not (Test-Path $module_path -PathType Leaf)) {
$zip_file = "$php_dir\$package.zip"
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $zip_file
Expand-Archive -Path $zip_file -DestinationPath $php_dir -Force
}
Import-Module $module_path Import-Module $module_path
Add-ToProfile $current_profile "PhpManager" "Import-Module $module_path" Add-ToProfile $current_profile "$package-search" "Import-Module $module_path"
} }
Function Add-Extension { Function Add-Extension {
@ -65,7 +86,12 @@ Function Add-Extension {
[ValidateNotNull()] [ValidateNotNull()]
[ValidateSet('stable', 'beta', 'alpha', 'devel', 'snapshot')] [ValidateSet('stable', 'beta', 'alpha', 'devel', 'snapshot')]
[string] [string]
$mininum_stability = 'stable' $stability = 'stable',
[Parameter(Position = 2, Mandatory = $false)]
[ValidateNotNull()]
[ValidatePattern('^\d+(\.\d+){0,2}$')]
[string]
$extension_version = ''
) )
try { try {
$extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension } $extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension }
@ -84,7 +110,12 @@ Function Add-Extension {
} }
} }
else { else {
Install-PhpExtension -Extension $extension -MinimumStability $mininum_stability -Path $php_dir if($extension_version -ne '') {
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir
} else {
Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir
}
Add-Log $tick $extension "Installed and enabled" Add-Log $tick $extension "Installed and enabled"
} }
} }
@ -109,12 +140,35 @@ Function Remove-Extension() {
} }
} }
Function Add-Tool() {
Param ( Function Edit-ComposerConfig() {
Param(
[Parameter(Position = 0, Mandatory = $true)] [Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)] [ValidateLength(1, [int]::MaxValue)]
[string] [string]
$tool_path
)
Copy-Item $tool_path -Destination "$tool_path.phar"
php -r "try {`$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception `$e) {exit(1);}"
if ($? -eq $False) {
Add-Log "$cross" "composer" "Could not download composer"
exit 1;
}
if (-not(Test-Path $composer_json)) {
Set-Content -Path $composer_json -Value "{}"
}
composer -q config -g process-timeout 0
Write-Output $composer_bin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8
if (Test-Path env:COMPOSER_TOKEN) {
composer -q config -g github-oauth.github.com $env:COMPOSER_TOKEN
}
}
Function Add-Tool() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
$url, $url,
[Parameter(Position = 1, Mandatory = $true)] [Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
@ -125,36 +179,42 @@ Function Add-Tool() {
if (Test-Path $php_dir\$tool) { if (Test-Path $php_dir\$tool) {
Remove-Item $php_dir\$tool Remove-Item $php_dir\$tool
} }
if($url.Count -gt 1) { $url = $url[0] }
if ($tool -eq "symfony") { if ($tool -eq "symfony") {
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool.exe Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool.exe
Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.exe" > $null 2>&1 Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.exe" >$null 2>&1
} else { } else {
try { try {
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool
$bat_content = @() } catch {
$bat_content += "@ECHO off" if($url -match '.*github.com.*releases.*latest.*') {
$bat_content += "setlocal DISABLEDELAYEDEXPANSION" try {
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool $url = $url.replace("releases/latest/download", "releases/download/" + ([regex]::match((Invoke-WebRequest -UseBasicParsing -Uri ($url.split('/release')[0] + "/releases")).Content, "([0-9]+\.[0-9]+\.[0-9]+)/" + ($url.Substring($url.LastIndexOf("/") + 1))).Groups[0].Value).split('/')[0])
$bat_content += "php %BIN_TARGET% %*" Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool
Set-Content -Path $php_dir\$tool.bat -Value $bat_content } catch { }
Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.bat" > $null 2>&1 }
} catch { }
}
if($tool -eq "phive") {
Add-Extension curl >$null 2>&1
Add-Extension mbstring >$null 2>&1
Add-Extension xml >$null 2>&1
} elseif($tool -eq "cs2pr") {
(Get-Content $php_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $php_dir/cs2pr
} elseif($tool -eq "composer") {
composer -q global config process-timeout 0
Write-Output "::add-path::$env:APPDATA\Composer\vendor\bin"
if (Test-Path env:COMPOSER_TOKEN) {
composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
} }
} }
if (((Get-ChildItem -Path $php_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) { if (((Get-ChildItem -Path $php_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) {
$bat_content = @()
$bat_content += "@ECHO off"
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool
$bat_content += "php %BIN_TARGET% %*"
Set-Content -Path $php_dir\$tool.bat -Value $bat_content
Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.bat" >$null 2>&1
if($tool -eq "composer") {
Edit-ComposerConfig $php_dir\$tool
} elseif($tool -eq "cs2pr") {
(Get-Content $php_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $php_dir/cs2pr
} elseif($tool -eq "phan") {
Add-Extension fileinfo >$null 2>&1
Add-Extension ast >$null 2>&1
} elseif($tool -eq "phive") {
Add-Extension xml >$null 2>&1
} elseif($tool -eq "wp-cli") {
Copy-Item $php_dir\wp-cli.bat -Destination $php_dir\wp.bat
}
Add-Log $tick $tool "Added" Add-Log $tick $tool "Added"
} else { } else {
Add-Log $cross $tool "Could not add $tool" Add-Log $cross $tool "Could not add $tool"
@ -179,12 +239,21 @@ Function Add-Composertool() {
[string] [string]
$prefix $prefix
) )
if(Test-Path $composer_lock) {
Remove-Item -Path $composer_lock -Force
}
composer -q global require $prefix$release 2>&1 | out-null composer -q global require $prefix$release 2>&1 | out-null
if($tool -eq "codeception") {
Copy-Item $composer_bin\codecept.bat -Destination $composer_bin\codeception.bat
}
if($?) { if($?) {
Add-Log $tick $tool "Added" Add-Log $tick $tool "Added"
} else { } else {
Add-Log $cross $tool "Could not setup $tool" Add-Log $cross $tool "Could not setup $tool"
} }
if(Test-Path $composer_bin\composer) {
Copy-Item -Path "$php_dir\composer" -Destination "$composer_bin\composer" -Force
}
} }
Function Add-Pecl() { Function Add-Pecl() {
@ -198,6 +267,10 @@ $php_dir = 'C:\tools\php'
$ext_dir = "$php_dir\ext" $ext_dir = "$php_dir\ext"
$current_profile = "$PSHOME\Profile.ps1" $current_profile = "$PSHOME\Profile.ps1"
$ProgressPreference = 'SilentlyContinue' $ProgressPreference = 'SilentlyContinue'
$github = 'https://github.com'
$composer_bin = "$env:APPDATA\Composer\vendor\bin"
$composer_json = "$env:APPDATA\Composer\composer.json"
$composer_lock = "$env:APPDATA\Composer\composer.lock"
$master_version = '8.0' $master_version = '8.0'
$arch = 'x64' $arch = 'x64'
$ts = $env:PHPTS -eq 'ts' $ts = $env:PHPTS -eq 'ts'
@ -208,8 +281,9 @@ if(-not(Test-Path -LiteralPath $current_profile)) {
New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1 New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1
} }
Add-Printf >$null 2>&1
Step-Log "Setup PhpManager" Step-Log "Setup PhpManager"
Install-PhpManager >$null 2>&1 Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" >$null 2>&1
Add-Log $tick "PhpManager" "Installed" Add-Log $tick "PhpManager" "Installed"
Step-Log "Setup PHP" Step-Log "Setup PHP"
@ -222,26 +296,34 @@ if (Test-Path -LiteralPath $php_dir -PathType Container) {
$status = "Installed" $status = "Installed"
if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) { if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) {
if ($version -lt '7.0') { if ($version -lt '7.0') {
Install-Module -Name VcRedist -Force Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" >$null 2>&1
$arch='x86' $arch='x86'
} }
if ($version -eq $master_version) { try {
$version = 'master' 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
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force >$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
}
} catch { }
} else { } else {
$status = "Found" $status = "Found"
} }
$installed = Get-Php -Path $php_dir $installed = Get-Php -Path $php_dir
Set-PhpIniKey -Key 'date.timezone' -Value 'UTC' -Path $php_dir if($installed.MajorMinorVersion -ne $version) {
Add-Log $cross "PHP" "Could not setup PHP $version"
exit 1
}
('date.timezone=UTC', 'memory_limit=-1', 'xdebug.mode=coverage') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
# Patch till there is a pcov DLL for PHP 8.0 on pecl
if ($version -eq '8.0') {
Invoke-WebRequest -Uri "https://github.com/shivammathur/php-extensions-windows/releases/latest/download/php$version`_$env:PHPTS`_$arch`_pcov.dll" -OutFile $php_dir"\ext\php`_pcov.dll"
}
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
if ($version -eq 'master') { Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/shivammathur/php-extensions-windows/releases/latest/download/php_$env:phpts`_$arch`_pcov.dll" -OutFile $ext_dir"\php_pcov.dll" >$null 2>&1 New-Item -ItemType Directory -Path $composer_bin -Force 2>&1 | Out-Null
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/shivammathur/php-extensions-windows/releases/latest/download/php_$env:phpts`_$arch`_xdebug.dll" -OutFile $ext_dir"\php_xdebug.dll" >$null 2>&1
Set-PhpIniKey -Key 'opcache.jit_buffer_size' -Value '256M' -Path $php_dir
Set-PhpIniKey -Key 'opcache.jit' -Value '1235' -Path $php_dir
}
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)" Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"

View File

@ -99,93 +99,26 @@ export async function getUri(
} }
} }
/**
* Helper function to get the codeception url
*
* @param version
* @param suffix
*/
export async function getCodeceptionUriBuilder(
version: string,
suffix: string
): Promise<string> {
return ['releases', version, suffix, 'codecept.phar']
.filter(Boolean)
.join('/');
}
/**
* Function to get the codeception url
*
* @param version
* @param php_version
*/
export async function getCodeceptionUri(
version: string,
php_version: string
): Promise<string> {
const codecept: string = await getCodeceptionUriBuilder(version, '');
const codecept54: string = await getCodeceptionUriBuilder(version, 'php54');
const codecept56: string = await getCodeceptionUriBuilder(version, 'php56');
// Refer to https://codeception.com/builds
switch (true) {
case /latest/.test(version):
switch (true) {
case /5\.6|7\.[0|1]/.test(php_version):
return 'php56/codecept.phar';
case /7\.[2-4]/.test(php_version):
default:
return 'codecept.phar';
}
case /(^[4-9]|\d{2,})\..*/.test(version):
switch (true) {
case /5\.6|7\.[0|1]/.test(php_version):
return codecept56;
case /7\.[2-4]/.test(php_version):
default:
return codecept;
}
case /(^2\.[4-5]\.\d+|^3\.[0-1]\.\d+).*/.test(version):
switch (true) {
case /5\.6/.test(php_version):
return codecept54;
case /7\.[0-4]/.test(php_version):
default:
return codecept;
}
case /^2\.3\.\d+.*/.test(version):
switch (true) {
case /5\.[4-6]/.test(php_version):
return codecept54;
case /^7\.[0-4]$/.test(php_version):
default:
return codecept;
}
case /(^2\.(1\.([6-9]|\d{2,}))|^2\.2\.\d+).*/.test(version):
switch (true) {
case /5\.[4-5]/.test(php_version):
return codecept54;
case /5.6|7\.[0-4]/.test(php_version):
default:
return codecept;
}
case /(^2\.(1\.[0-5]|0\.\d+)|^1\.[6-8]\.\d+).*/.test(version):
return codecept;
default:
return codecept;
}
}
/** /**
* Helper function to get script to setup phive * Helper function to get script to setup phive
* *
* @param version * @param version
* @param php_version
* @param os_version * @param os_version
*/ */
export async function addPhive( export async function addPhive(
version: string, version: string,
php_version: string,
os_version: string os_version: string
): Promise<string> { ): Promise<string> {
switch (true) {
case /5\.6|7\.0/.test(php_version):
version = version.replace('latest', '0.12.1');
break;
case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5');
break;
}
switch (version) { switch (version) {
case 'latest': case 'latest':
return ( return (
@ -282,15 +215,19 @@ export async function getSymfonyUri(
*/ */
export async function addComposer(tools_list: string[]): Promise<string[]> { export async function addComposer(tools_list: string[]): Promise<string[]> {
const regex_any = /^composer($|:.*)/; const regex_any = /^composer($|:.*)/;
const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$)/; const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
const regex_composer1_tools = /hirak|prestissimo|narrowspark|composer-prefetcher/;
const matches: string[] = tools_list.filter(tool => regex_valid.test(tool)); const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
let composer = 'composer'; let composer = 'composer';
tools_list = tools_list.filter(tool => !regex_any.test(tool)); tools_list = tools_list.filter(tool => !regex_any.test(tool));
switch (matches[0]) { switch (true) {
case undefined: case regex_composer1_tools.test(tools_list.join(' ')):
composer = 'composer:1';
break;
case matches[0] == undefined:
break; break;
default: default:
composer = matches[matches.length - 1].replace(/v([1-2])/, '$1'); composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1');
break; break;
} }
tools_list.unshift(composer); tools_list.unshift(composer);
@ -298,27 +235,25 @@ export async function addComposer(tools_list: string[]): Promise<string[]> {
} }
/** /**
* Function to get script to update composer * Function to get composer URL for a given version
* *
* @param version * @param version
* @param os_version
*/ */
export async function updateComposer( export async function getComposerUrl(version: string): Promise<string> {
version: string, let cache_url = `https://github.com/shivammathur/composer-cache/releases/latest/download/composer-${version.replace(
os_version: string 'latest',
): Promise<string> { 'stable'
switch (version) { )}.phar`;
case 'snapshot': switch (true) {
case 'preview': case /^snapshot$/.test(version):
case '1': return `${cache_url},https://getcomposer.org/composer.phar`;
case '2': case /^preview$|^[1-2]$/.test(version):
return ( return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
'\ncomposer self-update --' + case /^\d+\.\d+\.\d+[\w-]*$/.test(version):
version + cache_url = `https://github.com/composer/composer/releases/download/${version}/composer.phar`;
(await utils.suppressOutput(os_version)) return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
);
default: default:
return ''; return `${cache_url},https://getcomposer.org/composer-stable.phar`;
} }
} }
@ -336,7 +271,10 @@ export async function getCleanedToolsList(
.map(function (extension: string) { .map(function (extension: string) {
return extension return extension
.trim() .trim()
.replace(/robmorgan\/|hirak\/|narrowspark\/automatic-/, ''); .replace(
/codeception\/|hirak\/|robmorgan\/|narrowspark\/automatic-/,
''
);
}) })
.filter(Boolean); .filter(Boolean);
return [...new Set(tools_list)]; return [...new Set(tools_list)];
@ -346,13 +284,11 @@ export async function getCleanedToolsList(
* Helper function to get script to setup a tool using a phar url * Helper function to get script to setup a tool using a phar url
* *
* @param tool * @param tool
* @param version
* @param url * @param url
* @param os_version * @param os_version
*/ */
export async function addArchive( export async function addArchive(
tool: string, tool: string,
version: string,
url: string, url: string,
os_version: string os_version: string
): Promise<string> { ): Promise<string> {
@ -445,53 +381,48 @@ export async function addTools(
case 'cs2pr': case 'cs2pr':
uri = await getUri(tool, '', version, 'releases', '', 'download'); uri = await getUri(tool, '', version, 'releases', '', 'download');
url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri; url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'php-cs-fixer': case 'php-cs-fixer':
uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download'); uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download');
url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri; url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'phpcs': case 'phpcs':
case 'phpcbf': case 'phpcbf':
url = github + 'squizlabs/PHP_CodeSniffer/' + uri; url = github + 'squizlabs/PHP_CodeSniffer/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'phive': case 'phive':
script += await addPhive(version, os_version); script += await addPhive(version, php_version, os_version);
break; break;
case 'phpstan': case 'phpstan':
url = github + 'phpstan/phpstan/' + uri; url = github + 'phpstan/phpstan/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'phpmd': case 'phpmd':
url = github + 'phpmd/phpmd/' + uri; url = github + 'phpmd/phpmd/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'psalm': case 'psalm':
url = github + 'vimeo/psalm/' + uri; url = github + 'vimeo/psalm/' + uri;
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'composer': case 'composer':
url = 'https://getcomposer.org/composer-stable.phar'; url = await getComposerUrl(version);
script += script += await addArchive('composer', url, os_version);
(await addArchive('composer', version, url, os_version)) +
(await updateComposer(version, os_version));
break; break;
case 'codeception': case 'codeception':
url = script += await addPackage(tool, release, 'codeception/', os_version);
'https://codeception.com/' +
(await getCodeceptionUri(version, php_version));
script += await addArchive(tool, version, url, os_version);
break; break;
case 'phpcpd': case 'phpcpd':
case 'phpunit': case 'phpunit':
url = await getPharUrl('https://phar.phpunit.de', tool, '', version); url = await getPharUrl('https://phar.phpunit.de', tool, '', version);
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'deployer': case 'deployer':
url = await getDeployerUrl(version); url = await getDeployerUrl(version);
script += await addArchive(tool, version, url, os_version); script += await addArchive(tool, url, os_version);
break; break;
case 'phinx': case 'phinx':
script += await addPackage(tool, release, 'robmorgan/', os_version); script += await addPackage(tool, release, 'robmorgan/', os_version);
@ -518,7 +449,7 @@ export async function addTools(
case 'symfony-cli': case 'symfony-cli':
uri = await getSymfonyUri(version, os_version); uri = await getSymfonyUri(version, os_version);
url = github + 'symfony/cli/' + uri; url = github + 'symfony/cli/' + uri;
script += await addArchive('symfony', version, url, os_version); script += await addArchive('symfony', url, os_version);
break; break;
default: default:
script += await utils.addLog( script += await utils.addLog(

View File

@ -1,7 +1,24 @@
import {IncomingMessage} from 'http';
import * as fs from 'fs'; import * as fs from 'fs';
import * as https from 'https';
import * as path from 'path'; import * as path from 'path';
import * as core from '@actions/core'; import * as core from '@actions/core';
/**
* Function to read environment variable and return a string value.
*
* @param property
*/
export async function readEnv(property: string): Promise<string> {
const value = process.env[property];
switch (value) {
case undefined:
return '';
default:
return value;
}
}
/** /**
* Function to get inputs from both with and env annotations. * Function to get inputs from both with and env annotations.
* *
@ -12,13 +29,56 @@ export async function getInput(
name: string, name: string,
mandatory: boolean mandatory: boolean
): Promise<string> { ): Promise<string> {
const input = process.env[name]; const input = core.getInput(name);
switch (input) { const env_input = await readEnv(name);
case '': switch (true) {
case undefined: case input != '':
return core.getInput(name, {required: mandatory});
default:
return input; return input;
case input == '' && env_input != '':
return env_input;
case input == '' && env_input == '' && mandatory:
throw new Error(`Input required and not supplied: ${name}`);
default:
return '';
}
}
/**
* Function to fetch an URL
*
* @param url
*/
export async function fetch(url: string): Promise<string> {
const fetch_promise: Promise<string> = 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<string> {
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';
}
} }
} }
@ -190,8 +250,7 @@ export async function extensionArray(
return extension return extension
.trim() .trim()
.toLowerCase() .toLowerCase()
.replace('php-', '') .replace(/^php[-_]/, '');
.replace('php_', '');
}) })
.filter(Boolean); .filter(Boolean);
} }
@ -210,9 +269,12 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
return []; return [];
default: default:
return values_csv return values_csv
.split(',') .split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/)
.map(function (value: string) { .map(function (value) {
return value.trim(); return value
.trim()
.replace(/^["']|["']$|(?<==)["']/g, '')
.replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/, "='$1'");
}) })
.filter(Boolean); .filter(Boolean);
} }
@ -224,14 +286,11 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
* @param extension * @param extension
*/ */
export async function getExtensionPrefix(extension: string): Promise<string> { export async function getExtensionPrefix(extension: string): Promise<string> {
const zend: Array<string> = ['xdebug', 'opcache', 'ioncube', 'eaccelerator']; switch (true) {
switch (zend.indexOf(extension)) {
case 0:
case 1:
return 'zend_extension';
case -1:
default: default:
return 'extension'; return 'extension';
case /xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(extension):
return 'zend_extension';
} }
} }