mirror of
				https://github.com/shivammathur/setup-php.git
				synced 2025-10-31 23:36:21 +07:00 
			
		
		
		
	Compare commits
	
		
			145 Commits
		
	
	
		
			1.9.2
			...
			releases/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 28c92ba4ee | |||
| ffd019edc6 | |||
| 0e506b34ac | |||
| aa0ecfbc6f | |||
| f29cd24dbf | |||
| 2a41b9d1ba | |||
| 2a0c477416 | |||
| 61aa0dc2f9 | |||
| f4e1b8d33e | |||
| e3a498a6a5 | |||
| fbdd58c5bc | |||
| 2c5cb7a75e | |||
| ab12e42197 | |||
| 5588437714 | |||
| d7eb9ade23 | |||
| 938988b211 | |||
| e030852d0e | |||
| 3aa870b0fe | |||
| 1229133602 | |||
| b1b8d8367c | |||
| 60ff55130a | |||
| e5690a9659 | |||
| 7958a5ccff | |||
| 113a31fceb | |||
| c9aea8708f | |||
| 7435bb8e4a | |||
| 5227e2cd5c | |||
| 906893d397 | |||
| f1b6b2bbe0 | |||
| e59c938e82 | |||
| 506357cdb9 | |||
| b57416e44d | |||
| 9d1fe69816 | |||
| fec64d1788 | |||
| 32c1436247 | |||
| baab28a534 | |||
| d58b967b58 | |||
| 17f3c38947 | |||
| 988f48930d | |||
| ea50e73b1f | |||
| bc906f7414 | |||
| 8bed24ebe1 | |||
| 698464efea | |||
| 45082e25a9 | |||
| f0338c8922 | |||
| 49311db00a | |||
| 7d9584bd3f | |||
| 45df3b1713 | |||
| 70cd53866f | |||
| 12d6e834b7 | |||
| 9fdc82bced | |||
| c485e8b283 | |||
| 7a90166ec2 | |||
| 8f96f50dcd | |||
| c470f034d0 | |||
| e2ad91ce1c | |||
| cb746892c2 | |||
| 8f542eae1a | |||
| 0769672a24 | |||
| c20693a6ca | |||
| 0c0ae39775 | |||
| d27996462b | |||
| 0a5e543af7 | |||
| 0cc14f65a2 | |||
| 1ecc5fdca3 | |||
| 5520fdb61a | |||
| d0f1a91dfd | |||
| 276480411d | |||
| 827b051fea | |||
| fdaf1f0003 | |||
| 030f4839d4 | |||
| 1bb08cc017 | |||
| 678ad243bf | |||
| 20b87bc786 | |||
| 288f9953ef | |||
| 77ac7d57f1 | |||
| 8983fb3ae2 | |||
| 87a933f720 | |||
| 847ea65468 | |||
| c52ce057af | |||
| 46b357b6c2 | |||
| 2fc508f43d | |||
| d8de30560b | |||
| 02db83ef5f | |||
| 6728eaf2ad | |||
| ca291eadaf | |||
| 8185c8186b | |||
| 44cf056ba8 | |||
| 9bfde13f48 | |||
| e38eccad04 | |||
| fa211a9d07 | |||
| 5865982519 | |||
| e201830bdd | |||
| 5c4074b01a | |||
| 48f537d6d0 | |||
| bc40a61480 | |||
| 3d5fae7917 | |||
| d0591e6d7c | |||
| b108a66489 | |||
| f0a05b4f6e | |||
| 5070ebd871 | |||
| bea4065e11 | |||
| c3875408ad | |||
| 1d1c0f2595 | |||
| 1ac189066e | |||
| 74cdfb97c1 | |||
| ee05ca54f6 | |||
| 12b1061a6b | |||
| 1c6058bc18 | |||
| 2f8045c593 | |||
| 6597a6a15b | |||
| 1cc85eb670 | |||
| 6cba0a914f | |||
| c43f842cf3 | |||
| 11e062bf23 | |||
| dee3cfee50 | |||
| 26b0fcc6cd | |||
| ab62fff526 | |||
| 446bccb14d | |||
| 29d99c6866 | |||
| 1444e002ab | |||
| 03b97e24e9 | |||
| f7fb800623 | |||
| 5593bd4bd3 | |||
| 3160874a27 | |||
| db0bbd209b | |||
| d920044a54 | |||
| 818ca89f55 | |||
| 8876ac788f | |||
| 0390a48770 | |||
| 274e348895 | |||
| 37d7b37f43 | |||
| d058d52012 | |||
| 17983e66e5 | |||
| 33a005dd90 | |||
| 1870ffc08c | |||
| 70fd71ab48 | |||
| 2f1900f7bc | |||
| 19497a0597 | |||
| 5b2e081bc0 | |||
| 66fa82fbca | |||
| 4aa42214b1 | |||
| 1e2c96a4b4 | |||
| 3e8d887b0d | |||
| a3d5500a6a | 
| @ -10,7 +10,7 @@ | ||||
|     "plugin:import/warnings", | ||||
|     "plugin:import/typescript", | ||||
|     "plugin:prettier/recommended", | ||||
|     "prettier/@typescript-eslint" | ||||
|     "prettier" | ||||
|   ], | ||||
|   "plugins": ["@typescript-eslint", "jest"] | ||||
| } | ||||
							
								
								
									
										20
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							| @ -17,13 +17,6 @@ Due to time constraints, you may not always get a quick response. Please do not | ||||
|  | ||||
| ## 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 | ||||
|  | ||||
| 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 | ||||
| ``` | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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
									
									
								
							
							
						
						
									
										5
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +1,3 @@ | ||||
| # These are supported funding model platforms | ||||
|  | ||||
| github: shivammathur | ||||
| community_bridge: setup-php | ||||
| patreon: shivammathur | ||||
| custom: https://www.paypal.me/shivammathur | ||||
| github:shivammathur | ||||
							
								
								
									
										7
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
								
							| @ -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 lint` 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. | ||||
|  | ||||
							
								
								
									
										6
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
								
							| @ -6,8 +6,8 @@ The following versions of this project are supported for security updates. | ||||
|  | ||||
| | Version | Supported          | | ||||
| | ------- | ------------------ | | ||||
| | 1.9.x   | :white_check_mark: | | ||||
| | 2.3.x   | :white_check_mark: | | ||||
| | 1.11.x  | :white_check_mark: | | ||||
| | 2.14.x  | :white_check_mark: | | ||||
|  | ||||
| ## Supported PHP Versions | ||||
|  | ||||
| @ -15,10 +15,10 @@ This security policy only applies to the latest patches of the following PHP ver | ||||
|  | ||||
| | Version | Supported          | | ||||
| | ------- | ------------------ | | ||||
| | 7.2     | :white_check_mark: | | ||||
| | 7.3     | :white_check_mark: | | ||||
| | 7.4     | :white_check_mark: | | ||||
| | 8.0     | :white_check_mark: | | ||||
| | 8.1     | :white_check_mark: | | ||||
|  | ||||
| ## Reporting a Vulnerability | ||||
|  | ||||
|  | ||||
							
								
								
									
										4
									
								
								.github/codeql/codeql-configuration.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.github/codeql/codeql-configuration.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| name : CodeQL Configuration | ||||
|  | ||||
| paths: | ||||
|   - './src' | ||||
							
								
								
									
										25
									
								
								.github/workflows/codeql-workflow.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/codeql-workflow.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| name: CodeQL Workflow | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   schedule: | ||||
|     - cron: '0 15 * * 6' | ||||
| jobs: | ||||
|   codeql: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         with: | ||||
|           fetch-depth: 2 | ||||
|  | ||||
|       - name: Initialize CodeQL | ||||
|         uses: github/codeql-action/init@v1 | ||||
|         with: | ||||
|           config-file: ./.github/codeql/codeql-configuration.yml | ||||
|           languages: javascript | ||||
|  | ||||
|       - name: Autobuild | ||||
|         uses: github/codeql-action/autobuild@v1 | ||||
|  | ||||
|       - name: Perform CodeQL Analysis | ||||
|         uses: github/codeql-action/analyze@v1 | ||||
							
								
								
									
										4
									
								
								.github/workflows/main-workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/main-workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,5 +1,6 @@ | ||||
| name: Main workflow | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - releases/v1 | ||||
| @ -19,7 +20,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04, windows-latest, macos-latest] | ||||
|         operating-system: [ubuntu-20.04, ubuntu-18.04, windows-latest, macos-latest] | ||||
|         php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
| @ -49,6 +50,7 @@ jobs: | ||||
|           php -r "if(phpversion()>=7.1 && ! extension_loaded('pcov')) {throw new Exception('PCOV not found');}" | ||||
|       - name: Testing ini values | ||||
|         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('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');}" | ||||
							
								
								
									
										17
									
								
								.github/workflows/node-workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/node-workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -24,10 +24,10 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|  | ||||
|       - name: Setup Node.js 12.x | ||||
|       - name: Setup Node.js 16.x | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
|           node-version: 16.x | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm install | ||||
| @ -41,7 +41,14 @@ jobs: | ||||
|       - name: Run tests | ||||
|         run: npm test | ||||
|  | ||||
|       - name: Run npm audit | ||||
|         run: npm audit | ||||
|  | ||||
|       - name: Send Coverage | ||||
|         continue-on-error: true | ||||
|         timeout-minutes: 1 | ||||
|         run: curl -s https://codecov.io/bash | bash -s -- -t ${{secrets.CODECOV_TOKEN}} -f coverage/clover.xml -n github-actions-codecov-${{ matrix.operating-system }} | ||||
|         uses: codecov/codecov-action@v2 | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           files: coverage/lcov.info | ||||
|           name: github-actions-codecov-${{ matrix.operating-system }} | ||||
|           fail_ci_if_error: false | ||||
|           verbose: true | ||||
|  | ||||
							
								
								
									
										240
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										240
									
								
								README.md
									
									
									
									
									
								
							| @ -8,7 +8,7 @@ | ||||
|  | ||||
| <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://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="#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> | ||||
| @ -28,7 +28,6 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support | ||||
| - [Usage](#memo-usage) | ||||
|   - [Basic Setup](#basic-setup) | ||||
|   - [Matrix Setup](#matrix-setup) | ||||
|   - [Nightly Build Setup](#nightly-build-setup) | ||||
|   - [Thread Safe Setup](#thread-safe-setup)   | ||||
|   - [Cache Dependencies](#cache-dependencies) | ||||
|   - [Composer GitHub OAuth](#composer-github-oauth)   | ||||
| @ -42,27 +41,27 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support | ||||
|  | ||||
| ## :tada: PHP Support | ||||
|  | ||||
| |PHP Version|Stability|Release Support| | ||||
| |--- |--- |--- | | ||||
| |5.6|`Stable`|`End of life`| | ||||
| |7.0|`Stable`|`End of life`| | ||||
| |7.1|`Stable`|`End of life`| | ||||
| |7.2|`Stable`|`Security fixes only`| | ||||
| |7.3|`Stable`|`Active`| | ||||
| |7.4|`Stable`|`Active`| | ||||
| |8.0|`Nightly`|`In development`| | ||||
|  | ||||
| **Note:** Specifying `8.0` in `php-version` input installs a nightly build of `PHP 8.0.0-dev` with `PHP JIT`, `Union Types v2` and other [new features](https://wiki.php.net/rfc#php_80 "New features implemented in PHP 8"). See [nightly build setup](#nightly-build-setup) for more information. | ||||
| | PHP Version | Stability | Release Support       | | ||||
| |-------------|-----------|-----------------------| | ||||
| | 5.6         | `Stable`  | `End of life`         | | ||||
| | 7.0         | `Stable`  | `End of life`         | | ||||
| | 7.1         | `Stable`  | `End of life`         | | ||||
| | 7.2         | `Stable`  | `End of life`         | | ||||
| | 7.3         | `Stable`  | `End of life`         | | ||||
| | 7.4         | `Stable`  | `Security fixes only` | | ||||
| | 8.0         | `Stable`  | `Active`              | | ||||
|  | ||||
| ## :cloud: GitHub-Hosted Runner Support | ||||
|  | ||||
| |Virtual environment|YAML workflow label|Pre-installed PHP| | ||||
| |--- |--- |--- | | ||||
| |Ubuntu 16.04|`ubuntu-16.04`|`PHP 5.6` to `PHP 7.4`| | ||||
| |Ubuntu 18.04|`ubuntu-latest` or `ubuntu-18.04`|`PHP 7.1` to `PHP 7.4`| | ||||
| |Ubuntu 20.04|`ubuntu-20.04`|`PHP 7.4`| | ||||
| |Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 7.4`| | ||||
| |macOS 10.15 Catalina|`macos-latest` or `macos-10.15`|`PHP 7.4`| | ||||
| | Virtual environment  | YAML workflow label                | Pre-installed PHP      | | ||||
| |----------------------|------------------------------------|------------------------| | ||||
| | Ubuntu 20.04         | `ubuntu-latest` or `ubuntu-20.04`  | `PHP 7.4` to `PHP 8.1` | | ||||
| | Ubuntu 18.04         | `ubuntu-18.04`                     | `PHP 7.2` to `PHP 8.1` | | ||||
| | Windows Server 2022  | `windows-latest` or `windows-2022` | `PHP 8.1`              | | ||||
| | Windows Server 2019  | `windows-2019`                     | `PHP 8.1`              | | ||||
| | macOS Monterey 12.x  | `macos-12`                         | `PHP 8.1`              | | ||||
| | macOS Big Sur 11.x   | `macos-latest` or `macos-11`       | `PHP 8.1`              | | ||||
| | macOS Catalina 10.15 | `macos-10.15`                      | `PHP 8.1`              | | ||||
|  | ||||
| ## :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. | ||||
| @ -85,8 +84,9 @@ with: | ||||
|   tools: php-cs-fixer, phpunit | ||||
| ``` | ||||
|  | ||||
| To setup 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. | ||||
| To set up a particular version of a tool, specify it in the form `tool:version`.  | ||||
|  | ||||
| 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 | ||||
| uses: shivammathur/setup-php@v1 | ||||
| @ -95,6 +95,8 @@ with: | ||||
|   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. | ||||
|  | ||||
| ```yaml | ||||
| @ -210,30 +212,6 @@ jobs: | ||||
|         tools: php-cs-fixer, phpunit #optional, setup tools globally | ||||
| ``` | ||||
|  | ||||
| ### Nightly Build Setup | ||||
|  | ||||
| > 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. | ||||
| - 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. | ||||
|  | ||||
| ```yaml | ||||
| steps: | ||||
| - name: Checkout | ||||
|   uses: actions/checkout@v2 | ||||
|  | ||||
| - name: Setup PHP | ||||
|   uses: shivammathur/setup-php@v1 | ||||
|   with: | ||||
|     php-version: '8.0' | ||||
|     extensions: mbstring #optional, setup extensions | ||||
|     ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 #optional, setup php.ini configuration | ||||
|     coverage: pcov #optional, setup PCOV, Xdebug does not support this version yet. | ||||
|     tools: php-cs-fixer, phpunit #optional, setup tools globally     | ||||
| ``` | ||||
|  | ||||
| ### Thread Safe Setup | ||||
|  | ||||
| - `NTS` versions are setup by default. | ||||
| @ -264,14 +242,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. | ||||
|  | ||||
| ```yaml | ||||
| - name: Get composer cache directory | ||||
|   id: composercache | ||||
| - name: Get Composer Cache Directory | ||||
|   id: composer-cache | ||||
|   run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|  | ||||
| - name: Cache dependencies | ||||
|   uses: actions/cache@v2 | ||||
|   with: | ||||
|     path: ${{ steps.composercache.outputs.dir }} | ||||
|     path: ${{ steps.composer-cache.outputs.dir }} | ||||
|     key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|     restore-keys: ${{ runner.os }}-composer- | ||||
|  | ||||
| @ -279,10 +257,15 @@ You can persist composer's internal cache directory using the [`action/cache`](h | ||||
|   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 | ||||
| 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 | ||||
| @ -300,81 +283,152 @@ If you have a number of workflows which setup multiple tools or have many compos | ||||
|  | ||||
| ### 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 | ||||
| - 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" | ||||
| ``` | ||||
|  | ||||
| #### 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.   | ||||
| For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-pull-request-from-checkstyle).   | ||||
|  | ||||
| > Here is an example with `phpstan`. | ||||
| PHPStan supports error reporting in GitHub Actions, so no problem matchers are required. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP | ||||
|   uses: shivammathur/setup-php@v1 | ||||
|   uses: shivammathur/setup-php@v2 | ||||
|   with: | ||||
|     php-version: '7.4' | ||||
|     tools: cs2pr, phpstan | ||||
|     tools: phpstan | ||||
|  | ||||
| - name: PHPStan | ||||
|   run: phpstan analyse src --error-format=checkstyle | cs2pr | ||||
| - name: Run PHPStan | ||||
|   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 for setting up this GitHub Action with different PHP Frameworks/Packages. | ||||
|  | ||||
| |Framework/Package|Runs on|Workflow| | ||||
| |--- |--- |--- | | ||||
| |CakePHP with `MySQL` and `Redis`|`ubuntu`|[cakephp-mysql.yml](./examples/cakephp-mysql.yml "GitHub Action for CakePHP with MySQL and Redis")| | ||||
| |CakePHP with `PostgreSQL` and `Redis`|`ubuntu`|[cakephp-postgres.yml](./examples/cakephp-postgres.yml "GitHub Action for CakePHP with Postgres and Redis")| | ||||
| |CakePHP without services|`macOS`, `ubuntu` and `windows`|[cakephp.yml](./examples/cakephp.yml "GitHub Action for CakePHP without services")| | ||||
| |CodeIgniter|`macOS`, `ubuntu` and `windows`|[codeigniter.yml](./examples/codeigniter.yml "GitHub Action for CodeIgniter")| | ||||
| |Laravel with `MySQL` and `Redis`|`ubuntu`|[laravel-mysql.yml](./examples/laravel-mysql.yml "GitHub Action for Laravel with MySQL and Redis")| | ||||
| |Laravel with `PostgreSQL` and `Redis`|`ubuntu`|[laravel-postgres.yml](./examples/laravel-postgres.yml "GitHub Action for Laravel with PostgreSQL and Redis")| | ||||
| |Laravel without services|`macOS`, `ubuntu` and `windows`|[laravel.yml](./examples/laravel.yml "GitHub Action for Laravel without services")| | ||||
| |Lumen with `MySQL` and `Redis`|`ubuntu`|[lumen-mysql.yml](./examples/lumen-mysql.yml "GitHub Action for Lumen with MySQL and Redis")| | ||||
| |Lumen with `PostgreSQL` and `Redis`|`ubuntu`|[lumen-postgres.yml](./examples/lumen-postgres.yml "GitHub Action for Lumen with PostgreSQL and Redis")| | ||||
| |Lumen without services|`macOS`, `ubuntu` and `windows`|[lumen.yml](./examples/lumen.yml "GitHub Action for Lumen without services")| | ||||
| |Phalcon with `MySQL`|`ubuntu`|[phalcon-mysql.yml](./examples/phalcon-mysql.yml "GitHub Action for Phalcon with MySQL")| | ||||
| |Phalcon with `PostgreSQL`|`ubuntu`|[phalcon-postgres.yml](./examples/phalcon-postgres.yml "GitHub Action for Phalcon with PostgreSQL")| | ||||
| |Roots/bedrock|`ubuntu`|[bedrock.yml](./examples/bedrock.yml "GitHub Action for Wordpress Development using @roots/bedrock")| | ||||
| |Roots/sage|`ubuntu`|[sage.yml](./examples/sage.yml "GitHub Action for Wordpress Development using @roots/sage")| | ||||
| |Slim Framework|`macOS`, `ubuntu` and `windows`|[slim-framework.yml](./examples/slim-framework.yml "GitHub Action for Slim Framework")| | ||||
| |Symfony with `MySQL`|`ubuntu`|[symfony-mysql.yml](./examples/symfony-mysql.yml "GitHub Action for Symfony with MySQL")| | ||||
| |Symfony with `PostgreSQL`|`ubuntu`|[symfony-postgres.yml](./examples/symfony-postgres.yml "GitHub Action for Symfony with PostgreSQL")| | ||||
| |Symfony without services|`macOS`, `ubuntu` and `windows`|[symfony.yml](./examples/symfony.yml "GitHub Action for Symfony without services")| | ||||
| |Yii2 Starter Kit with `MySQL`|`ubuntu`|[yii2-mysql.yml](./examples/yii2-mysql.yml "GitHub Action for Yii2 Starter Kit with MySQL")| | ||||
| |Yii2 Starter Kit with `PostgreSQL`|`ubuntu`|[yii2-postgres.yml](./examples/yii2-postgres.yml "GitHub Action for Yii2 Starter Kit with PostgreSQL")| | ||||
| |Zend Framework|`macOS`, `ubuntu` and `windows`|[zend-framework.yml](./examples/zend-framework.yml "GitHub Action for Zend Framework")| | ||||
| | Framework/Package                     | Runs on                         | Workflow                                                                                                      | | ||||
| |---------------------------------------|---------------------------------|---------------------------------------------------------------------------------------------------------------| | ||||
| | CakePHP with `MySQL` and `Redis`      | `ubuntu`                        | [cakephp-mysql.yml](./examples/cakephp-mysql.yml "GitHub Action for CakePHP with MySQL and Redis")            | | ||||
| | CakePHP with `PostgreSQL` and `Redis` | `ubuntu`                        | [cakephp-postgres.yml](./examples/cakephp-postgres.yml "GitHub Action for CakePHP with Postgres and Redis")   | | ||||
| | CakePHP without services              | `macOS`, `ubuntu` and `windows` | [cakephp.yml](./examples/cakephp.yml "GitHub Action for CakePHP without services")                            | | ||||
| | CodeIgniter                           | `macOS`, `ubuntu` and `windows` | [codeigniter.yml](./examples/codeigniter.yml "GitHub Action for CodeIgniter")                                 | | ||||
| | Laravel with `MySQL` and `Redis`      | `ubuntu`                        | [laravel-mysql.yml](./examples/laravel-mysql.yml "GitHub Action for Laravel with MySQL and Redis")            | | ||||
| | Laravel with `PostgreSQL` and `Redis` | `ubuntu`                        | [laravel-postgres.yml](./examples/laravel-postgres.yml "GitHub Action for Laravel with PostgreSQL and Redis") | | ||||
| | Laravel without services              | `macOS`, `ubuntu` and `windows` | [laravel.yml](./examples/laravel.yml "GitHub Action for Laravel without services")                            | | ||||
| | Lumen with `MySQL` and `Redis`        | `ubuntu`                        | [lumen-mysql.yml](./examples/lumen-mysql.yml "GitHub Action for Lumen with MySQL and Redis")                  | | ||||
| | Lumen with `PostgreSQL` and `Redis`   | `ubuntu`                        | [lumen-postgres.yml](./examples/lumen-postgres.yml "GitHub Action for Lumen with PostgreSQL and Redis")       | | ||||
| | Lumen without services                | `macOS`, `ubuntu` and `windows` | [lumen.yml](./examples/lumen.yml "GitHub Action for Lumen without services")                                  | | ||||
| | Phalcon with `MySQL`                  | `ubuntu`                        | [phalcon-mysql.yml](./examples/phalcon-mysql.yml "GitHub Action for Phalcon with MySQL")                      | | ||||
| | Phalcon with `PostgreSQL`             | `ubuntu`                        | [phalcon-postgres.yml](./examples/phalcon-postgres.yml "GitHub Action for Phalcon with PostgreSQL")           | | ||||
| | Roots/bedrock                         | `ubuntu`                        | [bedrock.yml](./examples/bedrock.yml "GitHub Action for Wordpress Development using @roots/bedrock")          | | ||||
| | Roots/sage                            | `ubuntu`                        | [sage.yml](./examples/sage.yml "GitHub Action for Wordpress Development using @roots/sage")                   | | ||||
| | Slim Framework                        | `macOS`, `ubuntu` and `windows` | [slim-framework.yml](./examples/slim-framework.yml "GitHub Action for Slim Framework")                        | | ||||
| | Symfony with `MySQL`                  | `ubuntu`                        | [symfony-mysql.yml](./examples/symfony-mysql.yml "GitHub Action for Symfony with MySQL")                      | | ||||
| | Symfony with `PostgreSQL`             | `ubuntu`                        | [symfony-postgres.yml](./examples/symfony-postgres.yml "GitHub Action for Symfony with PostgreSQL")           | | ||||
| | Symfony without services              | `macOS`, `ubuntu` and `windows` | [symfony.yml](./examples/symfony.yml "GitHub Action for Symfony without services")                            | | ||||
| | Yii2 Starter Kit with `MySQL`         | `ubuntu`                        | [yii2-mysql.yml](./examples/yii2-mysql.yml "GitHub Action for Yii2 Starter Kit with MySQL")                   | | ||||
| | Yii2 Starter Kit with `PostgreSQL`    | `ubuntu`                        | [yii2-postgres.yml](./examples/yii2-postgres.yml "GitHub Action for Yii2 Starter Kit with PostgreSQL")        | | ||||
| | Zend Framework                        | `macOS`, `ubuntu` and `windows` | [zend-framework.yml](./examples/zend-framework.yml "GitHub Action for Zend Framework")                        | | ||||
|  | ||||
| ## :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 | ||||
|  | ||||
| Contributions are welcome! See [Contributor's Guide](.github/CONTRIBUTING.md "shivammathur/setup-php contribution guide"). If you face any issues while using this or want to suggest a feature/improvement, create an issue [here](https://github.com/shivammathur/setup-php/issues "Issues reported"). | ||||
|  | ||||
|  | ||||
| ## :sparkling_heart: Support This Project | ||||
|  | ||||
| If this action helped you. | ||||
| - Please star the project and share it. If you blog, please share your experience of using `setup-php`. | ||||
| - Please [reach out](mailto:contact@setup-php.com) if you have any questions about sponsoring setup-php. | ||||
|  | ||||
| - 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"). | ||||
| - Please star the project and share it with the community. | ||||
| - If you blog, write about your experience of using this action. | ||||
| - If you need any help using this, please contact me using [Codementor](https://www.codementor.io/shivammathur "Shivam Mathur Codementor") | ||||
| Many users and organisations support setup-php via [GitHub Sponsors](https://github.com/sponsors/shivammathur). | ||||
|  | ||||
| <a href="https://github.com/sponsors/shivammathur"><img src="https://setup-php.com/sponsors.svg?" alt="Sponsor shivammathur"></a> | ||||
|  | ||||
| These companies generously provide setup-php their products and services to aid in the development of this project. | ||||
|  | ||||
| <p> | ||||
|   <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> | ||||
|             | ||||
|   <a href="https://www.macstadium.com/opensource/members#gh-light-mode-only"> | ||||
|     <img src="https://setup-php.com/sponsors/macstadium.png" alt="Mac Stadium" width="148" height="60"> | ||||
|   </a> | ||||
|   <a href="https://www.macstadium.com/opensource/members#gh-dark-mode-only"> | ||||
|     <img src="https://setup-php.com/sponsors/macstadium-white.png" alt="Mac Stadium" width="148" height="60"> | ||||
|   </a> | ||||
|             | ||||
|   <a href="https://tidelift.com/subscription/pkg/npm-setup-php"> | ||||
|     <img src="https://setup-php.com/sponsors/tidelift.png" alt="Tidelift" width="70" height="60"> | ||||
|   </a> | ||||
|             | ||||
|   <a href="https://www.scaleway.com/en/about-us/open-source-program#gh-light-mode-only"> | ||||
|     <img src="https://setup-php.com/sponsors/scaleway.png" alt="Scaleway" width="174" height="60"> | ||||
|   </a> | ||||
|   <a href="https://www.scaleway.com/en/about-us/open-source-program#gh-dark-mode-only"> | ||||
|     <img src="https://setup-php.com/sponsors/scaleway-white.png" alt="Scaleway" width="174" height="60"> | ||||
|   </a> | ||||
| </p> | ||||
|  | ||||
| ## :bookmark: 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") | ||||
| - [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") | ||||
|  | ||||
| @ -12,9 +12,9 @@ describe('Config tests', () => { | ||||
|  | ||||
|     win32 = await config.addINIValues( | ||||
|       '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 () => { | ||||
| @ -29,9 +29,9 @@ describe('Config tests', () => { | ||||
|  | ||||
|     linux = await config.addINIValues( | ||||
|       '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 () => { | ||||
| @ -45,8 +45,8 @@ describe('Config tests', () => { | ||||
|  | ||||
|     darwin = await config.addINIValues( | ||||
|       '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'); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -1,15 +1,9 @@ | ||||
| import * as coverage from '../src/coverage'; | ||||
|  | ||||
| jest.mock('../src/extensions', () => ({ | ||||
|   addExtension: jest.fn().mockImplementation(extension => { | ||||
|     return 'add_extension ' + extension + '\n'; | ||||
|   }) | ||||
| })); | ||||
|  | ||||
| describe('Config tests', () => { | ||||
|   it('checking addCoverage with PCOV on windows', async () => { | ||||
|     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'); | ||||
|  | ||||
|     win32 = await coverage.addCoverage('pcov', '7.0', 'win32'); | ||||
| @ -27,24 +21,38 @@ describe('Config tests', () => { | ||||
|  | ||||
|   it('checking addCoverage with PCOV on darwin', async () => { | ||||
|     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'); | ||||
|   }); | ||||
|  | ||||
|   it('checking addCoverage with Xdebug on windows', async () => { | ||||
|     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 () => { | ||||
|     const linux: string = await coverage.addCoverage('xdebug', '7.4', 'linux'); | ||||
|     expect(linux).toContain('add_extension xdebug'); | ||||
|   it('checking addCoverage with Xdebug3 on windows', async () => { | ||||
|     const win32: string = await coverage.addCoverage('xdebug3', '7.4', 'win32'); | ||||
|     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 () => { | ||||
|     const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux'); | ||||
|     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 () => { | ||||
| @ -53,7 +61,25 @@ describe('Config tests', () => { | ||||
|       '7.4', | ||||
|       '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 () => { | ||||
|  | ||||
| @ -1,12 +1,6 @@ | ||||
| import * as extensions from '../src/extensions'; | ||||
|  | ||||
| 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 () => { | ||||
|     let win32: string = await extensions.addExtension( | ||||
|       'Xdebug, pcov, sqlite, phalcon4, ast-beta', | ||||
| @ -19,6 +13,9 @@ describe('Extension tests', () => { | ||||
|     expect(win32).toContain('phalcon.ps1 phalcon4'); | ||||
|     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'); | ||||
|     expect(win32).toContain('Add-Extension mysqli'); | ||||
|     expect(win32).toContain('Add-Extension mysqlnd'); | ||||
| @ -41,8 +38,8 @@ describe('Extension tests', () => { | ||||
|     expect(win32).toContain('phalcon.ps1 phalcon3'); | ||||
|     expect(win32).toContain('Add-Extension does_not_exist'); | ||||
|  | ||||
|     win32 = await extensions.addExtension('xdebug', '7.2', 'fedora'); | ||||
|     expect(win32).toContain('Platform fedora is not supported'); | ||||
|     win32 = await extensions.addExtension('xdebug', '7.2', 'openbsd'); | ||||
|     expect(win32).toContain('Platform openbsd is not supported'); | ||||
|   }); | ||||
|  | ||||
|   it('checking addExtensionOnLinux', async () => { | ||||
| @ -51,7 +48,6 @@ describe('Extension tests', () => { | ||||
|       '7.4', | ||||
|       '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-sqlite3' | ||||
| @ -62,21 +58,13 @@ describe('Extension tests', () => { | ||||
|     ); | ||||
|  | ||||
|     linux = await extensions.addExtension('gearman', '7.0', 'linux'); | ||||
|     expect(linux).toContain('gearman.sh 7.0'); | ||||
|     linux = await extensions.addExtension('gearman', '7.1', 'linux'); | ||||
|     expect(linux).toContain('gearman.sh 7.1'); | ||||
|     expect(linux).toContain('gearman.sh'); | ||||
|  | ||||
|     linux = await extensions.addExtension('gearman', '7.2', 'linux'); | ||||
|     expect(linux).toContain('gearman.sh 7.2'); | ||||
|     linux = await extensions.addExtension('xdebug2', '7.2', 'linux'); | ||||
|     expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension'); | ||||
|  | ||||
|     linux = await extensions.addExtension('gearman', '7.3', 'linux'); | ||||
|     expect(linux).toContain('gearman.sh 7.3'); | ||||
|  | ||||
|     linux = await extensions.addExtension('gearman', '7.4', 'linux'); | ||||
|     expect(linux).toContain('gearman.sh 7.4'); | ||||
|  | ||||
|     linux = await extensions.addExtension('xdebug', '7.2', 'fedora'); | ||||
|     expect(linux).toContain('Platform fedora is not supported'); | ||||
|     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'); | ||||
|     expect(linux).toContain('phalcon.sh phalcon3 7.3'); | ||||
| @ -85,26 +73,29 @@ describe('Extension tests', () => { | ||||
|  | ||||
|   it('checking addExtensionOnDarwin', async () => { | ||||
|     let darwin: string = await extensions.addExtension( | ||||
|       'Xdebug, pcov, grpc, protobuf, swoole, sqlite, ast-beta', | ||||
|       'Xdebug, pcov, expect, grpc, igbinary, imagick, phalcon3, phalcon4, protobuf, psr, rdkafka, ssh2, swoole, vips, sqlite, ast-beta', | ||||
|       '7.2', | ||||
|       'darwin' | ||||
|     ); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug'); | ||||
|     expect(darwin).toContain('add_brew_extension pcov'); | ||||
|     expect(darwin).toContain('add_brew_extension expect'); | ||||
|     expect(darwin).toContain('add_brew_extension grpc'); | ||||
|     expect(darwin).toContain('add_brew_extension igbinary'); | ||||
|     expect(darwin).toContain('add_brew_extension imagick'); | ||||
|     expect(darwin).toContain('add_brew_extension phalcon3'); | ||||
|     expect(darwin).toContain('add_brew_extension phalcon4'); | ||||
|     expect(darwin).toContain('add_brew_extension protobuf'); | ||||
|     expect(darwin).toContain('add_brew_extension psr'); | ||||
|     expect(darwin).toContain('add_brew_extension rdkafka'); | ||||
|     expect(darwin).toContain('add_brew_extension ssh2'); | ||||
|     expect(darwin).toContain('add_brew_extension swoole'); | ||||
|     expect(darwin).toContain('sudo pecl install -f sqlite3'); | ||||
|     expect(darwin).toContain('add_brew_extension vips'); | ||||
|     expect(darwin).toContain('pecl_install sqlite3'); | ||||
|     expect(darwin).toContain('add_unstable_extension ast beta extension'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('phalcon3', '7.0', 'darwin'); | ||||
|     expect(darwin).toContain('phalcon_darwin.sh phalcon3 7.0'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('phalcon4', '7.3', 'darwin'); | ||||
|     expect(darwin).toContain('phalcon_darwin.sh phalcon4 7.3'); | ||||
|  | ||||
|     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'); | ||||
|     expect(darwin).toContain('add_brew_extension pcov'); | ||||
| @ -115,22 +106,8 @@ describe('Extension tests', () => { | ||||
|     darwin = await extensions.addExtension('xdebug', '7.0', 'darwin'); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '7.2', 'darwin'); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug'); | ||||
|  | ||||
|     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('xdebug2', '7.2', 'darwin'); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug2'); | ||||
|  | ||||
|     darwin = await extensions.addExtension( | ||||
|       'does_not_exist', | ||||
| @ -140,7 +117,7 @@ describe('Extension tests', () => { | ||||
|     ); | ||||
|     expect(darwin).toContain('add_extension does_not_exist'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '7.2', 'fedora'); | ||||
|     expect(darwin).toContain('Platform fedora is not supported'); | ||||
|     darwin = await extensions.addExtension('xdebug', '7.2', 'openbsd'); | ||||
|     expect(darwin).toContain('Platform openbsd is not supported'); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -4,61 +4,61 @@ import * as install from '../src/install'; | ||||
|  * Mock install.ts | ||||
|  */ | ||||
| jest.mock('../src/install', () => ({ | ||||
|   build: jest.fn().mockImplementation( | ||||
|     async ( | ||||
|       filename: string, | ||||
|       version: string, | ||||
|       os_version: string | ||||
|     ): Promise<string> => { | ||||
|       const extension_csv: string = process.env['extensions'] || ''; | ||||
|       const ini_values_csv: string = process.env['ini-values'] || ''; | ||||
|       const coverage_driver: string = process.env['coverage'] || ''; | ||||
|       let tools_csv: string = process.env['tools'] || ''; | ||||
|       const pecl: string = process.env['pecl'] || ''; | ||||
|       if (pecl == 'true') { | ||||
|         tools_csv = 'pecl, ' + tools_csv; | ||||
|       } | ||||
|   build: jest | ||||
|     .fn() | ||||
|     .mockImplementation( | ||||
|       async ( | ||||
|         filename: string, | ||||
|         version: string, | ||||
|         os_version: string | ||||
|       ): Promise<string> => { | ||||
|         const extension_csv: string = process.env['extensions'] || ''; | ||||
|         const ini_values_csv: string = process.env['ini-values'] || ''; | ||||
|         const coverage_driver: string = process.env['coverage'] || ''; | ||||
|         let tools_csv: string = process.env['tools'] || ''; | ||||
|         const pecl: string = process.env['pecl'] || ''; | ||||
|         if (pecl == 'true') { | ||||
|           tools_csv = 'pecl, ' + tools_csv; | ||||
|         } | ||||
|  | ||||
|       let script = 'initial script ' + filename + version + os_version; | ||||
|       if (tools_csv) { | ||||
|         script += 'add_tool'; | ||||
|       } | ||||
|       if (extension_csv) { | ||||
|         script += 'install extensions'; | ||||
|       } | ||||
|       if (ini_values_csv) { | ||||
|         script += 'edit php.ini'; | ||||
|       } | ||||
|       if (coverage_driver) { | ||||
|         script += 'set coverage driver'; | ||||
|       } | ||||
|         let script = 'initial script ' + filename + version + os_version; | ||||
|         if (tools_csv) { | ||||
|           script += 'add_tool'; | ||||
|         } | ||||
|         if (extension_csv) { | ||||
|           script += 'install extensions'; | ||||
|         } | ||||
|         if (coverage_driver) { | ||||
|           script += 'set coverage driver'; | ||||
|         } | ||||
|         if (ini_values_csv) { | ||||
|           script += 'edit php.ini'; | ||||
|         } | ||||
|  | ||||
|       return script; | ||||
|         return script; | ||||
|       } | ||||
|     ), | ||||
|   run: jest.fn().mockImplementation(async (): Promise<string> => { | ||||
|     const os_version: string = process.env['RUNNER_OS'] || ''; | ||||
|     let version: string = process.env['php-version'] || ''; | ||||
|     version = version.length > 1 ? version.slice(0, 3) : version + '.0'; | ||||
|     let script = ''; | ||||
|     switch (os_version) { | ||||
|       case 'darwin': | ||||
|       case 'linux': | ||||
|         script = await install.build(os_version + '.sh', version, os_version); | ||||
|         script += 'bash script.sh ' + version + ' ' + __dirname; | ||||
|         break; | ||||
|       case 'win32': | ||||
|         script = await install.build(os_version + '.sh', version, os_version); | ||||
|         script += 'pwsh script.ps1 ' + version + ' ' + __dirname; | ||||
|         break; | ||||
|       default: | ||||
|         script += os_version + ' is not supported'; | ||||
|     } | ||||
|   ), | ||||
|   run: jest.fn().mockImplementation( | ||||
|     async (): Promise<string> => { | ||||
|       const os_version: string = process.env['RUNNER_OS'] || ''; | ||||
|       let version: string = process.env['php-version'] || ''; | ||||
|       version = version.length > 1 ? version.slice(0, 3) : version + '.0'; | ||||
|       let script = ''; | ||||
|       switch (os_version) { | ||||
|         case 'darwin': | ||||
|         case 'linux': | ||||
|           script = await install.build(os_version + '.sh', version, os_version); | ||||
|           script += 'bash script.sh ' + version + ' ' + __dirname; | ||||
|           break; | ||||
|         case 'win32': | ||||
|           script = await install.build(os_version + '.sh', version, os_version); | ||||
|           script += 'pwsh script.ps1 ' + version + ' ' + __dirname; | ||||
|           break; | ||||
|         default: | ||||
|           script += os_version + ' is not supported'; | ||||
|       } | ||||
|  | ||||
|       return script; | ||||
|     } | ||||
|   ) | ||||
|     return script; | ||||
|   }) | ||||
| })); | ||||
|  | ||||
| /** | ||||
|  | ||||
| @ -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); | ||||
|   }); | ||||
| }); | ||||
| @ -5,8 +5,8 @@ describe('Tools tests', () => { | ||||
|     expect(await tools.getCommand('linux', '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('fedora', 'tool')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await tools.getCommand('openbsd', 'tool')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -20,8 +20,8 @@ describe('Tools tests', () => { | ||||
|     expect(await tools.getCommand('win32', 'composertool')).toBe( | ||||
|       'Add-Composertool ' | ||||
|     ); | ||||
|     expect(await tools.getCommand('fedora', 'composertool')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await tools.getCommand('openbsd', 'composertool')).toContain( | ||||
|       '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('darwin', 'pecl')).toBe('add_pecl '); | ||||
|     expect(await tools.getCommand('win32', 'pecl')).toBe('Add-Pecl '); | ||||
|     expect(await tools.getCommand('fedora', 'pecl')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await tools.getCommand('openbsd', 'pecl')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -112,102 +112,25 @@ describe('Tools tests', () => { | ||||
|     ).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 () => { | ||||
|     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( | ||||
|       '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( | ||||
|       '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' | ||||
|     ); | ||||
|  | ||||
|     script = await tools.addPhive('latest', '7.2', 'win32'); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://github.com/phar-io/phive/releases/download/0.14.5/phive-0.14.5.phar phive' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -240,9 +163,17 @@ describe('Tools tests', () => { | ||||
|       'a', | ||||
|       'b' | ||||
|     ]); | ||||
|     expect(await tools.addComposer(['a', 'b', 'composer:1.2'])).toStrictEqual([ | ||||
|       'composer', | ||||
|       'a', | ||||
|       'b' | ||||
|     ]); | ||||
|     expect(await tools.addComposer(['a', 'b', 'composer:1.2.3'])).toStrictEqual( | ||||
|       ['composer:1.2.3', 'a', 'b'] | ||||
|     ); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'composer:1.2.3']) | ||||
|     ).toStrictEqual(['composer', 'a', 'b']); | ||||
|       await tools.addComposer(['a', 'b', 'composer:v1.2.3']) | ||||
|     ).toStrictEqual(['composer:1.2.3', 'a', 'b']); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'composer:snapshot']) | ||||
|     ).toStrictEqual(['composer:snapshot', 'a', 'b']); | ||||
| @ -261,22 +192,44 @@ describe('Tools tests', () => { | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'c', 'composer:v2']) | ||||
|     ).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 () => { | ||||
|     expect(await tools.updateComposer('latest', 'linux')).toContain(''); | ||||
|     expect(await tools.updateComposer('stable', 'win32')).toContain(''); | ||||
|     expect(await tools.updateComposer('snapshot', 'darwin')).toContain( | ||||
|       '\ncomposer self-update --snapshot' | ||||
|   it('checking getComposerUrl', async () => { | ||||
|     expect(await tools.getComposerUrl('latest', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-stable.phar' | ||||
|     ); | ||||
|     expect(await tools.updateComposer('preview', 'linux')).toContain( | ||||
|       '\ncomposer self-update --preview' | ||||
|     expect(await tools.getComposerUrl('stable', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-stable.phar' | ||||
|     ); | ||||
|     expect(await tools.updateComposer('1', 'win32')).toContain( | ||||
|       '\ncomposer self-update --1' | ||||
|     expect(await tools.getComposerUrl('snapshot', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer.phar' | ||||
|     ); | ||||
|     expect(await tools.updateComposer('2', 'darwin')).toContain( | ||||
|       '\ncomposer self-update --2' | ||||
|     expect(await tools.getComposerUrl('preview', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-preview.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('1', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-1.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('2', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-2.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('1.7.2', '7.4')).toContain( | ||||
|       'https://github.com/composer/composer/releases/download/1.7.2/composer.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('1.7.2', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-1.7.2.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('2.0.0-RC2', '7.4')).toContain( | ||||
|       'https://github.com/composer/composer/releases/download/2.0.0-RC2/composer.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('2.0.0-RC2', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-2.0.0-RC2.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('wrong', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-stable.phar' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -299,42 +252,33 @@ describe('Tools tests', () => { | ||||
|     expect(await tools.getSymfonyUri('1.2.3', 'win32')).toContain( | ||||
|       'releases/download/v1.2.3/symfony_windows_amd64' | ||||
|     ); | ||||
|     expect(await tools.getSymfonyUri('1.2.3', 'fedora')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await tools.getSymfonyUri('1.2.3', 'openbsd')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getCleanedToolsList', async () => { | ||||
|     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([ | ||||
|       'composer', | ||||
|       'tool', | ||||
|       'phinx', | ||||
|       'prestissimo', | ||||
|       'composer-prefetcher' | ||||
|     ]); | ||||
|     expect(tools_list).toStrictEqual(['composer:1.2.3', 'tool', 'phinx']); | ||||
|   }); | ||||
|  | ||||
|   it('checking addArchive', async () => { | ||||
|     let script: string = await tools.addArchive( | ||||
|       'tool', | ||||
|       '1.2.3', | ||||
|       'https://tool.com/tool.phar', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain('add_tool https://tool.com/tool.phar tool'); | ||||
|     script = await tools.addArchive( | ||||
|       'tool', | ||||
|       '1.2.3', | ||||
|       'https://tool.com/tool.phar', | ||||
|       'darwin' | ||||
|     ); | ||||
|     expect(script).toContain('add_tool https://tool.com/tool.phar tool'); | ||||
|     script = await tools.addArchive( | ||||
|       'tool', | ||||
|       '1.2.3', | ||||
|       'https://tool.com/tool.phar', | ||||
|       'win32' | ||||
|     ); | ||||
| @ -342,11 +286,10 @@ describe('Tools tests', () => { | ||||
|  | ||||
|     script = await tools.addArchive( | ||||
|       'tool', | ||||
|       '1.2.3', | ||||
|       '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 () => { | ||||
| @ -374,8 +317,8 @@ describe('Tools tests', () => { | ||||
|       'Add-Log "$cross" "php-config" "php-config is not a windows tool"' | ||||
|     ); | ||||
|  | ||||
|     script = await tools.addDevTools('tool', 'fedora'); | ||||
|     expect(script).toContain('Platform fedora is not supported'); | ||||
|     script = await tools.addDevTools('tool', 'openbsd'); | ||||
|     expect(script).toContain('Platform openbsd is not supported'); | ||||
|   }); | ||||
|  | ||||
|   it('checking addPackage', async () => { | ||||
| @ -393,8 +336,8 @@ describe('Tools tests', () => { | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'win32'); | ||||
|     expect(script).toContain('Add-Composertool tool tool:1.2.3 user/'); | ||||
|  | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'fedora'); | ||||
|     expect(script).toContain('Platform fedora is not supported'); | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'openbsd'); | ||||
|     expect(script).toContain('Platform openbsd is not supported'); | ||||
|   }); | ||||
|  | ||||
|   it('checking addTools on linux', async () => { | ||||
| @ -404,7 +347,7 @@ describe('Tools tests', () => { | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://getcomposer.org/composer-stable.phar composer' | ||||
|       'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-stable.phar,https://getcomposer.org/composer-stable.phar composer' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr' | ||||
| @ -433,12 +376,12 @@ describe('Tools tests', () => { | ||||
|   }); | ||||
|   it('checking addTools on darwin', async () => { | ||||
|     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', | ||||
|       'darwin' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://getcomposer.org/composer-stable.phar composer' | ||||
|       'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-stable.phar,https://getcomposer.org/composer-stable.phar composer' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/download/1.2.3/cs2pr cs2pr' | ||||
| @ -462,12 +405,6 @@ describe('Tools tests', () => { | ||||
|     expect(script).toContain( | ||||
|       '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( | ||||
|       'add_tool https://github.com/symfony/cli/releases/download/v1.2.3/symfony_darwin_amd64 symfony' | ||||
|     ); | ||||
| @ -476,12 +413,12 @@ describe('Tools tests', () => { | ||||
|   }); | ||||
|   it('checking addTools on windows', async () => { | ||||
|     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', | ||||
|       'win32' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://getcomposer.org/composer-stable.phar composer' | ||||
|       'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-stable.phar,https://getcomposer.org/composer-stable.phar composer' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr' | ||||
| @ -489,7 +426,6 @@ describe('Tools tests', () => { | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://deployer.org/deployer.phar deployer' | ||||
|     ); | ||||
|     expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/'); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://github.com/phpmd/phpmd/releases/latest/download/phpmd.phar phpmd' | ||||
|     ); | ||||
| @ -502,17 +438,16 @@ describe('Tools tests', () => { | ||||
|     ); | ||||
|     expect(script).toContain('phpize 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_exit is not supported'); | ||||
|     expect(script).toContain('Tool does_not_exist is not supported'); | ||||
|   }); | ||||
|   it('checking addTools with composer tool using user/tool as input', async () => { | ||||
|     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', | ||||
|       'win32' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://getcomposer.org/composer-stable.phar composer' | ||||
|       'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-1.phar,https://getcomposer.org/composer-1.phar composer' | ||||
|     ); | ||||
|     expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/'); | ||||
|     expect(script).toContain('Add-Composertool phinx phinx robmorgan/'); | ||||
| @ -527,17 +462,20 @@ describe('Tools tests', () => { | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://getcomposer.org/composer-stable.phar composer' | ||||
|       'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-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'); | ||||
|     expect(script).toContain('composer self-update --preview'); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-preview.phar,https://getcomposer.org/composer-preview.phar composer' | ||||
|     ); | ||||
|     script = await tools.addTools( | ||||
|       'composer:v1, composer:preview, composer:snapshot', | ||||
|       '7.4', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain('composer self-update --snapshot'); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-7.4-snapshot.phar,https://getcomposer.org/composer.phar composer' | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -8,6 +8,10 @@ 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> { | ||||
|   fs.unlink(path, error => { | ||||
|     if (error) { | ||||
| @ -17,23 +21,48 @@ async function cleanup(path: string): Promise<void> { | ||||
| } | ||||
|  | ||||
| describe('Utils tests', () => { | ||||
|   it('checking getInput', async () => { | ||||
|   it('checking readEnv', async () => { | ||||
|     process.env['test'] = 'setup-php'; | ||||
|     process.env['undefined'] = ''; | ||||
|     process.env['test-hyphen'] = 'setup-php'; | ||||
|     expect(await utils.readEnv('test')).toBe('setup-php'); | ||||
|     expect(await utils.readEnv('TEST')).toBe('setup-php'); | ||||
|     expect(await utils.readEnv('test_hyphen')).toBe('setup-php'); | ||||
|     expect(await utils.readEnv('TEST_HYPHEN')).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('undefined', false)).toBe(''); | ||||
|     expect(await utils.getInput('setup-php', false)).toBe('setup-php'); | ||||
|     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 () => { | ||||
|     const array: Array<string> = ['a', 'b', 'c']; | ||||
|     let concat = ''; | ||||
|     await utils.asyncForEach(array, async function ( | ||||
|       str: string | ||||
|     ): Promise<void> { | ||||
|       concat += str; | ||||
|     }); | ||||
|     await utils.asyncForEach( | ||||
|       array, | ||||
|       async function (str: string): Promise<void> { | ||||
|         concat += str; | ||||
|       } | ||||
|     ); | ||||
|     expect(concat).toBe('abc'); | ||||
|   }); | ||||
|  | ||||
| @ -70,10 +99,7 @@ describe('Utils tests', () => { | ||||
|     const runner_dir: string = process.env['RUNNER_TOOL_CACHE'] || ''; | ||||
|     const script_path: string = path.join(runner_dir, 'test.sh'); | ||||
|     await utils.writeScript('test.sh', testString); | ||||
|     await fs.readFile(script_path, function ( | ||||
|       error: Error | null, | ||||
|       data: Buffer | ||||
|     ) { | ||||
|     fs.readFile(script_path, function (error: Error | null, data: Buffer) { | ||||
|       expect(testString).toBe(data.toString()); | ||||
|     }); | ||||
|     await cleanup(script_path); | ||||
| @ -97,6 +123,28 @@ describe('Utils tests', () => { | ||||
|       'b=2', | ||||
|       '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([]); | ||||
|   }); | ||||
| @ -131,8 +179,8 @@ describe('Utils tests', () => { | ||||
|     expect(step_log).toEqual('step_log "Test message"'); | ||||
|     step_log = await utils.stepLog(message, 'darwin'); | ||||
|     expect(step_log).toEqual('step_log "Test message"'); | ||||
|     step_log = await utils.stepLog(message, 'fedora'); | ||||
|     expect(step_log).toContain('Platform fedora is not supported'); | ||||
|     step_log = await utils.stepLog(message, 'openbsd'); | ||||
|     expect(step_log).toContain('Platform openbsd is not supported'); | ||||
|  | ||||
|     let add_log: string = await utils.addLog( | ||||
|       'tick', | ||||
| @ -145,8 +193,8 @@ describe('Utils tests', () => { | ||||
|     expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); | ||||
|     add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'darwin'); | ||||
|     expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); | ||||
|     add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'fedora'); | ||||
|     expect(add_log).toContain('Platform fedora is not supported'); | ||||
|     add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'openbsd'); | ||||
|     expect(add_log).toContain('Platform openbsd is not supported'); | ||||
|   }); | ||||
|  | ||||
|   it('checking getExtensionPrefix', async () => { | ||||
| @ -162,8 +210,8 @@ describe('Utils tests', () => { | ||||
|     expect(await utils.suppressOutput('win32')).toEqual(' >$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('fedora')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await utils.suppressOutput('openbsd')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| name: 'Setup PHP Action' | ||||
| 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: | ||||
|   color: 'purple' | ||||
|   icon: 'play-circle' | ||||
|  | ||||
							
								
								
									
										5366
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5366
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -17,11 +17,11 @@ jobs: | ||||
|         with: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -37,12 +37,12 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -70,12 +70,12 @@ jobs: | ||||
|           php-version: '7.3' | ||||
|           extensions: mbstring, intl | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -98,12 +98,12 @@ jobs: | ||||
|           extensions: mbstring, intl | ||||
|           tools: phpstan | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -35,12 +35,12 @@ jobs: | ||||
|           extensions: mbstring, intl, redis, pdo_pgsql | ||||
|           coverage: pcov | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -68,12 +68,12 @@ jobs: | ||||
|           php-version: '7.3' | ||||
|           extensions: mbstring, intl | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -96,12 +96,12 @@ jobs: | ||||
|           extensions: mbstring, intl | ||||
|           tools: phpstan | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -19,12 +19,12 @@ jobs: | ||||
|           extensions: mbstring, intl, pdo_sqlite, pdo_mysql | ||||
|           coverage: pcov #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -48,12 +48,12 @@ jobs: | ||||
|           php-version: '7.3' | ||||
|           extensions: mbstring, intl | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -76,12 +76,12 @@ jobs: | ||||
|           extensions: mbstring, intl | ||||
|           tools: phpstan | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -18,12 +18,12 @@ jobs: | ||||
|           extensions: mbstring, intl, curl, dom | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -44,12 +44,12 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -44,12 +44,12 @@ jobs: | ||||
|           extensions: mbstring, dom, fileinfo, pgsql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -20,12 +20,12 @@ jobs: | ||||
|           extensions: mbstring, dom, fileinfo | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -44,12 +44,12 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -44,12 +44,12 @@ jobs: | ||||
|           extensions: mbstring, dom, fileinfo, pgsql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -20,12 +20,12 @@ jobs: | ||||
|           extensions: mbstring, dom, fileinfo, mysql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -44,12 +44,12 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -43,12 +43,12 @@ jobs: | ||||
|           extensions: mbstring, dom, zip, phalcon4, pgsql #use phalcon3 for the phalcon 3.x | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -33,12 +33,12 @@ jobs: | ||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-yarn- | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -18,12 +18,12 @@ jobs: | ||||
|           extensions: mbstring, simplexml, dom | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -23,7 +23,7 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - 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: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql | ||||
| @ -31,22 +31,23 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer require --dev symfony/orm-pack symfony/phpunit-bridge | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           php bin/phpunit install | ||||
|       - name: Run Migration | ||||
|         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:migrations:migrate || echo "No migrations found or migration failed" | ||||
|         env: | ||||
|  | ||||
| @ -23,28 +23,29 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - 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: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, pgsql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer require --dev symfony/orm-pack symfony/phpunit-bridge | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           php bin/phpunit install | ||||
|       - name: Run Migration | ||||
|         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:migrations:migrate || echo "No migrations found or migration failed" | ||||
|         env: | ||||
|  | ||||
| @ -14,25 +14,26 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - 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: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer require symfony/orm-pack | ||||
|           composer require --dev symfony/phpunit-bridge | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           php bin/phpunit install | ||||
|       - name: Run Tests | ||||
|         run: php bin/phpunit --coverage-text | ||||
| @ -41,12 +41,12 @@ jobs: | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -39,12 +39,12 @@ jobs: | ||||
|           extensions: mbstring, intl, gd, imagick, zip, dom, pgsql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
| @ -18,12 +18,12 @@ jobs: | ||||
|           extensions: mbstring, bcmath, curl, intl | ||||
|           coverage: xdebug #optional | ||||
|       - name: Get composer cache directory | ||||
|         id: composercache | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composercache.outputs.dir }} | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
|           # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|  | ||||
							
								
								
									
										13372
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13372
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										70
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								package.json
									
									
									
									
									
								
							| @ -1,15 +1,25 @@ | ||||
| { | ||||
|   "name": "setup-php", | ||||
|   "version": "1.9.2", | ||||
|   "version": "1.11.7", | ||||
|   "private": false, | ||||
|   "description": "Setup PHP for use with GitHub Actions", | ||||
|   "main": "dist/index.js", | ||||
|   "main": "lib/install.js", | ||||
|   "types": "lib/install.d.ts", | ||||
|   "directories": { | ||||
|     "lib": "lib", | ||||
|     "test": "__tests__", | ||||
|     "src": "src" | ||||
|   }, | ||||
|   "files": [ | ||||
|     "lib", | ||||
|     "src" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "build": "tsc", | ||||
|     "lint": "eslint **/*.ts --cache", | ||||
|     "format": "prettier --write **/*.ts && git add .", | ||||
|     "format-check": "prettier --check **/*.ts", | ||||
|     "release": "ncc build src/install.ts -o dist && git add -f dist/", | ||||
|     "lint": "eslint **/src/*.ts --cache --fix", | ||||
|     "format": "prettier --write **/src/*.ts && git add .", | ||||
|     "format-check": "prettier --check **/src/*.ts", | ||||
|     "release": "ncc build -o dist && git add -f dist/", | ||||
|     "test": "jest" | ||||
|   }, | ||||
|   "repository": { | ||||
| @ -24,33 +34,33 @@ | ||||
|   "author": "shivammathur", | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.2.4", | ||||
|     "@actions/exec": "^1.0.4", | ||||
|     "@actions/io": "^1.0.2", | ||||
|     "@actions/core": "^1.6.0", | ||||
|     "@actions/exec": "^1.1.1", | ||||
|     "@actions/io": "^1.1.2", | ||||
|     "fs": "0.0.1-security" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^26.0.3", | ||||
|     "@types/node": "^14.0.14", | ||||
|     "@typescript-eslint/eslint-plugin": "^3.5.0", | ||||
|     "@typescript-eslint/parser": "^3.5.0", | ||||
|     "@zeit/ncc": "^0.22.3", | ||||
|     "eslint": "^7.3.1", | ||||
|     "eslint-config-prettier": "^6.11.0", | ||||
|     "eslint-plugin-import": "^2.22.0", | ||||
|     "eslint-plugin-jest": "^23.17.1", | ||||
|     "eslint-plugin-prettier": "^3.1.4", | ||||
|     "husky": "^4.2.5", | ||||
|     "jest": "^26.1.0", | ||||
|     "jest-circus": "^26.1.0", | ||||
|     "prettier": "^2.0.5", | ||||
|     "ts-jest": "^26.1.1", | ||||
|     "typescript": "^3.9.6" | ||||
|     "@types/jest": "^27.4.1", | ||||
|     "@types/node": "^17.0.23", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.18.0", | ||||
|     "@typescript-eslint/parser": "^5.18.0", | ||||
|     "@vercel/ncc": "^0.33.3", | ||||
|     "eslint": "^8.13.0", | ||||
|     "eslint-config-prettier": "^8.5.0", | ||||
|     "eslint-plugin-import": "^2.26.0", | ||||
|     "eslint-plugin-jest": "^26.1.4", | ||||
|     "eslint-plugin-prettier": "^4.0.0", | ||||
|     "jest": "^27.5.1", | ||||
|     "jest-circus": "^27.5.1", | ||||
|     "prettier": "^2.6.2", | ||||
|     "simple-git-hooks": "^2.7.0", | ||||
|     "ts-jest": "^27.1.4", | ||||
|     "typescript": "^4.6.3" | ||||
|   }, | ||||
|   "husky": { | ||||
|     "skipCI": true, | ||||
|     "hooks": { | ||||
|       "pre-commit": "npm run format && npm run lint && npm run build && npm run release" | ||||
|     } | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/shivammathur/setup-php/issues" | ||||
|   }, | ||||
|   "simple-git-hooks": { | ||||
|     "pre-commit": "npm run format && npm run lint && npm run test && npm run build && npm run release" | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -14,7 +14,9 @@ export async function addINIValuesUnix( | ||||
|     script += | ||||
|       (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 | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  | ||||
							
								
								
									
										28
									
								
								src/configs/brew_extensions
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/configs/brew_extensions
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| amqp=amqp | ||||
| apcu=apcu | ||||
| expect=expect | ||||
| grpc=grpc | ||||
| igbinary=igbinary | ||||
| imagick=imagick | ||||
| imap=imap | ||||
| memcache=memcache | ||||
| memcached=memcached | ||||
| mongodb=mongodb | ||||
| msgpack=msgpack | ||||
| pcov=pcov | ||||
| pecl_http=http | ||||
| phalcon3=phalcon | ||||
| phalcon4=phalcon | ||||
| propro=propro | ||||
| protobuf=protobuf | ||||
| psr=psr | ||||
| raphf=raphf | ||||
| rdkafka=rdkafka | ||||
| redis=redis | ||||
| ssh2=ssh2 | ||||
| swoole=swoole | ||||
| vips=vips | ||||
| xdebug=xdebug | ||||
| xdebug2=xdebug | ||||
| yaml=yaml | ||||
| zmq=zmq | ||||
| @ -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 | ||||
							
								
								
									
										6
									
								
								src/configs/php-versions.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/configs/php-versions.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| { | ||||
|   "latest": "8.0", | ||||
|   "5.x": "5.6", | ||||
|   "7.x": "7.4", | ||||
|   "8.x": "8.0" | ||||
| } | ||||
| @ -2,38 +2,22 @@ import * as utils from './utils'; | ||||
| import * as extensions from './extensions'; | ||||
| import * as config from './config'; | ||||
|  | ||||
| /** | ||||
|  * Function to setup Xdebug | ||||
|  * | ||||
|  * @param version | ||||
|  * @param os_version | ||||
|  * @param pipe | ||||
|  */ | ||||
| export async function addCoverageXdebug( | ||||
|   extension: string, | ||||
|   version: string, | ||||
|   os_version: string, | ||||
|   pipe: string | ||||
| ): Promise<string> { | ||||
|   const xdebug = | ||||
|     (await extensions.addExtension('xdebug', version, os_version, true)) + pipe; | ||||
|   const ini = await config.addINIValues( | ||||
|     'xdebug.mode=coverage', | ||||
|     os_version, | ||||
|     true | ||||
|   ); | ||||
|     (await extensions.addExtension(extension, version, os_version, true)) + | ||||
|     pipe; | ||||
|   const log = await utils.addLog( | ||||
|     '$tick', | ||||
|     'xdebug', | ||||
|     extension, | ||||
|     'Xdebug enabled as coverage driver', | ||||
|     os_version | ||||
|   ); | ||||
|   switch (true) { | ||||
|     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; | ||||
|   } | ||||
|   return xdebug + '\n' + log; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @ -146,7 +130,14 @@ export async function addCoverage( | ||||
|     case 'pcov': | ||||
|       return script + (await addCoveragePCOV(version, os_version, pipe)); | ||||
|     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': | ||||
|       return script + (await disableCoverage(version, os_version, pipe)); | ||||
|     default: | ||||
|  | ||||
| @ -1,35 +1,15 @@ | ||||
| import * as path from 'path'; | ||||
| 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 | ||||
|  * | ||||
|  * @param extension_csv | ||||
|  * @param version | ||||
|  * @param pipe | ||||
|  */ | ||||
| export async function addExtensionDarwin( | ||||
|   extension_csv: string, | ||||
|   version: string, | ||||
|   pipe: string | ||||
|   version: string | ||||
| ): Promise<string> { | ||||
|   const extensions: Array<string> = await utils.extensionArray(extension_csv); | ||||
|   let script = '\n'; | ||||
| @ -37,11 +17,11 @@ export async function addExtensionDarwin( | ||||
|     const version_extension: string = version + extension; | ||||
|     const [extension_name, stability]: string[] = extension.split('-'); | ||||
|     const ext_prefix = await utils.getExtensionPrefix(extension_name); | ||||
|     const command_prefix = 'sudo pecl install -f '; | ||||
|     const command_prefix = 'pecl_install '; | ||||
|     let command = ''; | ||||
|     switch (true) { | ||||
|       // match pre-release versions | ||||
|       case /.*-(beta|alpha|devel|snapshot)/.test(version_extension): | ||||
|       case /.+-(beta|alpha|devel|snapshot)/.test(extension): | ||||
|         script += | ||||
|           '\nadd_unstable_extension ' + | ||||
|           extension_name + | ||||
| @ -50,43 +30,24 @@ export async function addExtensionDarwin( | ||||
|           ' ' + | ||||
|           ext_prefix; | ||||
|         return; | ||||
|       // match 5.6xdebug to 8.0xdebug, 5.6swoole to 8.0swoole | ||||
|       // match 5.6grpc to 7.4grpc, 5.6protobuf to 7.4protobuf | ||||
|       // match 5.6 to 8.0 amqp, expect, grpc, igbinary, imagick, imap, mongodb, msgpack, pecl_http, propro, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq | ||||
|       // match 7.1pcov to 8.0pcov | ||||
|       case /(5\.6|7\.[0-4]|8\.[0-9])(xdebug|swoole)/.test(version_extension): | ||||
|       case /(5\.6|7\.[0-4])(grpc|protobuf)/.test(version_extension): | ||||
|       case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension): | ||||
|         command = 'add_brew_extension ' + extension_name; | ||||
|         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; | ||||
|       // match 7.0vips to 8.0vips | ||||
|       case /(5\.6|7\.[0-4]|8.0)(amqp|expect|grpc|igbinary|imagick|imap|mcrypt|mongodb|msgpack|^(pecl_)?http$|propro|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test( | ||||
|         version_extension | ||||
|       ): | ||||
|       case /(7\.[1-4]|8\.0])pcov/.test(version_extension): | ||||
|       case /^(5\.6|7\.[0-3])phalcon3$|^7\.[2-4]phalcon4$/.test( | ||||
|         version_extension | ||||
|       ): | ||||
|       case /(7\.[0-4]|8\.0])vips/.test(version_extension): | ||||
|         command = 'add_brew_extension ' + extension_name.replace('pecl_', ''); | ||||
|         break; | ||||
|       // match sqlite | ||||
|       case /^sqlite$/.test(extension): | ||||
|         extension = 'sqlite3'; | ||||
|         command = command_prefix + extension; | ||||
|         break; | ||||
|       // match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4 | ||||
|       case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension): | ||||
|         script += | ||||
|           '\nbash ' + | ||||
|           path.join(__dirname, '../src/scripts/ext/phalcon_darwin.sh') + | ||||
|           ' ' + | ||||
|           extension + | ||||
|           ' ' + | ||||
|           version; | ||||
|         return; | ||||
|       default: | ||||
|         command = command_prefix + extension; | ||||
|         break; | ||||
| @ -119,7 +80,7 @@ export async function addExtensionWindows( | ||||
|     const version_extension: string = version + extension; | ||||
|     switch (true) { | ||||
|       // 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; | ||||
|         break; | ||||
|       // match 5.6mysql, 5.6mysqli, 5.6mysqlnd | ||||
| @ -127,6 +88,10 @@ export async function addExtensionWindows( | ||||
|         script += | ||||
|           '\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd'; | ||||
|         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.0mysqli..8.0mysqli | ||||
|       // match 7.0mysqlnd..8.0mysqlnd | ||||
| @ -179,7 +144,7 @@ export async function addExtensionLinux( | ||||
|     let command = ''; | ||||
|     switch (true) { | ||||
|       // match pre-release versions | ||||
|       case /.*-(beta|alpha|devel|snapshot)/.test(version_extension): | ||||
|       case /.+-(beta|alpha|devel|snapshot)/.test(extension): | ||||
|         script += | ||||
|           '\nadd_unstable_extension ' + | ||||
|           extension_name + | ||||
| @ -190,13 +155,9 @@ export async function addExtensionLinux( | ||||
|         return; | ||||
|       // match 5.6gearman..7.4gearman | ||||
|       case /^((5\.6)|(7\.[0-4]))gearman$/.test(version_extension): | ||||
|         command = | ||||
|           '\nbash ' + | ||||
|           path.join(__dirname, '../src/scripts/ext/gearman.sh') + | ||||
|           ' ' + | ||||
|           version + | ||||
|           pipe; | ||||
|         break; | ||||
|         script += | ||||
|           '\n. ' + path.join(__dirname, '../src/scripts/ext/gearman.sh'); | ||||
|         return; | ||||
|       // match 7.0phalcon3...7.3phalcon3 or 7.2phalcon4...7.4phalcon4 | ||||
|       case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension): | ||||
|         script += | ||||
| @ -207,13 +168,9 @@ export async function addExtensionLinux( | ||||
|           ' ' + | ||||
|           version; | ||||
|         return; | ||||
|       // match 7.0xdebug..7.4xdebug | ||||
|       case /^7\.[0-4]xdebug$/.test(version_extension): | ||||
|         script += | ||||
|           '\nupdate_extension xdebug 2.9.2' + | ||||
|           pipe + | ||||
|           '\n' + | ||||
|           (await utils.addLog('$tick', 'xdebug', 'Enabled', 'linux')); | ||||
|       // match 7.2xdebug2 to 7.4xdebug2 | ||||
|       case /^7\.[2-4]xdebug2$/.test(version_extension): | ||||
|         script += '\nadd_pecl_extension xdebug 2.9.8 ' + ext_prefix; | ||||
|         return; | ||||
|       // match sqlite | ||||
|       case /^sqlite$/.test(extension): | ||||
| @ -265,7 +222,7 @@ export async function addExtension( | ||||
|     case 'win32': | ||||
|       return script + (await addExtensionWindows(extension_csv, version)); | ||||
|     case 'darwin': | ||||
|       return script + (await addExtensionDarwin(extension_csv, version, pipe)); | ||||
|       return script + (await addExtensionDarwin(extension_csv, version)); | ||||
|     case 'linux': | ||||
|       return script + (await addExtensionLinux(extension_csv, version, pipe)); | ||||
|     default: | ||||
|  | ||||
| @ -1,11 +1,10 @@ | ||||
| import {exec} from '@actions/exec/lib/exec'; | ||||
| import {exec} from '@actions/exec'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as config from './config'; | ||||
| import * as coverage from './coverage'; | ||||
| import * as extensions from './extensions'; | ||||
| import * as tools from './tools'; | ||||
| import * as utils from './utils'; | ||||
| import * as matchers from './matchers'; | ||||
|  | ||||
| /** | ||||
|  * Build the script | ||||
| @ -20,6 +19,8 @@ export async function build( | ||||
|   os_version: string | ||||
| ): Promise<string> { | ||||
|   // taking inputs | ||||
|   const name = 'setup-php'; | ||||
|   const url = 'https://setup-php.com/support'; | ||||
|   const extension_csv: string = | ||||
|     (await utils.getInput('extensions', 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-csv', false)); | ||||
|   const coverage_driver: string = await utils.getInput('coverage', false); | ||||
|   const pecl: string = await utils.getInput('pecl', 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; | ||||
|   } | ||||
|   const tools_csv: string = await utils.getInput('tools', false); | ||||
|  | ||||
|   let script: string = await utils.readScript(filename); | ||||
|   script += await tools.addTools(tools_csv, version, os_version); | ||||
| @ -43,12 +37,15 @@ export async function build( | ||||
|   if (extension_csv) { | ||||
|     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) { | ||||
|     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); | ||||
| } | ||||
| @ -58,27 +55,50 @@ export async function build( | ||||
|  */ | ||||
| export async function run(): Promise<void> { | ||||
|   try { | ||||
|     const os_version: string = process.platform; | ||||
|     let version: string = await utils.getInput('php-version', true); | ||||
|     version = version.length > 1 ? version.slice(0, 3) : version + '.0'; | ||||
|     // check the os version and run the respective script | ||||
|     let script_path = ''; | ||||
|     switch (os_version) { | ||||
|       case 'darwin': | ||||
|       case 'linux': | ||||
|         script_path = await build(os_version + '.sh', version, os_version); | ||||
|         await exec('bash ' + script_path + ' ' + version + ' ' + __dirname); | ||||
|         break; | ||||
|       case 'win32': | ||||
|         script_path = await build('win32.ps1', version, os_version); | ||||
|         await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); | ||||
|         break; | ||||
|     if ((await utils.readEnv('ImageOS')) == 'ubuntu16') { | ||||
|       core.setFailed( | ||||
|         'setup-php is not supported on Ubuntu 16.04. Please upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452' | ||||
|       ); | ||||
|       return; | ||||
|     } | ||||
|     core.warning( | ||||
|       'setup-php v1 is deprecated.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2' | ||||
|     ); | ||||
|     const version: string = await utils.parseVersion( | ||||
|       await utils.getInput('php-version', true) | ||||
|     ); | ||||
|     if (parseFloat(version) < 5.6 || parseFloat(version) > 8.0) { | ||||
|       core.setFailed( | ||||
|         `setup-php v1 supports only PHP 5.6 to 8.0.\nPlease upgrade to v2 - https://setup-php.com/w/Switch-to-v2` | ||||
|       ); | ||||
|       return; | ||||
|     } | ||||
|     if (version) { | ||||
|       const os_version: string = process.platform; | ||||
|       // check the os version and run the respective script | ||||
|       let script_path = ''; | ||||
|       switch (os_version) { | ||||
|         case 'darwin': | ||||
|         case 'linux': | ||||
|           script_path = await build(os_version + '.sh', version, os_version); | ||||
|           await exec('bash ' + script_path + ' ' + version + ' ' + __dirname); | ||||
|           break; | ||||
|         case 'win32': | ||||
|           script_path = await build('win32.ps1', version, os_version); | ||||
|           await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname); | ||||
|           break; | ||||
|       } | ||||
|     } else { | ||||
|       core.setFailed('Unable to get the PHP version'); | ||||
|     } | ||||
|     await matchers.addMatchers(); | ||||
|   } catch (error) { | ||||
|     core.setFailed(error.message); | ||||
|     core.setFailed(error as Error); | ||||
|   } | ||||
| } | ||||
|  | ||||
| // call the run function | ||||
| run(); | ||||
| (async () => { | ||||
|   await run(); | ||||
| })().catch(error => { | ||||
|   core.setFailed(error.message); | ||||
| }); | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
| @ -18,15 +18,15 @@ add_log() { | ||||
|  | ||||
| # Function to remove extensions | ||||
| remove_extension() { | ||||
|   extension=$1 | ||||
|   sudo sed -i '' "/$extension/d" "$ini_file" | ||||
|   local extension=$1 | ||||
|   sudo sed -Ei '' "/=(.*\/)?\"?$extension/d" "$ini_file" | ||||
|   sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1 | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 | ||||
| } | ||||
|  | ||||
| # Function to test if extension is loaded | ||||
| check_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   if [ "$extension" != "mysql" ]; then | ||||
|     php -m | grep -i -q -w "$extension" | ||||
|   else | ||||
| @ -34,24 +34,33 @@ check_extension() { | ||||
|   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() { | ||||
|   extension=$1 | ||||
|   stability=$2 | ||||
|   local extension=$1 | ||||
|   stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")" | ||||
|   pecl_rest='https://pecl.php.net/rest/r/' | ||||
|   response=$(curl -q -sSL "$pecl_rest$extension"/allreleases.xml) | ||||
|   pecl_version=$(echo "$response" | grep -m 1 -Eo "(\d*\.\d*\.\d*$stability\d*)") | ||||
|   response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml) | ||||
|   pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)") | ||||
|   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 | ||||
|   echo "$pecl_version" | ||||
| } | ||||
|  | ||||
| # Function to install a PECL version | ||||
| add_pecl_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   pecl_version=$2 | ||||
|   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 | ||||
|     echo "$prefix=$ext_dir/$extension.so" >>"$ini_file" | ||||
|   fi | ||||
| @ -61,26 +70,51 @@ add_pecl_extension() { | ||||
|   else | ||||
|     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" && | ||||
|       add_log "$tick" "$extension" "Installed and enabled" | ||||
|     ) || add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver" | ||||
|   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 "$tap" >/dev/null 2>&1 | ||||
|     fi | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install a php extension from shivammathur/extensions tap. | ||||
| add_brew_extension() { | ||||
|   extension=$1 | ||||
|   if ! brew tap | grep shivammathur/extensions; then | ||||
|     brew tap --shallow shivammathur/extensions | ||||
|   fi | ||||
|   brew install "$extension@$version" | ||||
|   sudo cp "$(brew --prefix)/opt/$extension@$version/$extension.so" "$ext_dir" | ||||
|   formula=$1 | ||||
|   extension=$(grep "$formula=" "$dist"/../src/configs/brew_extensions | cut -d '=' -f 2) | ||||
|   [[ -z "$extension" ]] && extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")" | ||||
|   add_brew_tap shivammathur/homebrew-php | ||||
|   add_brew_tap shivammathur/homebrew-extensions | ||||
|   sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true | ||||
|   brew install "$formula@$version" | ||||
|   sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir" | ||||
| } | ||||
|  | ||||
| # Function to setup extensions | ||||
| add_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
| @ -98,14 +132,39 @@ add_extension() { | ||||
|  | ||||
| # Function to pre-release extensions using PECL | ||||
| add_unstable_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   stability=$2 | ||||
|   prefix=$3 | ||||
|   pecl_version=$(get_pecl_version "$extension" "$stability") | ||||
|   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 ! [ -d "$composer_home" ]; then | ||||
|     sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home" | ||||
|   else | ||||
|     sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home" | ||||
|   fi | ||||
|   if ! [ -e "$composer_json" ]; then | ||||
|     echo '{}' | tee "$composer_json" >/dev/null | ||||
|     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() { | ||||
|   url=$1 | ||||
|   tool=$2 | ||||
| @ -113,20 +172,28 @@ add_tool() { | ||||
|   if [ ! -e "$tool_path" ]; then | ||||
|     rm -rf "$tool_path" | ||||
|   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 | ||||
|     sudo chmod a+x "$tool_path" | ||||
|     if [ "$tool" = "composer" ]; then | ||||
|       composer -q global config process-timeout 0 | ||||
|       echo "::add-path::/Users/$USER/.composer/vendor/bin" | ||||
|       if [ -n "$COMPOSER_TOKEN" ]; then | ||||
|         composer -q global config github-oauth.github.com "$COMPOSER_TOKEN" | ||||
|       fi | ||||
|       configure_composer "$tool_path" | ||||
|     elif [ "$tool" = "phan" ]; then | ||||
|       add_extension fileinfo "pecl_install fileinfo" extension >/dev/null 2>&1 | ||||
|       add_extension ast "pecl_install ast" extension >/dev/null 2>&1 | ||||
|     elif [ "$tool" = "phive" ]; then | ||||
|       add_extension curl "sudo pecl install -f curl" extension >/dev/null 2>&1 | ||||
|       add_extension mbstring "sudo pecl install -f mbstring" extension >/dev/null 2>&1 | ||||
|       add_extension xml "sudo pecl install -f xml" extension >/dev/null 2>&1 | ||||
|       add_extension curl "pecl_install curl" extension >/dev/null 2>&1 | ||||
|       add_extension mbstring "pecl_install mbstring" extension >/dev/null 2>&1 | ||||
|       add_extension xml "pecl_install xml" extension >/dev/null 2>&1 | ||||
|     elif [ "$tool" = "cs2pr" ]; then | ||||
|       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" | ||||
| @ -144,16 +211,22 @@ add_composertool() { | ||||
|   release=$2 | ||||
|   prefix=$3 | ||||
|   ( | ||||
|     sudo rm -f "$composer_lock" >/dev/null 2>&1 || true | ||||
|     composer global require "$prefix$release" >/dev/null 2>&1 && | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   ) || 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 | ||||
| configure_pecl() { | ||||
|   for tool in pear pecl; do | ||||
|     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 | ||||
|   done | ||||
| } | ||||
| @ -163,20 +236,94 @@ add_pecl() { | ||||
|   add_log "$tick" "PECL" "Added" | ||||
| } | ||||
|  | ||||
| # Function to backup all libraries of a formula | ||||
| link_libraries() { | ||||
|   formula=$1 | ||||
|   formula_prefix="$(brew --prefix "$formula")" | ||||
|   sudo mkdir -p "$formula_prefix"/lib | ||||
|   for lib in "$formula_prefix"/lib/*.dylib; do | ||||
|     lib_name=$(basename "$lib") | ||||
|     sudo cp -a "$lib" "$brew_prefix/lib/$lib_name" 2>/dev/null || true | ||||
|   done | ||||
| } | ||||
|  | ||||
| patch_brew() { | ||||
|   formula_installer="$brew_repo"/Library/Homebrew/formula_installer.rb | ||||
|   code=" keg.link\(verbose: verbose\?" | ||||
|   sudo sed -Ei '' "s/$code.*/$code, overwrite: true\)/" "$formula_installer" | ||||
|   # shellcheck disable=SC2064 | ||||
|   trap "sudo sed -Ei '' 's/$code.*/$code, overwrite: overwrite?\)/' $formula_installer" exit | ||||
| } | ||||
|  | ||||
| # Helper function to update the dependencies. | ||||
| update_dependencies_helper() { | ||||
|   dependency=$1 | ||||
|   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 "$dependency" | ||||
| } | ||||
|  | ||||
| # Function to update dependencies | ||||
| update_dependencies() { | ||||
|   if ! [ -e /tmp/update_dependencies ]; then | ||||
|     if [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then | ||||
|       patch_brew | ||||
|       while read -r dependency; do | ||||
|         update_dependencies_helper "$dependency" & | ||||
|         to_wait+=($!) | ||||
|       done <"$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}" | ||||
|       wait "${to_wait[@]}" | ||||
|     fi | ||||
|     echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to get PHP version if it is already installed using Homebrew. | ||||
| get_brewed_php() { | ||||
|   php_cellar="$brew_prefix"/Cellar/php | ||||
|   if [ -d "$php_cellar" ] && ! [[ "$(find "$php_cellar" -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]]; then | ||||
|     php-config --version 2>/dev/null | cut -c 1-3 | ||||
|   else | ||||
|     echo 'false'; | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to setup PHP and composer | ||||
| setup_php() { | ||||
|   export HOMEBREW_NO_INSTALL_CLEANUP=TRUE | ||||
|   brew tap --shallow shivammathur/homebrew-php | ||||
|   brew install shivammathur/php/php@"$version" | ||||
|   add_brew_tap shivammathur/homebrew-php | ||||
|   update_dependencies | ||||
|   brew upgrade shivammathur/php/php@"$version" 2>/dev/null || brew install shivammathur/php/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 | ||||
| tick="✓" | ||||
| cross="✗" | ||||
| version=$1 | ||||
| dist=$2 | ||||
| tool_path_dir="/usr/local/bin" | ||||
| existing_version=$(php-config --version 2>/dev/null | cut -c 1-3) | ||||
| curl_opts=(-sL) | ||||
| composer_home="$HOME/.composer" | ||||
| composer_bin="$composer_home/vendor/bin" | ||||
| composer_json="$composer_home/composer.json" | ||||
| composer_lock="$composer_home/composer.lock" | ||||
| brew_prefix="$(brew --prefix)" | ||||
| brew_repo="$(brew --repository)" | ||||
| tap_dir="$brew_repo"/Library/Taps | ||||
| existing_version=$(get_brewed_php) | ||||
| export HOMEBREW_CHANGE_ARCH_TO_ARM=1 | ||||
| export HOMEBREW_DEVELOPER=1 | ||||
| export HOMEBREW_NO_INSTALL_CLEANUP=1 | ||||
| export HOMEBREW_NO_AUTO_UPDATE=1 | ||||
| export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 | ||||
|  | ||||
| # Setup PHP | ||||
| step_log "Setup PHP" | ||||
| @ -188,10 +335,15 @@ else | ||||
| fi | ||||
| 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" | ||||
| echo "date.timezone=UTC" >>"$ini_file" | ||||
| ext_dir=$(php -i | grep -Ei "extension_dir => /(usr|opt)" | sed -e "s|.*=> s*||") | ||||
| configure_php | ||||
| ext_dir=$(php -i | grep -Ei "extension_dir => /" | 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 ' ') | ||||
| if [ "${semver%.*}" != "$version" ]; then | ||||
|   add_log "$cross" "PHP" "Could not setup PHP $version" | ||||
|   exit 1 | ||||
| fi | ||||
| configure_pecl | ||||
| sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/" | ||||
| add_log "$tick" "PHP" "$status PHP $semver" | ||||
|  | ||||
| @ -1,9 +1,22 @@ | ||||
| release_version=$(lsb_release -s -r) | ||||
| sudo DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:ondrej/pkg-gearman -y | ||||
| sudo DEBIAN_FRONTEND=noninteractive apt-get update -y | ||||
| # Helper function to add gearman extension. | ||||
| add_gearman_helper() { | ||||
|   add_ppa ondrej/pkg-gearman | ||||
|   sudo DEBIAN_FRONTEND=noninteractive apt-fast install -y libgearman-dev | ||||
|   enable_extension gearman extension | ||||
|   if ! check_extension gearman; then | ||||
|     status="Installed and enabled" | ||||
|     sudo DEBIAN_FRONTEND=noninteractive apt-fast install -y php"${version:?}"-gearman || pecl_install gearman | ||||
|     enable_extension gearman extension | ||||
|   fi | ||||
| } | ||||
|  | ||||
| if [ "$release_version" = "18.04" ]; then | ||||
|   sudo DEBIAN_FRONTEND=noninteractive apt-fast install -y libgearman-dev php"$1"-gearman | ||||
| elif [ "$release_version" = "16.04" ]; then | ||||
|   sudo DEBIAN_FRONTEND=noninteractive apt-fast install -y php"$1"-gearman | ||||
| fi | ||||
| # Function to add gearman extension. | ||||
| add_gearman() { | ||||
|   status="Enabled" | ||||
|   add_gearman_helper >/dev/null 2>&1 | ||||
|   if check_extension gearman; then | ||||
|     add_log "${tick:?}" "gearman" "$status" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| add_gearman | ||||
|  | ||||
| @ -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 | ||||
| @ -18,7 +18,7 @@ Function Install-Phalcon() { | ||||
|     } else { | ||||
|         $installed = Get-Php -Path $php_dir | ||||
|         $nts = if (!$installed.ThreadSafe) { "_nts" } else { "" } | ||||
|         $match = Invoke-WebRequest -UseBasicParsing -Uri $domain/phalcon/cphalcon/releases | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`"" | ||||
|         $match = Invoke-WebRequest -UseBasicParsing -Uri "$domain/phalcon/cphalcon/releases/v3.4.5" | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`"" | ||||
|         $zip_file = $match.Matches[0].Groups[1].Value | ||||
|         Invoke-WebRequest -UseBasicParsing -Uri $domain/$zip_file -OutFile $ENV:RUNNER_TOOL_CACHE\phalcon.zip > $null 2>&1 | ||||
|         Expand-Archive -Path $ENV:RUNNER_TOOL_CACHE\phalcon.zip -DestinationPath $ENV:RUNNER_TOOL_CACHE\phalcon -Force > $null 2>&1 | ||||
|  | ||||
| @ -20,9 +20,9 @@ update_ppa() { | ||||
|  | ||||
| # Function to install phalcon | ||||
| install_phalcon() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   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" | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1,47 +0,0 @@ | ||||
| # Function to log result of a operation | ||||
| add_log() { | ||||
|   mark=$1 | ||||
|   subject=$2 | ||||
|   message=$3 | ||||
|   if [ "$mark" = "$tick" ]; then | ||||
|     printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message" | ||||
|   else | ||||
|     printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install phalcon | ||||
| install_phalcon() { | ||||
|   ( | ||||
|     sed -i '' '/extension.*psr/d' "$ini_file" | ||||
|     brew tap shivammathur/homebrew-phalcon >/dev/null 2>&1 | ||||
|     brew install phalcon@"$php_version"_"$extension_major" >/dev/null 2>&1 | ||||
|     sudo cp /usr/local/opt/psr@"$php_version"/psr.so "$ext_dir" >/dev/null 2>&1 | ||||
|     sudo cp /usr/local/opt/phalcon@"$php_version"_"$extension_major"/phalcon.so "$ext_dir" >/dev/null 2>&1 | ||||
|     add_log "$tick" "$extension" "Installed and enabled" | ||||
|   ) || add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
| } | ||||
|  | ||||
| tick="✓" | ||||
| cross="✗" | ||||
| extension=$1 | ||||
| extension_major=${extension: -1} | ||||
| php_version=$2 | ||||
| semver=$(php -v | head -n 1 | cut -f 2 -d ' ') | ||||
| ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") | ||||
| ext_dir=$(php -i | grep "extension_dir => /usr" | sed -e "s|.*=> s*||") | ||||
| if [ -e "$ext_dir/psr.so" ] && [ -e "$ext_dir/phalcon.so" ]; then | ||||
|   phalcon_version=$(php -d="extension=psr.so" -d="extension=phalcon.so" -r "echo phpversion('phalcon');" 2>/dev/null | cut -d'.' -f 1) | ||||
|   if php -m | grep -i -q -w psr; then | ||||
|     phalcon_version=$(php -d="extension=phalcon.so" -r "echo phpversion('phalcon');" 2>/dev/null | cut -d'.' -f 1) | ||||
|   fi | ||||
|   if [ "$phalcon_version" != "$extension_major" ]; then | ||||
|     install_phalcon | ||||
|   else | ||||
|     if ! php -m | grep -i -q -w psr; then echo "extension=psr.so" >>"$ini_file"; fi | ||||
|     echo "extension=phalcon.so" >>"$ini_file" | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   fi | ||||
| else | ||||
|   install_phalcon | ||||
| fi | ||||
| @ -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 | ||||
| @ -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*||")" | ||||
| @ -16,41 +16,80 @@ add_log() { | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to update php ppa | ||||
| # Function to backup and cleanup package lists. | ||||
| cleanup_lists() { | ||||
|   ppa_prefix=${1-ondrej} | ||||
|   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/*"${ppa_prefix}"*.list /etc/apt/sources.list.d/ | ||||
|     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() { | ||||
|   ppa=${1:-ondrej/php} | ||||
|   if ! apt-cache policy | grep -q "$ppa"; then | ||||
|     cleanup_lists "$(dirname "$ppa")" | ||||
|     LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to update the package lists. | ||||
| update_lists() { | ||||
|   if [ "$lists_updated" = "false" ]; then | ||||
|   if [ ! -e /tmp/setup_php ]; then | ||||
|     add_ppa ondrej/php >/dev/null 2>&1 | ||||
|     cleanup_lists | ||||
|     sudo "$debconf_fix" apt-get update >/dev/null 2>&1 | ||||
|     echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to configure PECL | ||||
| configure_pecl() { | ||||
|   if [ "$pecl_config" = "false" ] && [ -e /usr/bin/pecl ]; then | ||||
|     for tool in pear pecl; do | ||||
|       sudo "$tool" config-set php_ini "$pecl_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 | ||||
|   if ! [ -e /tmp/pecl_config ]; then | ||||
|     if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then | ||||
|       add_pecl >/dev/null 2>&1 | ||||
|     fi | ||||
|     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 | ||||
|     pecl_config="true" | ||||
|     echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Fuction to get the PECL version | ||||
| # Function to get the PECL version | ||||
| get_pecl_version() { | ||||
|   extension=$1 | ||||
|   stability=$2 | ||||
|   local extension=$1 | ||||
|   stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")" | ||||
|   pecl_rest='https://pecl.php.net/rest/r/' | ||||
|   response=$(curl -q -sSL "$pecl_rest$extension"/allreleases.xml) | ||||
|   pecl_version=$(echo "$response" | grep -m 1 -Po "(\d*\.\d*\.\d*$stability\d*)") | ||||
|   response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml) | ||||
|   pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)") | ||||
|   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 | ||||
|   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 enable existing extensions. | ||||
| enable_extension() { | ||||
|   sudo find /var/lib/php/modules/"$version" -path "*disabled*$1" -delete | ||||
|   if ! check_extension "$1" && [ -e "$ext_dir/$1.so" ]; then | ||||
|     echo "$2=$ext_dir/$1.so" | sudo tee -a "$pecl_file" >/dev/null | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to test if extension is loaded | ||||
| check_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   if [ "$extension" != "mysql" ]; then | ||||
|     php -m | grep -i -q -w "$extension" | ||||
|   else | ||||
| @ -60,16 +99,17 @@ check_extension() { | ||||
|  | ||||
| # Function to delete extensions | ||||
| delete_extension() { | ||||
|   extension=$1 | ||||
|   sudo sed -i "/$extension/d" "$ini_file" | ||||
|   sudo sed -i "/$extension/d" "$pecl_file" | ||||
|   local extension=$1 | ||||
|   sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file" | ||||
|   sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file" | ||||
|   sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1 | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 | ||||
|   sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status | ||||
| } | ||||
|  | ||||
| # Function to disable and delete extensions | ||||
| remove_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   if [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then | ||||
|     sudo phpdismod -v "$version" "$extension" | ||||
|   fi | ||||
| @ -78,17 +118,15 @@ remove_extension() { | ||||
|  | ||||
| # Function to setup extensions | ||||
| add_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     echo "$prefix=$extension.so" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|   elif check_extension "$extension"; then | ||||
|   enable_extension "$extension" "$prefix" | ||||
|   if check_extension "$extension"; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   elif ! check_extension "$extension"; then | ||||
|     eval "$install_command" >/dev/null 2>&1 || | ||||
|     (update_lists && eval "$install_command" >/dev/null 2>&1) || | ||||
|     sudo pecl install -f "$extension" >/dev/null 2>&1 | ||||
|     (update_lists && eval "$install_command" >/dev/null 2>&1) || pecl_install "$extension" | ||||
|     (check_extension "$extension" && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|     add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
|   fi | ||||
| @ -97,12 +135,14 @@ add_extension() { | ||||
|  | ||||
| # Function to install a PECL version | ||||
| add_pecl_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   pecl_version=$2 | ||||
|   prefix=$3 | ||||
|   if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     echo "$prefix=$ext_dir/$extension.so" >>"$pecl_file" | ||||
|   configure_pecl | ||||
|   if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then | ||||
|     pecl_version=$(get_pecl_version "$extension" "$pecl_version") | ||||
|   fi | ||||
|   enable_extension "$extension" "$prefix" | ||||
|   ext_version=$(php -r "echo phpversion('$extension');") | ||||
|   if [ "$ext_version" = "$pecl_version" ]; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
| @ -118,29 +158,39 @@ add_pecl_extension() { | ||||
|  | ||||
| # Function to pre-release extensions using PECL | ||||
| add_unstable_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   stability=$2 | ||||
|   prefix=$3 | ||||
|   pecl_version=$(get_pecl_version "$extension" "$stability") | ||||
|   add_pecl_extension "$extension" "$pecl_version" "$prefix" | ||||
| } | ||||
|  | ||||
| # Function to update extension | ||||
| update_extension() { | ||||
|   extension=$1 | ||||
|   latest_version=$2 | ||||
|   current_version=$(php -r "echo phpversion('$extension');") | ||||
|   final_version=$(printf "%s\n%s" "$current_version" "$latest_version" | sort | tail -n 1) | ||||
|   if [ "$final_version" != "$current_version"  ]; then | ||||
|     version_exists=$(apt-cache policy -- *"$extension" | grep "$final_version") | ||||
|     if [ -z "$version_exists" ]; then | ||||
|       update_lists | ||||
|     fi | ||||
|     $apt_install php"$version"-"$extension" | ||||
| # 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 ! [ -d "$composer_home" ]; then | ||||
|     sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home" | ||||
|   else | ||||
|     sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home" | ||||
|   fi | ||||
|   if ! [ -e "$composer_json" ]; then | ||||
|     echo '{}' | tee "$composer_json" >/dev/null | ||||
|     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 | ||||
| # Function to setup a remote tool. | ||||
| add_tool() { | ||||
|   url=$1 | ||||
|   tool=$2 | ||||
| @ -148,15 +198,21 @@ add_tool() { | ||||
|   if [ ! -e "$tool_path" ]; then | ||||
|     rm -rf "$tool_path" | ||||
|   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 | ||||
|     sudo chmod a+x "$tool_path" | ||||
|     if [ "$tool" = "composer" ]; then | ||||
|       composer -q global config process-timeout 0 | ||||
|       echo "::add-path::/home/$USER/.composer/vendor/bin" | ||||
|       if [ -n "$COMPOSER_TOKEN" ]; then | ||||
|         composer -q global config github-oauth.github.com "$COMPOSER_TOKEN" | ||||
|       fi | ||||
|       configure_composer "$tool_path" | ||||
|     elif [ "$tool" = "cs2pr" ]; then | ||||
|       sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path" | ||||
|     elif [ "$tool" = "phive" ]; then | ||||
| @ -167,6 +223,7 @@ add_tool() { | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   else | ||||
|     add_log "$cross" "$tool" "Could not setup $tool" | ||||
|     [ "$tool" = "composer" ] && exit 1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| @ -176,9 +233,16 @@ add_composertool() { | ||||
|   release=$2 | ||||
|   prefix=$3 | ||||
|   ( | ||||
|     sudo rm -f "$composer_lock" >/dev/null 2>&1 || true | ||||
|     composer global require "$prefix$release" >/dev/null 2>&1 && | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   ) || 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 | ||||
| @ -193,7 +257,17 @@ add_devtools() { | ||||
|  | ||||
| # Function to setup the nightly build from master branch | ||||
| 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 | ||||
| @ -224,33 +298,41 @@ php_semver() { | ||||
|   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 | ||||
| tick="✓" | ||||
| cross="✗" | ||||
| lists_updated="false" | ||||
| pecl_config="false" | ||||
| version=$1 | ||||
| dist=$2 | ||||
| debconf_fix="DEBIAN_FRONTEND=noninteractive" | ||||
| apt_install="sudo $debconf_fix apt-fast install -y" | ||||
| apt_install="sudo $debconf_fix apt-fast install -y --no-install-recommends" | ||||
| tool_path_dir="/usr/local/bin" | ||||
| curl_opts=(-sL) | ||||
| composer_home="$HOME/.composer" | ||||
| composer_bin="$composer_home/vendor/bin" | ||||
| composer_json="$composer_home/composer.json" | ||||
| composer_lock="$composer_home/composer.lock" | ||||
| existing_version=$(php-config --version 2>/dev/null | cut -c 1-3) | ||||
|  | ||||
| # 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 [ "$DISTRIB_RELEASE" = "20.04" ]; then | ||||
|   LC_ALL=C.UTF-8 sudo apt-add-repository ppa:ondrej/php -y | ||||
| fi | ||||
|  | ||||
| if [ "$existing_version" != "$version" ]; then | ||||
|   if [ ! -e "/usr/bin/php$version" ]; then | ||||
|     if [ "$version" = "8.0" ]; then | ||||
|       setup_master >/dev/null 2>&1 | ||||
|     else | ||||
|       update_lists | ||||
|       IFS=' ' read -r -a packages <<< "$(echo "curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")" | ||||
|       $apt_install php"$version" "${packages[@]}" >/dev/null 2>&1 | ||||
|       add_packaged_php >/dev/null 2>&1 | ||||
|     fi | ||||
|     status="Installed" | ||||
|   else | ||||
| @ -262,11 +344,18 @@ else | ||||
|   status="Found" | ||||
| fi | ||||
|  | ||||
| if ! command -v php"$version" >/dev/null; then | ||||
|   add_log "$cross" "PHP" "Could not setup PHP $version" | ||||
|   exit 1 | ||||
| fi | ||||
| semver=$(php_semver) | ||||
| scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||") | ||||
| 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*||") | ||||
| pecl_file="$scan_dir"/99-pecl.ini | ||||
| 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 cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/" | ||||
| add_log "$tick" "PHP" "$status PHP $semver" | ||||
|  | ||||
| @ -8,7 +8,7 @@ param ( | ||||
|   [ValidateNotNull()] | ||||
|   [ValidateLength(1, [int]::MaxValue)] | ||||
|   [string] | ||||
|   $dir | ||||
|   $dist | ||||
| ) | ||||
|  | ||||
| Function Step-Log($message) { | ||||
| @ -43,15 +43,42 @@ Function Add-ToProfile { | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Install-PhpManager() { | ||||
|   $repo = "mlocati/powershell-phpmanager" | ||||
|   $zip_file = "$php_dir\PhpManager.zip" | ||||
|   $tag = (Invoke-RestMethod https://api.github.com/repos/$repo/tags)[0].Name | ||||
|   $module_path = "$php_dir\PhpManager\powershell-phpmanager-$tag\PhpManager" | ||||
|   Invoke-WebRequest -UseBasicParsing -Uri https://github.com/$repo/archive/$tag.zip -OutFile $zip_file | ||||
|   Expand-Archive -Path $zip_file -DestinationPath $php_dir\PhpManager -Force | ||||
| Function Add-Printf { | ||||
|   if (-not(Test-Path "C:\Program Files\Git\usr\bin\printf.exe")) { | ||||
|     if(Test-Path "C:\msys64\usr\bin\printf.exe") { | ||||
|       New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe -Force > $null 2>&1 | ||||
|     } else { | ||||
|       Invoke-WebRequest -UseBasicParsing -Uri "$github/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$php_dir\printf.zip" | ||||
|       Expand-Archive -Path $php_dir\printf.zip -DestinationPath $php_dir -Force | ||||
|     } | ||||
|   } else { | ||||
|     New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe" -Force > $null 2>&1 | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Install-PSPackage() { | ||||
|   param( | ||||
|     [Parameter(Position = 0, Mandatory = $true)] | ||||
|     $package, | ||||
|     [Parameter(Position = 1, Mandatory = $true)] | ||||
|     $psm1_path, | ||||
|     [Parameter(Position = 2, Mandatory = $true)] | ||||
|     $url, | ||||
|     [Parameter(Position = 3, Mandatory = $true)] | ||||
|     $cmdlet | ||||
|   ) | ||||
|   $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 | ||||
|   Add-ToProfile $current_profile "PhpManager" "Import-Module $module_path" | ||||
|   Add-ToProfile $current_profile "$package-search" "Import-Module $module_path" | ||||
|  | ||||
|   if($null -eq (Get-Command $cmdlet -ErrorAction SilentlyContinue)) { | ||||
|     Install-Module -Name $package -Force | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Add-Extension { | ||||
| @ -65,7 +92,12 @@ Function Add-Extension { | ||||
|     [ValidateNotNull()] | ||||
|     [ValidateSet('stable', 'beta', 'alpha', 'devel', 'snapshot')] | ||||
|     [string] | ||||
|     $mininum_stability = 'stable' | ||||
|     $stability = 'stable', | ||||
|     [Parameter(Position = 2, Mandatory = $false)] | ||||
|     [ValidateNotNull()] | ||||
|     [ValidatePattern('^\d+(\.\d+){0,2}$')] | ||||
|     [string] | ||||
|     $extension_version = '' | ||||
|   ) | ||||
|   try { | ||||
|     $extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension } | ||||
| @ -84,7 +116,12 @@ Function Add-Extension { | ||||
|       } | ||||
|     } | ||||
|     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" | ||||
|     } | ||||
|   } | ||||
| @ -109,12 +146,35 @@ Function Remove-Extension() { | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Add-Tool() { | ||||
|   Param ( | ||||
|  | ||||
| Function Edit-ComposerConfig() { | ||||
|   Param( | ||||
|     [Parameter(Position = 0, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
|     [ValidateLength(1, [int]::MaxValue)] | ||||
|     [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, | ||||
|     [Parameter(Position = 1, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
| @ -125,36 +185,42 @@ Function Add-Tool() { | ||||
|   if (Test-Path $php_dir\$tool) { | ||||
|     Remove-Item $php_dir\$tool | ||||
|   } | ||||
|   if($url.Count -gt 1) { $url = $url[0] } | ||||
|   if ($tool -eq "symfony") { | ||||
|     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 { | ||||
|     try { | ||||
|       Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool | ||||
|       $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 | ||||
|     } 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 | ||||
|     } catch { | ||||
|       if($url -match '.*github.com.*releases.*latest.*') { | ||||
|         try { | ||||
|           $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]) | ||||
|           Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool | ||||
|         } catch { } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   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" | ||||
|   } else { | ||||
|     Add-Log $cross $tool "Could not add $tool" | ||||
| @ -179,12 +245,21 @@ Function Add-Composertool() { | ||||
|     [string] | ||||
|     $prefix | ||||
|   ) | ||||
|   if(Test-Path $composer_lock) { | ||||
|     Remove-Item -Path $composer_lock -Force | ||||
|   } | ||||
|   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($?) { | ||||
|     Add-Log $tick $tool "Added" | ||||
|   } else { | ||||
|     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() { | ||||
| @ -198,8 +273,14 @@ $php_dir = 'C:\tools\php' | ||||
| $ext_dir = "$php_dir\ext" | ||||
| $current_profile = "$PSHOME\Profile.ps1" | ||||
| $ProgressPreference = 'SilentlyContinue' | ||||
| $master_version = '8.0' | ||||
| $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" | ||||
| $arch = 'x64' | ||||
| if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') { | ||||
|   $arch = 'x86' | ||||
| } | ||||
| $ts = $env:PHPTS -eq 'ts' | ||||
| if($env:PHPTS -ne 'ts') { | ||||
|   $env:PHPTS = 'nts' | ||||
| @ -208,8 +289,9 @@ if(-not(Test-Path -LiteralPath $current_profile)) { | ||||
|   New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1 | ||||
| } | ||||
|  | ||||
| Add-Printf >$null 2>&1 | ||||
| Step-Log "Setup PhpManager" | ||||
| Install-PhpManager >$null 2>&1 | ||||
| Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php >$null 2>&1 | ||||
| Add-Log $tick "PhpManager" "Installed" | ||||
|  | ||||
| Step-Log "Setup PHP" | ||||
| @ -221,27 +303,24 @@ if (Test-Path -LiteralPath $php_dir -PathType Container) { | ||||
| } | ||||
| $status = "Installed" | ||||
| if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) { | ||||
|   if ($version -lt '7.0') { | ||||
|     Install-Module -Name VcRedist -Force | ||||
|     $arch='x86' | ||||
|   if ($version -lt '7.0' -and ($null -eq (Get-Module -ListAvailable -Name VcRedist))) { | ||||
|     Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1 | ||||
|   } | ||||
|   if ($version -eq $master_version) { | ||||
|     $version = 'master' | ||||
|   } | ||||
|  | ||||
|   Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force >$null 2>&1 | ||||
|   try { | ||||
|     Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1 | ||||
|   } catch { } | ||||
| } else { | ||||
|   $status = "Found" | ||||
| } | ||||
|  | ||||
| $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 } | ||||
| Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir | ||||
| Update-PhpCAInfo -Path $php_dir -Source CurrentUser | ||||
| if ($version -eq 'master') { | ||||
|   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 | ||||
|   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 | ||||
| } | ||||
| Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE | ||||
| New-Item -ItemType Directory -Path $composer_bin -Force > $null 2>&1 | ||||
| Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)" | ||||
|  | ||||
							
								
								
									
										180
									
								
								src/tools.ts
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								src/tools.ts
									
									
									
									
									
								
							| @ -32,9 +32,10 @@ export async function getCommand( | ||||
|  */ | ||||
| export async function getToolVersion(version: string): Promise<string> { | ||||
|   // semver_regex - https://semver.org/ | ||||
|   const semver_regex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; | ||||
|   const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/; | ||||
|   version = version.replace(/[><=^]*/, ''); | ||||
|   const semver_regex = | ||||
|     /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; | ||||
|   const composer_regex = /^stable$|^preview$|^snapshot$|^[1|2]$/; | ||||
|   version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1'); | ||||
|   switch (true) { | ||||
|     case composer_regex.test(version): | ||||
|     case semver_regex.test(version): | ||||
| @ -99,93 +100,29 @@ 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 | ||||
|  * | ||||
|  * @param version | ||||
|  * @param php_version | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function addPhive( | ||||
|   version: string, | ||||
|   php_version: string, | ||||
|   os_version: 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; | ||||
|     case /7\.2/.test(php_version): | ||||
|       version = version.replace('latest', '0.14.5'); | ||||
|       break; | ||||
|   } | ||||
|   switch (version) { | ||||
|     case 'latest': | ||||
|       return ( | ||||
| @ -282,15 +219,21 @@ export async function getSymfonyUri( | ||||
|  */ | ||||
| export async function addComposer(tools_list: string[]): Promise<string[]> { | ||||
|   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)); | ||||
|   let composer = 'composer'; | ||||
|   tools_list = tools_list.filter(tool => !regex_any.test(tool)); | ||||
|   switch (matches[0]) { | ||||
|     case undefined: | ||||
|   switch (true) { | ||||
|     case regex_composer1_tools.test(tools_list.join(' ')): | ||||
|       composer = 'composer:1'; | ||||
|       break; | ||||
|     case matches[0] == undefined: | ||||
|       break; | ||||
|     default: | ||||
|       composer = matches[matches.length - 1].replace(/v([1-2])/, '$1'); | ||||
|       composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1'); | ||||
|       break; | ||||
|   } | ||||
|   tools_list.unshift(composer); | ||||
| @ -298,27 +241,28 @@ 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 os_version | ||||
|  */ | ||||
| export async function updateComposer( | ||||
| export async function getComposerUrl( | ||||
|   version: string, | ||||
|   os_version: string | ||||
|   php_version: string | ||||
| ): Promise<string> { | ||||
|   switch (version) { | ||||
|     case 'snapshot': | ||||
|     case 'preview': | ||||
|     case '1': | ||||
|     case '2': | ||||
|       return ( | ||||
|         '\ncomposer self-update --' + | ||||
|         version + | ||||
|         (await utils.suppressOutput(os_version)) | ||||
|       ); | ||||
|   let cache_url = `https://github.com/shivammathur/composer-cache/releases/latest/download/composer-${php_version}-${version.replace( | ||||
|     'latest', | ||||
|     'stable' | ||||
|   )}.phar`; | ||||
|   switch (true) { | ||||
|     case /^snapshot$/.test(version): | ||||
|       return `${cache_url},https://getcomposer.org/composer.phar`; | ||||
|     case /^preview$|^[1-2]$/.test(version): | ||||
|       return `${cache_url},https://getcomposer.org/composer-${version}.phar`; | ||||
|     case /^\d+\.\d+\.\d+[\w-]*$/.test(version): | ||||
|       cache_url = `https://github.com/composer/composer/releases/download/${version}/composer.phar`; | ||||
|       return `${cache_url},https://getcomposer.org/composer-${version}.phar`; | ||||
|     default: | ||||
|       return ''; | ||||
|       return `${cache_url},https://getcomposer.org/composer-stable.phar`; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -336,7 +280,10 @@ export async function getCleanedToolsList( | ||||
|     .map(function (extension: string) { | ||||
|       return extension | ||||
|         .trim() | ||||
|         .replace(/robmorgan\/|hirak\/|narrowspark\/automatic-/, ''); | ||||
|         .replace( | ||||
|           /codeception\/|hirak\/|robmorgan\/|narrowspark\/automatic-/, | ||||
|           '' | ||||
|         ); | ||||
|     }) | ||||
|     .filter(Boolean); | ||||
|   return [...new Set(tools_list)]; | ||||
| @ -346,13 +293,11 @@ export async function getCleanedToolsList( | ||||
|  * Helper function to get script to setup a tool using a phar url | ||||
|  * | ||||
|  * @param tool | ||||
|  * @param version | ||||
|  * @param url | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function addArchive( | ||||
|   tool: string, | ||||
|   version: string, | ||||
|   url: string, | ||||
|   os_version: string | ||||
| ): Promise<string> { | ||||
| @ -445,53 +390,48 @@ export async function addTools( | ||||
|       case 'cs2pr': | ||||
|         uri = await getUri(tool, '', version, 'releases', '', 'download'); | ||||
|         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; | ||||
|       case 'php-cs-fixer': | ||||
|         uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download'); | ||||
|         url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri; | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'phpcs': | ||||
|       case 'phpcbf': | ||||
|         url = github + 'squizlabs/PHP_CodeSniffer/' + uri; | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'phive': | ||||
|         script += await addPhive(version, os_version); | ||||
|         script += await addPhive(version, php_version, os_version); | ||||
|         break; | ||||
|       case 'phpstan': | ||||
|         url = github + 'phpstan/phpstan/' + uri; | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'phpmd': | ||||
|         url = github + 'phpmd/phpmd/' + uri; | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'psalm': | ||||
|         url = github + 'vimeo/psalm/' + uri; | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'composer': | ||||
|         url = 'https://getcomposer.org/composer-stable.phar'; | ||||
|         script += | ||||
|           (await addArchive('composer', version, url, os_version)) + | ||||
|           (await updateComposer(version, os_version)); | ||||
|         url = await getComposerUrl(version, php_version); | ||||
|         script += await addArchive('composer', url, os_version); | ||||
|         break; | ||||
|       case 'codeception': | ||||
|         url = | ||||
|           'https://codeception.com/' + | ||||
|           (await getCodeceptionUri(version, php_version)); | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addPackage(tool, release, 'codeception/', os_version); | ||||
|         break; | ||||
|       case 'phpcpd': | ||||
|       case 'phpunit': | ||||
|         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; | ||||
|       case 'deployer': | ||||
|         url = await getDeployerUrl(version); | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         script += await addArchive(tool, url, os_version); | ||||
|         break; | ||||
|       case 'phinx': | ||||
|         script += await addPackage(tool, release, 'robmorgan/', os_version); | ||||
| @ -518,7 +458,7 @@ export async function addTools( | ||||
|       case 'symfony-cli': | ||||
|         uri = await getSymfonyUri(version, os_version); | ||||
|         url = github + 'symfony/cli/' + uri; | ||||
|         script += await addArchive('symfony', version, url, os_version); | ||||
|         script += await addArchive('symfony', url, os_version); | ||||
|         break; | ||||
|       default: | ||||
|         script += await utils.addLog( | ||||
|  | ||||
							
								
								
									
										96
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								src/utils.ts
									
									
									
									
									
								
							| @ -1,7 +1,27 @@ | ||||
| import {IncomingMessage} from 'http'; | ||||
| import * as fs from 'fs'; | ||||
| import * as https from 'https'; | ||||
| import * as path from 'path'; | ||||
| import * as core from '@actions/core'; | ||||
|  | ||||
| /** | ||||
|  * Function to read environment variable and return a string value. | ||||
|  * | ||||
|  * @param property | ||||
|  */ | ||||
| export async function readEnv(property: string): Promise<string> { | ||||
|   const property_lc: string = property.toLowerCase(); | ||||
|   const property_uc: string = property.toUpperCase(); | ||||
|   return ( | ||||
|     process.env[property] || | ||||
|     process.env[property_lc] || | ||||
|     process.env[property_uc] || | ||||
|     process.env[property_lc.replace('_', '-')] || | ||||
|     process.env[property_uc.replace('_', '-')] || | ||||
|     '' | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function to get inputs from both with and env annotations. | ||||
|  * | ||||
| @ -12,13 +32,56 @@ export async function getInput( | ||||
|   name: string, | ||||
|   mandatory: boolean | ||||
| ): Promise<string> { | ||||
|   const input = process.env[name]; | ||||
|   switch (input) { | ||||
|     case '': | ||||
|     case undefined: | ||||
|       return core.getInput(name, {required: mandatory}); | ||||
|     default: | ||||
|   const input = core.getInput(name); | ||||
|   const env_input = await readEnv(name); | ||||
|   switch (true) { | ||||
|     case 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/releases/v1/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 +253,7 @@ export async function extensionArray( | ||||
|           return extension | ||||
|             .trim() | ||||
|             .toLowerCase() | ||||
|             .replace('php-', '') | ||||
|             .replace('php_', ''); | ||||
|             .replace(/^php[-_]/, ''); | ||||
|         }) | ||||
|         .filter(Boolean); | ||||
|   } | ||||
| @ -210,9 +272,12 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> { | ||||
|       return []; | ||||
|     default: | ||||
|       return values_csv | ||||
|         .split(',') | ||||
|         .map(function (value: string) { | ||||
|           return value.trim(); | ||||
|         .split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/) | ||||
|         .map(function (value) { | ||||
|           return value | ||||
|             .trim() | ||||
|             .replace(/^["']|["']$|(?<==)["']/g, '') | ||||
|             .replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/, "='$1'"); | ||||
|         }) | ||||
|         .filter(Boolean); | ||||
|   } | ||||
| @ -224,14 +289,11 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> { | ||||
|  * @param extension | ||||
|  */ | ||||
| export async function getExtensionPrefix(extension: string): Promise<string> { | ||||
|   const zend: Array<string> = ['xdebug', 'opcache', 'ioncube', 'eaccelerator']; | ||||
|   switch (zend.indexOf(extension)) { | ||||
|     case 0: | ||||
|     case 1: | ||||
|       return 'zend_extension'; | ||||
|     case -1: | ||||
|   switch (true) { | ||||
|     default: | ||||
|       return 'extension'; | ||||
|     case /xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(extension): | ||||
|       return 'zend_extension'; | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1,63 +1,19 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     /* Basic Options */ | ||||
|     // "incremental": true,                   /* Enable incremental compilation */ | ||||
|     "target": "ES2019",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ | ||||
|     "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ | ||||
|     // "allowJs": true,                       /* Allow javascript files to be compiled. */ | ||||
|     // "checkJs": true,                       /* Report errors in .js files. */ | ||||
|     // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||||
|     // "declaration": true,                   /* Generates corresponding '.d.ts' file. */ | ||||
|     // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */ | ||||
|     // "sourceMap": true,                     /* Generates corresponding '.map' file. */ | ||||
|     // "outFile": "./",                       /* Concatenate and emit output to single file. */ | ||||
|     "outDir": "./lib",                        /* Redirect output structure to the directory. */ | ||||
|     "rootDir": "./src",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||||
|     // "composite": true,                     /* Enable project compilation */ | ||||
|     // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */ | ||||
|     // "removeComments": true,                /* Do not emit comments to output. */ | ||||
|     // "noEmit": true,                        /* Do not emit outputs. */ | ||||
|     // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */ | ||||
|     // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ | ||||
|     // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ | ||||
|  | ||||
|     /* Strict Type-Checking Options */ | ||||
|     "strict": true,                           /* Enable all strict type-checking options. */ | ||||
|     // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */ | ||||
|     // "strictNullChecks": true,              /* Enable strict null checks. */ | ||||
|     // "strictFunctionTypes": true,           /* Enable strict checking of function types. */ | ||||
|     // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ | ||||
|     // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */ | ||||
|     // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */ | ||||
|     // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */ | ||||
|  | ||||
|     /* Additional Checks */ | ||||
|     // "noUnusedLocals": true,                /* Report errors on unused locals. */ | ||||
|     // "noUnusedParameters": true,            /* Report errors on unused parameters. */ | ||||
|     // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */ | ||||
|     // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */ | ||||
|  | ||||
|     /* Module Resolution Options */ | ||||
|     // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||||
|     // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */ | ||||
|     // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||||
|     // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||||
|     // "typeRoots": [],                       /* List of folders to include type definitions from. */ | ||||
|     // "types": [],                           /* Type declaration files to be included in compilation. */ | ||||
|     // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||||
|     "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||||
|     // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */ | ||||
|     // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */ | ||||
|  | ||||
|     /* Source Map Options */ | ||||
|     // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */ | ||||
|     // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||
|     // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */ | ||||
|     // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ | ||||
|  | ||||
|     /* Experimental Options */ | ||||
|     // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */ | ||||
|     // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */ | ||||
|     "declaration": true, | ||||
|     "esModuleInterop": true, | ||||
|     "lib": [ | ||||
|       "ES2020" | ||||
|     ], | ||||
|     "module": "commonjs", | ||||
|     "moduleResolution": "node", | ||||
|     "noImplicitAny": true, | ||||
|     "outDir": "./lib", | ||||
|     "removeComments": true, | ||||
|     "rootDir": "./src", | ||||
|     "sourceMap": true, | ||||
|     "strict": true, | ||||
|     "target": "ES2019" | ||||
|   }, | ||||
|   "exclude": ["node_modules", "**/*.test.ts"] | ||||
| } | ||||
|   "exclude": ["__tests__", "lib", "node_modules"] | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	