mirror of
				https://github.com/shivammathur/setup-php.git
				synced 2025-10-31 23:36:21 +07:00 
			
		
		
		
	Compare commits
	
		
			189 Commits
		
	
	
		
			2.23.0
			...
			releases/v
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bc71c880ee | |||
| 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 | |||
| e763fddf01 | |||
| 3cd5c7fd3a | |||
| 988cef62da | |||
| be3ee05178 | |||
| a74c3369c5 | |||
| b9ef39c812 | |||
| 782615d572 | |||
| 31411b0d4d | |||
| 6b93e48d83 | |||
| fe504c5e23 | |||
| 61d755bd59 | |||
| 3455b4ca37 | |||
| 35c24a7d2f | |||
| da7361cc8f | |||
| 3f4c1842a0 | |||
| 062567eeb1 | |||
| 00b0d694d0 | |||
| 54afb29ef6 | |||
| 41329810ef | |||
| 90a6d88c24 | |||
| 8e6968c49e | |||
| 4ce413f558 | |||
| 533e0949a8 | |||
| 0ffe535b8e | |||
| 55fe8db60d | |||
| 5af5f992ec | |||
| e9e024e600 | |||
| a7ea0636d7 | |||
| c471c0a458 | |||
| 277239149a | |||
| 9385896f2a | |||
| 9cabd8564d | |||
| fdfa901941 | |||
| 527cd148c8 | |||
| 59b6e2b54a | |||
| 5ad0888329 | |||
| 3cfc409e14 | |||
| ebc671081f | |||
| efae663c0f | |||
| fa8a671e6f | |||
| 6a4159ba98 | |||
| 0da52b1327 | |||
| 3579c7ef28 | 
| @ -1,7 +1,7 @@ | ||||
| { | ||||
|   "env": { "node": true, "jest": true }, | ||||
|   "parser": "@typescript-eslint/parser", | ||||
|   "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" }, | ||||
|   "parserOptions": { "ecmaVersion": 2019, "sourceType": "module" }, | ||||
|   "extends": [ | ||||
|     "eslint:recommended", | ||||
|     "plugin:@typescript-eslint/eslint-recommended", | ||||
| @ -10,14 +10,7 @@ | ||||
|     "plugin:import/warnings", | ||||
|     "plugin:import/typescript", | ||||
|     "plugin:prettier/recommended", | ||||
|     "prettier/@typescript-eslint" | ||||
|     "prettier" | ||||
|   ], | ||||
|   "plugins": ["@typescript-eslint", "jest"], | ||||
|   "rules": { | ||||
|     "camelcase": "off", | ||||
|     "require-atomic-updates": "off", | ||||
|     "@typescript-eslint/ban-ts-ignore": "off", | ||||
|     "@typescript-eslint/camelcase": "off", | ||||
|     "@typescript-eslint/no-unused-vars": "off" | ||||
|   } | ||||
|   "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,8 +1,3 @@ | ||||
| # These are supported funding model platforms | ||||
|  | ||||
| github:shivammathur | ||||
| community_bridge: setup-php | ||||
| issuehunt: shivammathur | ||||
| patreon: shivammathur | ||||
| liberapay: shivammathur | ||||
| custom: https://www.paypal.me/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. | ||||
|  | ||||
							
								
								
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/FIX.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/FIX.md
									
									
									
									
										vendored
									
									
								
							| @ -1,33 +0,0 @@ | ||||
| --- | ||||
| name: 🐞 Bug Fix | ||||
| about: You have a fix for a bug? | ||||
| labels: bug | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## A Pull Request should be associated with an Issue. | ||||
|  | ||||
| > We wish to have discussions in Issues. A single issue may be targeted by multiple PRs. | ||||
| > If you're offering a new feature or fixing anything, we'd like to know beforehand in Issues, | ||||
| > and potentially we'll be able to point development in a particular direction. | ||||
|  | ||||
| Related issue:  | ||||
|  | ||||
| > Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md) | ||||
| > Thank you! We are open to PRs, but please understand if for technical reasons we are unable to accept each and any PR | ||||
|  | ||||
| ### Description | ||||
|  | ||||
| This PR [briefly explain what it does] | ||||
|  | ||||
| > In case this PR introduced TypeScript/JavaScript code changes: | ||||
|  | ||||
| - [ ] I have written test cases for the changes in this pull request. | ||||
| - [ ] 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. | ||||
|  | ||||
| <!-- | ||||
| - Please target the develop branch when submitting the pull request. | ||||
| --> | ||||
							
								
								
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/IMPROVEMENT.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/IMPROVEMENT.md
									
									
									
									
										vendored
									
									
								
							| @ -1,33 +0,0 @@ | ||||
| --- | ||||
| name: ⚙ Improvement | ||||
| about: You have some improvement to make setup-php better? | ||||
| labels: enhancement | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## A Pull Request should be associated with an Issue. | ||||
|  | ||||
| > We wish to have discussions in Issues. A single issue may be targeted by multiple PRs. | ||||
| > If you're offering a new feature or fixing anything, we'd like to know beforehand in Issues, | ||||
| > and potentially we'll be able to point development in a particular direction. | ||||
|  | ||||
| Related issue:  | ||||
|  | ||||
| > Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md) | ||||
| > Thank you! We are open to PRs, but please understand if for technical reasons we are unable to accept each and any PR | ||||
|  | ||||
| ### Description | ||||
|  | ||||
| This PR [briefly explain what it does] | ||||
|  | ||||
| > In case this PR introduced TypeScript/JavaScript code changes: | ||||
|  | ||||
| - [ ] I have written test cases for the changes in this pull request. | ||||
| - [ ] 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. | ||||
|  | ||||
| <!-- | ||||
| - Please target the develop branch when submitting the pull request. | ||||
| --> | ||||
							
								
								
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/NEW_FEATURE.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/PULL_REQUEST_TEMPLATE/NEW_FEATURE.md
									
									
									
									
										vendored
									
									
								
							| @ -1,33 +0,0 @@ | ||||
| --- | ||||
| name: 🎉 New Feature | ||||
| about: You have implemented some neat idea that you want to make part of setup-php? | ||||
| labels: enhancement | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## A Pull Request should be associated with an Issue. | ||||
|  | ||||
| > We wish to have discussions in Issues. A single issue may be targeted by multiple PRs. | ||||
| > If you're offering a new feature or fixing anything, we'd like to know beforehand in Issues, | ||||
| > and potentially we'll be able to point development in a particular direction. | ||||
|  | ||||
| Related issue:  | ||||
|  | ||||
| > Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md) | ||||
| > Thank you! We are open to PRs, but please understand if for technical reasons we are unable to accept each and any PR | ||||
|  | ||||
| ### Description | ||||
|  | ||||
| This PR [briefly explain what it does] | ||||
|  | ||||
| > In case this PR introduced TypeScript/JavaScript code changes: | ||||
|  | ||||
| - [ ] I have written test cases for the changes in this pull request. | ||||
| - [ ] 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. | ||||
|  | ||||
| <!-- | ||||
| - Please target the develop branch when submitting the pull request. | ||||
| --> | ||||
							
								
								
									
										30
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| # Security Policy | ||||
|  | ||||
| ## Supported Versions | ||||
|  | ||||
| The following versions of this project are supported for security updates. | ||||
|  | ||||
| | Version | Supported          | | ||||
| | ------- | ------------------ | | ||||
| | 1.11.x  | :white_check_mark: | | ||||
| | 2.14.x  | :white_check_mark: | | ||||
|  | ||||
| ## Supported PHP Versions | ||||
|  | ||||
| This security policy only applies to the latest patches of the following PHP versions. | ||||
|  | ||||
| | Version | Supported          | | ||||
| | ------- | ------------------ | | ||||
| | 7.3     | :white_check_mark: | | ||||
| | 7.4     | :white_check_mark: | | ||||
| | 8.0     | :white_check_mark: | | ||||
| | 8.1     | :white_check_mark: | | ||||
|  | ||||
| ## Reporting a Vulnerability | ||||
|  | ||||
| If you have found any issues that might have security implications in the versions supported, please send a report privately to [contact@shivammathur.com](mailto:contact@shivammathur.com). | ||||
| Do not report security reports publicly. | ||||
|  | ||||
| ## Tidelift | ||||
|  | ||||
| If you use this GitHub Action through a Tidelift subscription, please refer to [https://tidelift.com/security](https://tidelift.com/security). | ||||
							
								
								
									
										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 | ||||
							
								
								
									
										92
									
								
								.github/workflows/experimental-workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								.github/workflows/experimental-workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,92 +0,0 @@ | ||||
| name: Experimental workflow | ||||
| on: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - nightly | ||||
|       - master | ||||
|       - develop | ||||
|       - verbose | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
|   push: | ||||
|     branches: | ||||
|       - nightly | ||||
|       - master | ||||
|       - develop | ||||
|       - verbose | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
| jobs: | ||||
|   run: | ||||
|     name: Run | ||||
|     runs-on: ${{ matrix.operating-system }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         php-versions: ['8.0'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|  | ||||
|       - name: Setup Node.js 12.x | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm install | ||||
|  | ||||
|       - name: Prettier Format Check | ||||
|         run: npm run format-check | ||||
|  | ||||
|       - name: ESLint Check | ||||
|         run: npm run lint | ||||
|  | ||||
|       - name: Run tests | ||||
|         run: npm test | ||||
|  | ||||
|       - 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 }}-php${{ matrix.php-versions }} | ||||
|  | ||||
|       - name: Setup PHP with extensions and custom config | ||||
|         run: node dist/index.js | ||||
|         env: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: xml, opcache, xdebug, pcov #optional | ||||
|           ini-values: post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata #optional | ||||
|           coverage: pcov | ||||
|  | ||||
|       - name: Testing PHP version | ||||
|         run: | | ||||
|           php -v | ||||
|           php -r "if(strpos(phpversion(), '${{ matrix.php-versions }}') === false) {throw new Exception('Wrong PHP version Installed');}" | ||||
|  | ||||
|       - name: Testing Composer version | ||||
|         run: | | ||||
|           composer -V | ||||
|           php -r "if(strpos(@exec('composer -V'), 'Composer version') === false) {throw new Exception('Composer not found');}" | ||||
|       - name: Testing Extensions | ||||
|         run: | | ||||
|           php -m | ||||
|           php -r "if(! extension_loaded('mbstring')) {throw new Exception('mbstring not found');}" | ||||
|           php -r "if(! extension_loaded('pcov')) {throw new Exception('PCOV not found');}" | ||||
|       - name: Testing ini values | ||||
|         run: | | ||||
|           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');}" | ||||
|       - name: Test JIT | ||||
|         run: | | ||||
|           php -r "if(! extension_loaded('Zend OPcache')) {throw new Exception('Zend OPcache not found');}" | ||||
|           php -r "if(ini_get('opcache.jit_buffer_size')!='256M') {throw new Exception('opcache.jit_buffer_size not set');}" | ||||
|           php -r "if(ini_get('opcache.jit')!=1235) {throw new Exception('opcache.jit not set');}" | ||||
|           php -r "if(ini_get('pcre.jit')!=1) {throw new Exception('pcre.jit not set');}" | ||||
|       - name: Benchmark JIT | ||||
|         run: | | ||||
|           curl -o bench.php https://raw.githubusercontent.com/php/php-src/master/Zend/bench.php | ||||
|           php bench.php | ||||
| @ -1,18 +1,15 @@ | ||||
| name: Main workflow | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - master | ||||
|       - develop | ||||
|       - verbose | ||||
|       - releases/v1 | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - develop | ||||
|       - verbose | ||||
|       - releases/v1 | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
| @ -23,34 +20,12 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||
|         php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4'] | ||||
|         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 | ||||
|         uses: actions/checkout@v2 | ||||
| 
 | ||||
|       - name: Setup Node.js 12.x | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 12.x | ||||
| 
 | ||||
|       - name: Install dependencies | ||||
|         run: npm install | ||||
| 
 | ||||
|       - name: Prettier Format Check | ||||
|         run: npm run format-check | ||||
| 
 | ||||
|       - name: ESLint Check | ||||
|         run: npm run lint | ||||
| 
 | ||||
|       - name: Run tests | ||||
|         run: npm test | ||||
| 
 | ||||
|       - 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 }}-php${{ matrix.php-versions }} | ||||
| 
 | ||||
|       - name: Setup PHP with extensions and custom config | ||||
|         run: node dist/index.js | ||||
|         env: | ||||
| @ -75,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');}" | ||||
							
								
								
									
										54
									
								
								.github/workflows/node-workflow.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								.github/workflows/node-workflow.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| name: Node workflow | ||||
| on: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - releases/v1 | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
|   push: | ||||
|     branches: | ||||
|       - releases/v1 | ||||
|     paths-ignore: | ||||
|       - '**.md' | ||||
|       - 'examples/**' | ||||
| jobs: | ||||
|   run: | ||||
|     name: Run | ||||
|     runs-on: ${{ matrix.operating-system }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macos-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|  | ||||
|       - name: Setup Node.js 16.x | ||||
|         uses: actions/setup-node@v1 | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm install | ||||
|  | ||||
|       - name: Prettier Format Check | ||||
|         run: npm run format-check | ||||
|  | ||||
|       - name: ESLint Check | ||||
|         run: npm run lint | ||||
|  | ||||
|       - name: Run tests | ||||
|         run: npm test | ||||
|  | ||||
|       - name: Run npm audit | ||||
|         run: npm audit | ||||
|  | ||||
|       - name: Send Coverage | ||||
|         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 | ||||
| @ -1,11 +1,12 @@ | ||||
| { | ||||
|     "arrowParens": "avoid", | ||||
|     "bracketSpacing": false, | ||||
|     "endOfLine": "auto", | ||||
|     "parser": "typescript", | ||||
|     "printWidth": 80, | ||||
|     "tabWidth": 2, | ||||
|     "useTabs": false, | ||||
|     "semi": true, | ||||
|     "singleQuote": true, | ||||
|     "tabWidth": 2, | ||||
|     "trailingComma": "none", | ||||
|     "bracketSpacing": false, | ||||
|     "arrowParens": "avoid", | ||||
|     "parser": "typescript" | ||||
|     "useTabs": false | ||||
| } | ||||
							
								
								
									
										235
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										235
									
								
								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> | ||||
| @ -18,49 +18,50 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support | ||||
| ## Contents | ||||
|  | ||||
| - [PHP Support](#tada-php-support) | ||||
| - [OS/Platform Support](#cloud-osplatform-support) | ||||
| - [GitHub-Hosted Runner Support](#cloud-github-hosted-runner-support) | ||||
| - [PHP Extension Support](#heavy_plus_sign-php-extension-support) | ||||
| - [Tools Support](#wrench-tools-support) | ||||
| - [Coverage support](#signal_strength-coverage-support) | ||||
| - [Coverage Support](#signal_strength-coverage-support) | ||||
|   - [Xdebug](#xdebug) | ||||
|   - [PCOV](#pcov) | ||||
|   - [Disable coverage](#disable-coverage) | ||||
| - [Usage](#memo-usage) | ||||
|   - [Basic Setup](#basic-setup) | ||||
|   - [Matrix Setup](#matrix-setup) | ||||
|   - [Experimental Setup](#experimental-setup) | ||||
|   - [Thread Safe Setup](#thread-safe-setup)   | ||||
|   - [Cache dependencies](#cache-dependencies) | ||||
|   - [Cache Dependencies](#cache-dependencies) | ||||
|   - [Composer GitHub OAuth](#composer-github-oauth)   | ||||
|   - [Problem Matchers](#problem-matchers) | ||||
|   - [Examples](#examples) | ||||
| - [License](#scroll-license) | ||||
| - [Contributions](#1-contributions) | ||||
| - [Support this project](#sparkling_heart-support-this-project) | ||||
| - [This action uses the following works](#bookmark-this-action-uses-the-following-works) | ||||
| - [Support This project](#sparkling_heart-support-this-project) | ||||
| - [Dependencies](#bookmark-dependencies) | ||||
| - [Further Reading](#bookmark_tabs-further-reading) | ||||
|  | ||||
| ## :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|`Experimental`|`In development`| | ||||
| | 7.2         | `Stable`  | `End of life`         | | ||||
| | 7.3         | `Stable`  | `End of life`         | | ||||
| | 7.4         | `Stable`  | `Security fixes only` | | ||||
| | 8.0         | `Stable`  | `Active`              | | ||||
|  | ||||
| **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 [experimental setup](#experimental-setup) for more information. | ||||
| ## :cloud: GitHub-Hosted Runner Support | ||||
|  | ||||
| ## :cloud: OS/Platform Support | ||||
|  | ||||
| |Virtual environment|matrix.operating-system| | ||||
| |--- |--- | | ||||
| |Windows Server 2019|`windows-latest` or `windows-2019`| | ||||
| |Ubuntu 18.04|`ubuntu-latest` or `ubuntu-18.04`| | ||||
| |Ubuntu 16.04|`ubuntu-16.04`| | ||||
| |macOS X Catalina 10.15|`macos-latest` or `macOS-10.15`| | ||||
| | 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. | ||||
| @ -84,27 +85,35 @@ with: | ||||
| ``` | ||||
|  | ||||
| To set up a particular version of a tool, specify it in the form `tool:version`.  | ||||
| Version should be in semver format and a valid release of the tool. | ||||
|  | ||||
| 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 | ||||
| with: | ||||
|   php-version: '7.4' | ||||
|   tools: php-cs-fixer:2.15.5, phpunit:8.5.1 | ||||
|   tools: composer:v2 | ||||
| ``` | ||||
|  | ||||
| **Note** | ||||
| - `composer` is setup by default. | ||||
| - Specifying version for `composer` and `pecl` has no effect, latest version of both tools will be setup. | ||||
| - If the version specified for the tool is not in semver format, latest version of the tool will be setup. | ||||
| - Tools which cannot be installed gracefully leave an error message in the logs, the action is not interrupted. | ||||
| 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`. | ||||
|  | ||||
| ## :signal_strength: Coverage support | ||||
| Version for other tools should be in `semver` format and a valid release of the tool. | ||||
|  | ||||
| ```yaml | ||||
| uses: shivammathur/setup-php@v1 | ||||
| with: | ||||
|   php-version: '7.4' | ||||
|   tools: php-cs-fixer:2.16.2, phpunit:8.5.1 | ||||
| ``` | ||||
|  | ||||
| Tools which cannot be installed gracefully leave an error message in the logs, the action is not interrupted. | ||||
|  | ||||
| ## :signal_strength: Coverage Support | ||||
|  | ||||
| ### Xdebug | ||||
|  | ||||
| Specify `coverage: xdebug` to use `Xdebug`.   | ||||
| Runs on all [PHP versions supported](#tada-php-support "List of PHP versions supported on this GitHub Action") except `8.0`. | ||||
| Runs on all [PHP versions supported](#tada-php-support "List of PHP versions supported on this GitHub Action"). | ||||
|  | ||||
| ```yaml | ||||
| uses: shivammathur/setup-php@v1 | ||||
| @ -129,7 +138,7 @@ with: | ||||
|   coverage: pcov | ||||
| ``` | ||||
|  | ||||
| ### Disable coverage | ||||
| ### Disable Coverage | ||||
|  | ||||
| Specify `coverage: none` to disable both `Xdebug` and `PCOV`.   | ||||
| Consider disabling the coverage using this PHP action for these reasons. | ||||
| @ -203,31 +212,6 @@ jobs: | ||||
|         tools: php-cs-fixer, phpunit #optional, setup tools globally | ||||
| ``` | ||||
|  | ||||
| ### Experimental 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. | ||||
|  | ||||
| - This version is currently in development and is an experimental feature on this action. | ||||
| - `PECL` is installed by default with this version on `ubuntu`. | ||||
| - 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. | ||||
| @ -248,10 +232,10 @@ jobs: | ||||
|       with: | ||||
|         php-version: '7.4' | ||||
|       env: | ||||
|         PHPTS: ts # specify ts or nts | ||||
|         phpts: ts # specify ts or nts | ||||
| ``` | ||||
|  | ||||
| ### Cache dependencies | ||||
| ### Cache Dependencies | ||||
|  | ||||
| You can persist composer's internal cache directory using the [`action/cache`](https://github.com/actions/cache "GitHub Action to cache files") GitHub Action. Dependencies cached are loaded directly instead of downloading them while installation. The files cached are available across check-runs and will reduce the workflow execution time. | ||||
|  | ||||
| @ -263,7 +247,7 @@ You can persist composer's internal cache directory using the [`action/cache`](h | ||||
|   run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|  | ||||
| - name: Cache dependencies | ||||
|   uses: actions/cache@v1 | ||||
|   uses: actions/cache@v2 | ||||
|   with: | ||||
|     path: ${{ steps.composer-cache.outputs.dir }} | ||||
|     key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
| @ -273,39 +257,98 @@ 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') }} | ||||
| ``` | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| If you have a number of workflows which setup multiple tools or have many composer dependencies, you might hit the GitHub's rate limit for composer. To avoid that you can add a `OAuth` token to the composer's config by setting `COMPOSER_TOKEN` environment variable. You can use [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token "GITHUB_TOKEN documentation") secret for this purpose. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP | ||||
|   uses: shivammathur/setup-php@v2 | ||||
|   with: | ||||
|     php-version: '7.4' | ||||
|   env: | ||||
|     COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| ### Problem Matchers | ||||
|  | ||||
| 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. | ||||
|  | ||||
| #### PHP | ||||
|  | ||||
| Setup problem matchers for your `PHP` output by adding this step after the `setup-php` step. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup problem matchers for PHP | ||||
|   run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" | ||||
| ``` | ||||
|  | ||||
| #### PHPUnit | ||||
|  | ||||
| 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. | ||||
| Setup problem matchers for your `PHPUnit` output by adding this step after the `setup-php` step. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup Problem Matchers for PHPUnit | ||||
| - name: Setup problem matchers for PHPUnit | ||||
|   run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" | ||||
| ``` | ||||
|  | ||||
| #### Other tools | ||||
| #### PHPStan | ||||
|  | ||||
| PHPStan supports error reporting in GitHub Actions, so no problem matchers are required. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP | ||||
|   uses: shivammathur/setup-php@v2 | ||||
|   with: | ||||
|     php-version: '7.4' | ||||
|     tools: phpstan | ||||
|  | ||||
| - 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 `phpstan`. | ||||
| > Here is an example with `phpcs`. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP | ||||
|   uses: shivammathur/setup-php@v1 | ||||
|   uses: shivammathur/setup-php@v2 | ||||
|   with: | ||||
|     php-version: '7.4' | ||||
|     tools: cs2pr, phpstan | ||||
|     tools: cs2pr, phpcs | ||||
|  | ||||
| - name: PHPStan | ||||
|   run: phpstan analyse src --error-format=checkstyle | cs2pr | ||||
| - name: Run phpcs | ||||
|   run: phpcs -q --report=checkstyle src | cs2pr | ||||
| ``` | ||||
|  | ||||
| ### Examples | ||||
| @ -313,7 +356,7 @@ For examples refer to [cs2pr documentation](https://github.com/staabm/annotate-p | ||||
| 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")                            | | ||||
| @ -338,27 +381,59 @@ Examples for setting up this GitHub Action with different PHP Frameworks/Package | ||||
|  | ||||
| ## :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-this-action-uses-the-following-works "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. | ||||
| ## :sparkling_heart: Support This Project | ||||
|  | ||||
| - Please star the project and share it with the community. | ||||
| - If you blog, write about your experience while using this action. | ||||
| - I maintain this in my free time, please support me with a [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon") subscription or a one time contribution using [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal"). | ||||
| - If you need any help using this, please contact me using [Codementor](https://www.codementor.io/shivammathur "Shivam Mathur Codementor") | ||||
| - 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. | ||||
|  | ||||
| ## :bookmark: This action uses the following works | ||||
| Many users and organisations support setup-php via [GitHub Sponsors](https://github.com/sponsors/shivammathur). | ||||
|  | ||||
| - [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Pre-compiled ubuntu packages") | ||||
| - [shivammathur/php-builder](https://github.com/shivammathur/php-builder "Pre-compiled nightly PHP builds") | ||||
| <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") | ||||
| - [shivammathur/homebrew-extensions](https://github.com/shivammathur/homebrew-extensions "Tap for PHP extensions for MacOS") | ||||
| - [shivammathur/php-builder](https://github.com/shivammathur/php-builder "Nightly PHP package") | ||||
|  | ||||
| ## :bookmark_tabs: Further Reading | ||||
|  | ||||
|  | ||||
| @ -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,28 +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 windows', async () => { | ||||
|     const win32: string = await coverage.addCoverage('xdebug', '8.0', 'win32'); | ||||
|     expect(win32).toContain('Xdebug currently only supports PHP 7.4 or lower'); | ||||
|   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 Xdebug on linux', async () => { | ||||
|     const linux: string = await coverage.addCoverage('xdebug', '7.4', 'linux'); | ||||
|     expect(linux).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('Xdebug currently only supports PHP 7.4 or lower'); | ||||
|     expect(linux).toContain('add_extension xdebug'); | ||||
|   }); | ||||
|  | ||||
|   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 () => { | ||||
| @ -57,16 +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 Xdebug on darwin', async () => { | ||||
|   it('checking addCoverage with Xdebug3 on darwin', async () => { | ||||
|     const darwin: string = await coverage.addCoverage( | ||||
|       'xdebug', | ||||
|       '8.0', | ||||
|       'xdebug3', | ||||
|       '7.4', | ||||
|       'darwin' | ||||
|     ); | ||||
|     expect(darwin).toContain('Xdebug currently only supports PHP 7.4 or lower'); | ||||
|     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 () => { | ||||
|  | ||||
| @ -3,15 +3,32 @@ import * as extensions from '../src/extensions'; | ||||
| describe('Extension tests', () => { | ||||
|   it('checking addExtensionOnWindows', async () => { | ||||
|     let win32: string = await extensions.addExtension( | ||||
|       'xdebug, pcov, phalcon4, ast-beta', | ||||
|       'Xdebug, pcov, sqlite, phalcon4, ast-beta', | ||||
|       '7.4', | ||||
|       'win32' | ||||
|     ); | ||||
|     expect(win32).toContain('Add-Extension xdebug'); | ||||
|     expect(win32).toContain('Add-Extension pcov'); | ||||
|     expect(win32).toContain('Add-Extension sqlite3'); | ||||
|     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'); | ||||
|  | ||||
|     win32 = await extensions.addExtension('mysql', '8.0', 'win32'); | ||||
|     expect(win32).toContain('Add-Extension mysqli'); | ||||
|     expect(win32).toContain('Add-Extension mysqlnd'); | ||||
|  | ||||
|     win32 = await extensions.addExtension('mysql', '5.6', 'win32'); | ||||
|     expect(win32).toContain('Add-Extension mysql'); | ||||
|     expect(win32).toContain('Add-Extension mysqli'); | ||||
|     expect(win32).toContain('Add-Extension mysqlnd'); | ||||
|  | ||||
|     win32 = await extensions.addExtension( | ||||
|       'phalcon3, does_not_exist', | ||||
|       '7.2', | ||||
| @ -21,19 +38,19 @@ 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 () => { | ||||
|     let linux: string = await extensions.addExtension( | ||||
|       'xdebug, pcov, ast-beta, xdebug-alpha', | ||||
|       'Xdebug, pcov, sqlite, ast-beta, xdebug-alpha', | ||||
|       '7.4', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(linux).toContain('update_extension xdebug 2.9.0'); | ||||
|     expect(linux).toContain('sudo $debconf_fix apt-get install -y php7.4-pcov'); | ||||
|     expect(linux).toContain( | ||||
|       'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y php7.4-pcov' | ||||
|       'sudo $debconf_fix apt-get install -y php7.4-sqlite3' | ||||
|     ); | ||||
|     expect(linux).toContain('add_unstable_extension ast beta extension'); | ||||
|     expect(linux).toContain( | ||||
| @ -41,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'); | ||||
| @ -64,48 +73,41 @@ describe('Extension tests', () => { | ||||
|  | ||||
|   it('checking addExtensionOnDarwin', async () => { | ||||
|     let darwin: string = await extensions.addExtension( | ||||
|       'xdebug, pcov, 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('sudo pecl install -f xdebug'); | ||||
|     expect(darwin).toContain('sudo pecl install -f pcov'); | ||||
|     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('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('sudo pecl install -f pcov'); | ||||
|     expect(darwin).toContain('add_brew_extension pcov'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '5.6', 'darwin'); | ||||
|     expect(darwin).toContain('sudo pecl install -f xdebug-2.5.5'); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '7.0', 'darwin'); | ||||
|     expect(darwin).toContain('sudo pecl install -f xdebug-2.9.0'); | ||||
|     expect(darwin).toContain('add_brew_extension xdebug'); | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '7.2', 'darwin'); | ||||
|     expect(darwin).toContain('sudo pecl install -f 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', | ||||
| @ -115,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,7 +4,9 @@ import * as install from '../src/install'; | ||||
|  * Mock install.ts | ||||
|  */ | ||||
| jest.mock('../src/install', () => ({ | ||||
|   build: jest.fn().mockImplementation( | ||||
|   build: jest | ||||
|     .fn() | ||||
|     .mockImplementation( | ||||
|       async ( | ||||
|         filename: string, | ||||
|         version: string, | ||||
| @ -26,18 +28,17 @@ jest.mock('../src/install', () => ({ | ||||
|         if (extension_csv) { | ||||
|           script += 'install extensions'; | ||||
|         } | ||||
|       if (ini_values_csv) { | ||||
|         script += 'edit php.ini'; | ||||
|       } | ||||
|         if (coverage_driver) { | ||||
|           script += 'set coverage driver'; | ||||
|         } | ||||
|         if (ini_values_csv) { | ||||
|           script += 'edit php.ini'; | ||||
|         } | ||||
|  | ||||
|         return script; | ||||
|       } | ||||
|     ), | ||||
|   run: jest.fn().mockImplementation( | ||||
|     async (): Promise<string> => { | ||||
|   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'; | ||||
| @ -46,7 +47,7 @@ jest.mock('../src/install', () => ({ | ||||
|       case 'darwin': | ||||
|       case 'linux': | ||||
|         script = await install.build(os_version + '.sh', version, os_version); | ||||
|           script += 'sh script.sh ' + version + ' ' + __dirname; | ||||
|         script += 'bash script.sh ' + version + ' ' + __dirname; | ||||
|         break; | ||||
|       case 'win32': | ||||
|         script = await install.build(os_version + '.sh', version, os_version); | ||||
| @ -57,8 +58,7 @@ jest.mock('../src/install', () => ({ | ||||
|     } | ||||
|  | ||||
|     return script; | ||||
|     } | ||||
|   ) | ||||
|   }) | ||||
| })); | ||||
|  | ||||
| /** | ||||
| @ -69,6 +69,8 @@ jest.mock('../src/install', () => ({ | ||||
|  * @param extension_csv | ||||
|  * @param ini_values_csv | ||||
|  * @param coverage_driver | ||||
|  * @param tools | ||||
|  * @param pecl | ||||
|  */ | ||||
| function setEnv( | ||||
|   version: string | number, | ||||
| @ -91,20 +93,20 @@ function setEnv( | ||||
| describe('Install', () => { | ||||
|   it('Test install on windows', async () => { | ||||
|     setEnv('7.0', 'win32', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     let script: string = await install.run(); | ||||
|  | ||||
|     let script: string = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('pwsh script.ps1 7.0 ' + __dirname); | ||||
|  | ||||
|     setEnv('7.3', 'win32', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('pwsh script.ps1 7.3 ' + __dirname); | ||||
|  | ||||
|     setEnv('7.3', 'win32', 'a, b', 'a=b', 'x', '', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('install extensions'); | ||||
|     expect(script).toContain('edit php.ini'); | ||||
| @ -114,66 +116,66 @@ describe('Install', () => { | ||||
|  | ||||
|   it('Test install on linux', async () => { | ||||
|     setEnv('7.3', 'linux', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     let script: string = await install.run(); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('sh script.sh 7.3 '); | ||||
|  | ||||
|     setEnv('7.3', 'linux', 'a, b', 'a=b', 'x', 'phpunit', 'true'); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|     let script: string = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('bash script.sh 7.3 '); | ||||
|  | ||||
|     setEnv('7.4', 'linux', 'a, b', 'a=b', 'x', 'phpunit', 'true'); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('install extensions'); | ||||
|     expect(script).toContain('edit php.ini'); | ||||
|     expect(script).toContain('set coverage driver'); | ||||
|     expect(script).toContain('sh script.sh 7.3'); | ||||
|     expect(script).toContain('bash script.sh 7.4'); | ||||
|     expect(script).toContain('add_tool'); | ||||
|  | ||||
|     setEnv('7.3', 'linux', 'a, b', 'a=b', 'x', 'phpunit', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('install extensions'); | ||||
|     expect(script).toContain('edit php.ini'); | ||||
|     expect(script).toContain('set coverage driver'); | ||||
|     expect(script).toContain('sh script.sh 7.3'); | ||||
|     expect(script).toContain('bash script.sh 7.3'); | ||||
|     expect(script).toContain('add_tool'); | ||||
|   }); | ||||
|  | ||||
|   it('Test install on darwin', async () => { | ||||
|     setEnv('7.3', 'darwin', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     let script: string = await install.run(); | ||||
|  | ||||
|     let script: string = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('sh script.sh 7.3 ' + __dirname); | ||||
|     expect(script).toContain('bash script.sh 7.3 ' + __dirname); | ||||
|  | ||||
|     setEnv('7.3', 'darwin', 'a, b', 'a=b', 'x', '', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('install extensions'); | ||||
|     expect(script).toContain('edit php.ini'); | ||||
|     expect(script).toContain('set coverage driver'); | ||||
|     expect(script).toContain('sh script.sh 7.3 ' + __dirname); | ||||
|     expect(script).toContain('bash script.sh 7.3 ' + __dirname); | ||||
|   }); | ||||
|  | ||||
|   it('Test malformed version inputs', async () => { | ||||
|     setEnv('7.4.1', 'darwin', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     let script: string = await install.run(); | ||||
|  | ||||
|     let script: string = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('sh script.sh 7.4 ' + __dirname); | ||||
|     expect(script).toContain('bash script.sh 7.4 ' + __dirname); | ||||
|  | ||||
|     setEnv(8.0, 'darwin', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('sh script.sh 8.0 ' + __dirname); | ||||
|     expect(script).toContain('bash script.sh 8.0 ' + __dirname); | ||||
|  | ||||
|     setEnv(8, 'darwin', '', '', '', '', ''); | ||||
|     // @ts-ignore | ||||
|     script = await install.run(); | ||||
|  | ||||
|     script = '' + (await install.run()); | ||||
|     expect(script).toContain('initial script'); | ||||
|     expect(script).toContain('sh script.sh 8.0 ' + __dirname); | ||||
|     expect(script).toContain('bash script.sh 8.0 ' + __dirname); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -1,34 +0,0 @@ | ||||
| import * as io from '@actions/io'; | ||||
| import * as path from 'path'; | ||||
| import * as fs from 'fs'; | ||||
| import * as matchers from '../src/matchers'; | ||||
|  | ||||
| async function cleanup(path: string): Promise<void> { | ||||
|   fs.unlink(path, error => { | ||||
|     if (error) { | ||||
|       console.log(error); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| 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); | ||||
|   }); | ||||
| }); | ||||
| @ -2,29 +2,35 @@ import * as tools from '../src/tools'; | ||||
|  | ||||
| describe('Tools tests', () => { | ||||
|   it('checking getCommand', async () => { | ||||
|     expect(await tools.getArchiveCommand('linux')).toBe('add_tool '); | ||||
|     expect(await tools.getArchiveCommand('darwin')).toBe('add_tool '); | ||||
|     expect(await tools.getArchiveCommand('win32')).toBe('Add-Tool '); | ||||
|     expect(await tools.getArchiveCommand('fedora')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     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('openbsd', 'tool')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getCommand', async () => { | ||||
|     expect(await tools.getPackageCommand('linux')).toBe('add_composer_tool '); | ||||
|     expect(await tools.getPackageCommand('darwin')).toBe('add_composer_tool '); | ||||
|     expect(await tools.getPackageCommand('win32')).toBe('Add-Composer-Tool '); | ||||
|     expect(await tools.getPackageCommand('fedora')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|     expect(await tools.getCommand('linux', 'composertool')).toBe( | ||||
|       'add_composertool ' | ||||
|     ); | ||||
|     expect(await tools.getCommand('darwin', 'composertool')).toBe( | ||||
|       'add_composertool ' | ||||
|     ); | ||||
|     expect(await tools.getCommand('win32', 'composertool')).toBe( | ||||
|       'Add-Composertool ' | ||||
|     ); | ||||
|     expect(await tools.getCommand('openbsd', 'composertool')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getPECLCommand', async () => { | ||||
|     expect(await tools.getPECLCommand('linux')).toBe('add_pecl '); | ||||
|     expect(await tools.getPECLCommand('darwin')).toBe('add_pecl '); | ||||
|     expect(await tools.getPECLCommand('win32')).toBe('Add-PECL '); | ||||
|     expect(await tools.getPECLCommand('fedora')).toContain( | ||||
|       'Platform fedora is not supported' | ||||
|   it('checking getCommand', async () => { | ||||
|     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('openbsd', 'pecl')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -106,78 +112,34 @@ describe('Tools tests', () => { | ||||
|     ).toBe('releases/download/v1.2.3/tool.phar'); | ||||
|   }); | ||||
|  | ||||
|   it('checking getCodeceptionUriBuilder', async () => { | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '5.6', 'php56')).toBe( | ||||
|       'releases/3.2.1/php56/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '7.0', 'php54')).toBe( | ||||
|       'releases/3.2.1/php54/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '7.1', 'php56')).toBe( | ||||
|       'releases/3.2.1/php56/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '7.2', 'php56')).toBe( | ||||
|       'releases/3.2.1/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '7.3', 'php56')).toBe( | ||||
|       'releases/3.2.1/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUriBuilder('3.2.1', '7.4', 'php56')).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('3.2.1', '5.6')).toBe( | ||||
|       'releases/3.2.1/php54/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUri('4.3.2', '5.6')).toBe( | ||||
|       'releases/4.3.2/php56/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUri('3.2.1', '7.4')).toBe( | ||||
|       'releases/3.2.1/codecept.phar' | ||||
|     ); | ||||
|     expect(await tools.getCodeceptionUri('4.3.2', '7.4')).toBe( | ||||
|       'releases/4.3.2/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' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getPhpunitUri', async () => { | ||||
|     expect(await tools.getPhpunitUrl('tool', 'latest')).toBe( | ||||
|       'https://phar.phpunit.de/tool.phar' | ||||
|     expect(await tools.getPharUrl('domain', 'tool', '', 'latest')).toBe( | ||||
|       'domain/tool.phar' | ||||
|     ); | ||||
|     expect(await tools.getPhpunitUrl('tool', '1.2.3')).toBe( | ||||
|       'https://phar.phpunit.de/tool-1.2.3.phar' | ||||
|     expect(await tools.getPharUrl('domain', 'tool', 'v', '1.2.3')).toBe( | ||||
|       'domain/tool-v1.2.3.phar' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @ -190,7 +152,7 @@ describe('Tools tests', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getDeployerUri', async () => { | ||||
|   it('checking addComposer', async () => { | ||||
|     expect(await tools.addComposer(['a', 'b'])).toStrictEqual([ | ||||
|       'composer', | ||||
|       'a', | ||||
| @ -201,9 +163,74 @@ 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']); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'composer:preview']) | ||||
|     ).toStrictEqual(['composer:preview', 'a', 'b']); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'c', 'composer:1']) | ||||
|     ).toStrictEqual(['composer:1', 'a', 'b', 'c']); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'c', 'composer:2']) | ||||
|     ).toStrictEqual(['composer:2', 'a', 'b', 'c']); | ||||
|     expect( | ||||
|       await tools.addComposer(['a', 'b', 'c', 'composer:v1']) | ||||
|     ).toStrictEqual(['composer:1', 'a', 'b', 'c']); | ||||
|     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 getComposerUrl', async () => { | ||||
|     expect(await tools.getComposerUrl('latest', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-stable.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('stable', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer-stable.phar' | ||||
|     ); | ||||
|     expect(await tools.getComposerUrl('snapshot', '7.4')).toContain( | ||||
|       'https://getcomposer.org/composer.phar' | ||||
|     ); | ||||
|     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' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking getSymfonyUri', async () => { | ||||
| @ -225,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' | ||||
|     ); | ||||
| @ -268,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 () => { | ||||
| @ -300,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 () => { | ||||
| @ -311,16 +328,16 @@ describe('Tools tests', () => { | ||||
|       'user/', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain('add_composer_tool tool tool:1.2.3 user/'); | ||||
|     expect(script).toContain('add_composertool tool tool:1.2.3 user/'); | ||||
|  | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'darwin'); | ||||
|     expect(script).toContain('add_composer_tool tool tool:1.2.3 user/'); | ||||
|     expect(script).toContain('add_composertool tool tool:1.2.3 user/'); | ||||
|  | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'win32'); | ||||
|     expect(script).toContain('Add-Composer-Tool tool tool:1.2.3 user/'); | ||||
|     expect(script).toContain('Add-Composertool tool tool:1.2.3 user/'); | ||||
|  | ||||
|     script = await tools.addPackage('tool', 'tool:1.2.3', 'user/', 'fedora'); | ||||
|     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 () => { | ||||
| @ -330,7 +347,7 @@ describe('Tools tests', () => { | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'add_tool https://github.com/composer/composer/releases/latest/download/composer.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' | ||||
| @ -351,20 +368,20 @@ describe('Tools tests', () => { | ||||
|       'add_tool https://github.com/symfony/cli/releases/latest/download/symfony_linux_amd64 symfony' | ||||
|     ); | ||||
|     expect(script).toContain('add_pecl'); | ||||
|     expect(script).toContain('add_composer_tool phinx phinx robmorgan/'); | ||||
|     expect(script).toContain('add_composer_tool phinx phinx:1.2.3 robmorgan/'); | ||||
|     expect(script).toContain('add_composertool phinx phinx robmorgan/'); | ||||
|     expect(script).toContain('add_composertool phinx phinx:1.2.3 robmorgan/'); | ||||
|     expect(script).toContain('add_devtools'); | ||||
|     expect(script).toContain('add_log "$tick" "php-config" "Added"'); | ||||
|     expect(script).toContain('add_log "$tick" "phpize" "Added"'); | ||||
|   }); | ||||
|   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://github.com/composer/composer/releases/latest/download/composer.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' | ||||
| @ -384,16 +401,10 @@ describe('Tools tests', () => { | ||||
|     expect(script).toContain( | ||||
|       'https://github.com/vimeo/psalm/releases/latest/download/psalm.phar psalm' | ||||
|     ); | ||||
|     expect(script).toContain('add_composer_tool phinx phinx robmorgan/'); | ||||
|     expect(script).toContain('add_composertool phinx phinx robmorgan/'); | ||||
|     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_composer_tool 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' | ||||
|     ); | ||||
| @ -402,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://github.com/composer/composer/releases/latest/download/composer.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' | ||||
| @ -415,13 +426,10 @@ describe('Tools tests', () => { | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://deployer.org/deployer.phar deployer' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Composer-Tool prestissimo prestissimo hirak/' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://github.com/phpmd/phpmd/releases/latest/download/phpmd.phar phpmd' | ||||
|     ); | ||||
|     expect(script).toContain('Add-Composer-Tool phinx phinx robmorgan/'); | ||||
|     expect(script).toContain('Add-Composertool phinx phinx robmorgan/'); | ||||
|     expect(script).toContain( | ||||
|       'Add-Tool https://github.com/phar-io/phive/releases/download/0.13.2/phive-0.13.2.phar phive' | ||||
|     ); | ||||
| @ -430,24 +438,44 @@ 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://github.com/composer/composer/releases/latest/download/composer.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/'); | ||||
|     expect(script).toContain( | ||||
|       'Add-Composertool composer-prefetcher composer-prefetcher narrowspark/automatic-' | ||||
|     ); | ||||
|   }); | ||||
|   it('checking composer setup', async () => { | ||||
|     let script: string = await tools.addTools( | ||||
|       'composer, composer:v1', | ||||
|       '7.4', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(script).toContain( | ||||
|       'Add-Composer-Tool prestissimo prestissimo hirak/' | ||||
|       '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-Composer-Tool phinx phinx robmorgan/'); | ||||
|  | ||||
|     script = await tools.addTools('composer:preview', '7.4', 'linux'); | ||||
|     expect(script).toContain( | ||||
|       'Add-Composer-Tool composer-prefetcher composer-prefetcher narrowspark/automatic-' | ||||
|       '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( | ||||
|       '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,21 +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> { | ||||
|     await utils.asyncForEach( | ||||
|       array, | ||||
|       async function (str: string): Promise<void> { | ||||
|         concat += str; | ||||
|     }); | ||||
|       } | ||||
|     ); | ||||
|     expect(concat).toBe('abc'); | ||||
|   }); | ||||
|  | ||||
| @ -55,12 +86,12 @@ describe('Utils tests', () => { | ||||
|       path.join(__dirname, '../src/scripts/win32.ps1'), | ||||
|       'utf8' | ||||
|     ); | ||||
|     expect(await utils.readScript('darwin.sh', '7.4', 'darwin')).toBe(darwin); | ||||
|     expect(await utils.readScript('darwin.sh', '7.3', 'darwin')).toBe(darwin); | ||||
|     expect(await utils.readScript('linux.sh', '7.4', 'linux')).toBe(linux); | ||||
|     expect(await utils.readScript('linux.sh', '7.3', 'linux')).toBe(linux); | ||||
|     expect(await utils.readScript('win32.ps1', '7.4', 'win32')).toBe(win32); | ||||
|     expect(await utils.readScript('win32.ps1', '7.3', 'win32')).toBe(win32); | ||||
|     expect(await utils.readScript('darwin.sh')).toBe(darwin); | ||||
|     expect(await utils.readScript('darwin.sh')).toBe(darwin); | ||||
|     expect(await utils.readScript('linux.sh')).toBe(linux); | ||||
|     expect(await utils.readScript('linux.sh')).toBe(linux); | ||||
|     expect(await utils.readScript('win32.ps1')).toBe(win32); | ||||
|     expect(await utils.readScript('win32.ps1')).toBe(win32); | ||||
|   }); | ||||
|  | ||||
|   it('checking writeScripts', async () => { | ||||
| @ -68,7 +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); | ||||
| @ -92,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([]); | ||||
|   }); | ||||
| @ -126,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', | ||||
| @ -140,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 () => { | ||||
| @ -154,11 +207,11 @@ describe('Utils tests', () => { | ||||
|   }); | ||||
|  | ||||
|   it('checking suppressOutput', async () => { | ||||
|     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('win32')).toEqual(' '); | ||||
|     expect(await utils.suppressOutput('linux')).toEqual(' '); | ||||
|     expect(await utils.suppressOutput('darwin')).toEqual(' '); | ||||
|     expect(await utils.suppressOutput('openbsd')).toContain( | ||||
|       'Platform openbsd is not supported' | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										10
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								action.yml
									
									
									
									
									
								
							| @ -1,8 +1,9 @@ | ||||
| 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' | ||||
| inputs: | ||||
|   php-version: | ||||
|     description: 'Setup PHP version.' | ||||
| @ -20,18 +21,17 @@ inputs: | ||||
|   tools: | ||||
|     description: 'Setup popular tools globally.' | ||||
|     required: false | ||||
|   # Deprecated options, do not use. Will not be supported in v2 which will be released around February 1, 2020. | ||||
|   extension-csv: | ||||
|     description: 'Deprecated! Use extensions instead.' | ||||
|     deprecationMessage: 'The extension-csv property will not be supported in v2. Use extensions instead.' | ||||
|     deprecationMessage: 'The extension-csv property is deprecated. Use extensions instead.' | ||||
|     required: false | ||||
|   ini-values-csv: | ||||
|     description: 'Deprecated! Use ini-values instead.' | ||||
|     deprecationMessage: 'The ini-values-csv property will not be supported in v2. Use ini-values instead.' | ||||
|     deprecationMessage: 'The ini-values-csv property is deprecated. Use ini-values instead.' | ||||
|     required: false | ||||
|   pecl: | ||||
|     description: 'Deprecated! Use tools instead to setup PECL.' | ||||
|     deprecationMessage: 'The pecl property will not be supported in v2. Specify pecl in tools instead.' | ||||
|     deprecationMessage: 'The pecl property is deprecated. Specify pecl in tools instead.' | ||||
|     required: false | ||||
| runs: | ||||
|   using: 'node12' | ||||
|  | ||||
							
								
								
									
										5272
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5272
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -19,7 +19,7 @@ jobs: | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - uses: actions/cache@v1 | ||||
|       - uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -27,6 +27,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install -n --prefer-dist | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: PHP test | ||||
|         run: composer test | ||||
| @ -34,11 +34,13 @@ jobs: | ||||
|           # Install memcached if using ext-memcached | ||||
|           extensions: mbstring, intl, redis, pdo_mysql | ||||
|           coverage: pcov | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -47,7 +49,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer run-script post-install-cmd --no-interaction | ||||
|       # Add a step to run migrations if required | ||||
|       - name: Test with phpunit | ||||
| @ -71,7 +73,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -79,7 +81,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: PHP CodeSniffer | ||||
|         run: composer cs-check | ||||
|  | ||||
| @ -99,7 +101,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -107,6 +109,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Static Analysis using PHPStan | ||||
|         run: phpstan analyse --no-progress src/ | ||||
| @ -38,7 +38,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -47,7 +47,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer run-script post-install-cmd --no-interaction | ||||
|       # Add a step to run migrations if required | ||||
|       - name: Test with phpunit | ||||
| @ -71,7 +71,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -79,7 +79,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: PHP CodeSniffer | ||||
|         run: composer cs-check | ||||
|  | ||||
| @ -99,7 +99,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -107,6 +107,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Static Analysis using PHPStan | ||||
|         run: phpstan analyse --no-progress src/ | ||||
| @ -22,7 +22,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -31,7 +31,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer run-script post-install-cmd --no-interaction | ||||
|       - name: Test with phpunit | ||||
|         run: vendor/bin/phpunit --coverage-text | ||||
| @ -51,7 +51,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -59,7 +59,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: PHP CodeSniffer | ||||
|         run: composer cs-check | ||||
|  | ||||
| @ -79,7 +79,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -87,6 +87,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Static Analysis using PHPStan | ||||
|         run: phpstan analyse --no-progress src/ | ||||
|  | ||||
| @ -21,7 +21,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -29,6 +29,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Test with phpunit | ||||
|         run: vendor/bin/phpunit --coverage-text | ||||
| @ -41,11 +41,13 @@ jobs: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, dom, fileinfo, mysql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -53,7 +55,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: | | ||||
|           php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|  | ||||
| @ -47,7 +47,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -55,7 +55,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: | | ||||
|           php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|  | ||||
| @ -23,7 +23,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -31,7 +31,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: | | ||||
|           php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|  | ||||
| @ -41,11 +41,13 @@ jobs: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, dom, fileinfo, mysql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -54,7 +56,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer require predis/predis illuminate/redis | ||||
|       - name: Prepare the application | ||||
|         run: php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|  | ||||
| @ -47,7 +47,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -56,7 +56,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer require predis/predis illuminate/redis | ||||
|       - name: Prepare the application | ||||
|         run: php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|  | ||||
| @ -23,7 +23,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -31,7 +31,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|       - name: Test with phpunit | ||||
|  | ||||
| @ -41,11 +41,13 @@ jobs: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, dom, zip, phalcon4, mysql #use phalcon3 for the phalcon 3.x. | ||||
|           coverage: xdebug #optional | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -53,7 +55,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|       - name: Run Migration | ||||
|  | ||||
| @ -46,7 +46,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -54,7 +54,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: php -r "file_exists('.env') || copy('.env.example', '.env');" | ||||
|       - name: Run Migration | ||||
|  | ||||
| @ -27,7 +27,7 @@ jobs: | ||||
|       - name: Get yarn cache | ||||
|         id: yarn-cache | ||||
|         run: echo "::set-output name=dir::$(yarn cache dir)" | ||||
|       - uses: actions/cache@v1 | ||||
|       - uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.yarn-cache.outputs.dir }} | ||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} | ||||
| @ -36,7 +36,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -46,7 +46,7 @@ jobs: | ||||
|       - name: Install yarn dependencies | ||||
|         run: yarn -V | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install -o --prefer-dist --no-interaction | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Yarn test and build | ||||
|         run: | | ||||
|           yarn run test | ||||
|  | ||||
| @ -21,7 +21,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -29,6 +29,6 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Test with phpunit | ||||
|         run: vendor/bin/phpunit --coverage-text | ||||
| @ -23,16 +23,18 @@ 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 | ||||
|           coverage: xdebug #optional | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -41,10 +43,11 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           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,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, pgsql | ||||
| @ -32,7 +32,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -41,10 +41,11 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           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,7 +14,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 | ||||
| @ -23,7 +23,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -32,7 +32,8 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: | | ||||
|           composer require symfony/orm-pack | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           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 | ||||
| @ -38,11 +38,13 @@ jobs: | ||||
|           php-version: ${{ matrix.php-versions }} | ||||
|           extensions: mbstring, intl, gd, imagick, zip, dom, mysql | ||||
|           coverage: xdebug #optional | ||||
|       - name: Start mysql service | ||||
|         run: sudo /etc/init.d/mysql start | ||||
|       - name: Get composer cache directory | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -50,7 +52,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: | | ||||
|           php -r "file_exists('.env') || copy('.env.dist', '.env');" | ||||
|  | ||||
| @ -42,7 +42,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -50,7 +50,7 @@ jobs: | ||||
|           key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|         run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|       - name: Prepare the application | ||||
|         run: | | ||||
|           php -r "file_exists('.env') || copy('.env.dist', '.env');" | ||||
|  | ||||
| @ -21,7 +21,7 @@ jobs: | ||||
|         id: composer-cache | ||||
|         run: echo "::set-output name=dir::$(composer config cache-files-dir)" | ||||
|       - name: Cache composer dependencies | ||||
|         uses: actions/cache@v1 | ||||
|         uses: actions/cache@v2 | ||||
|         with: | ||||
|           path: ${{ steps.composer-cache.outputs.dir }} | ||||
|           # Use composer.json for key, if composer.lock is not committed. | ||||
| @ -30,7 +30,7 @@ jobs: | ||||
|           restore-keys: ${{ runner.os }}-composer- | ||||
|       - name: Install dependencies | ||||
|         run: | | ||||
|           composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader | ||||
|           composer install --no-progress --prefer-dist --optimize-autoloader | ||||
|           composer require --dev phpunit/phpunit squizlabs/php_codesniffer zendframework/zend-test | ||||
|       - name: Test with phpunit | ||||
|         run: vendor/bin/phpunit --coverage-text | ||||
							
								
								
									
										12094
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12094
									
								
								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.8.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.2", | ||||
|     "@actions/exec": "^1.0.3", | ||||
|     "@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": "^25.1.1", | ||||
|     "@types/node": "^13.7.0", | ||||
|     "@typescript-eslint/eslint-plugin": "^2.18.0", | ||||
|     "@typescript-eslint/parser": "^2.18.0", | ||||
|     "@zeit/ncc": "^0.21.0", | ||||
|     "eslint": "^6.8.0", | ||||
|     "eslint-config-prettier": "^6.10.0", | ||||
|     "eslint-plugin-import": "^2.20.1", | ||||
|     "eslint-plugin-jest": "^23.6.0", | ||||
|     "eslint-plugin-prettier": "^3.1.2", | ||||
|     "husky": "^4.2.1", | ||||
|     "jest": "^25.1.0", | ||||
|     "jest-circus": "^25.1.0", | ||||
|     "prettier": "^1.19.1", | ||||
|     "ts-jest": "^25.1.0", | ||||
|     "typescript": "^3.7.5" | ||||
|     "@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" | ||||
|   } | ||||
| } | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -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 | ||||
|   ); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @ -44,6 +46,7 @@ export async function addINIValuesWindows( | ||||
|  * | ||||
|  * @param ini_values_csv | ||||
|  * @param os_version | ||||
|  * @param no_step | ||||
|  */ | ||||
| export async function addINIValues( | ||||
|   ini_values_csv: string, | ||||
|  | ||||
							
								
								
									
										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,43 +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> { | ||||
|   switch (version) { | ||||
|     case '8.0': | ||||
|       return ( | ||||
|         '\n' + | ||||
|         (await utils.addLog( | ||||
|           '$cross', | ||||
|           'xdebug', | ||||
|           'Xdebug currently only supports PHP 7.4 or lower', | ||||
|           os_version | ||||
|         )) | ||||
|       ); | ||||
|     case '7.4': | ||||
|     default: | ||||
|       return ( | ||||
|         (await extensions.addExtension('xdebug', version, os_version, true)) + | ||||
|         pipe + | ||||
|         '\n' + | ||||
|         (await utils.addLog( | ||||
|   const xdebug = | ||||
|     (await extensions.addExtension(extension, version, os_version, true)) + | ||||
|     pipe; | ||||
|   const log = await utils.addLog( | ||||
|     '$tick', | ||||
|           'xdebug', | ||||
|     extension, | ||||
|     'Xdebug enabled as coverage driver', | ||||
|     os_version | ||||
|         )) | ||||
|   ); | ||||
|   } | ||||
|   return xdebug + '\n' + log; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @ -151,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: | ||||
|  | ||||
| @ -6,67 +6,57 @@ import * as utils from './utils'; | ||||
|  * | ||||
|  * @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'; | ||||
|   await utils.asyncForEach(extensions, async function (extension: string) { | ||||
|     extension = extension.toLowerCase(); | ||||
|     const version_extension: string = version + extension; | ||||
|     const [extension_name, stability]: string[] = extension.split('-'); | ||||
|     const prefix = await utils.getExtensionPrefix(extension_name); | ||||
|     let install_command = ''; | ||||
|     const ext_prefix = await utils.getExtensionPrefix(extension_name); | ||||
|     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 + | ||||
|           ' ' + | ||||
|           stability + | ||||
|           ' ' + | ||||
|           prefix; | ||||
|           ext_prefix; | ||||
|         return; | ||||
|       case /5\.6xdebug/.test(version_extension): | ||||
|         install_command = 'sudo pecl install -f xdebug-2.5.5' + pipe; | ||||
|       // match 5.6 to 8.0 amqp, expect, grpc, igbinary, imagick, imap, mongodb, msgpack, pecl_http, propro, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq | ||||
|       // match 7.1pcov to 8.0pcov | ||||
|       // match 7.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; | ||||
|       case /7\.0xdebug/.test(version_extension): | ||||
|         install_command = 'sudo pecl install -f xdebug-2.9.0' + pipe; | ||||
|         break; | ||||
|       case /5\.6redis/.test(version_extension): | ||||
|         install_command = 'sudo pecl install -f redis-2.2.8' + pipe; | ||||
|         break; | ||||
|       case /[5-9]\.\dimagick/.test(version_extension): | ||||
|         install_command = | ||||
|           'brew install pkg-config imagemagick' + | ||||
|           pipe + | ||||
|           ' && sudo pecl install -f imagick' + | ||||
|           pipe; | ||||
|         break; | ||||
|       case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension): | ||||
|         install_command = | ||||
|           'sh ' + | ||||
|           path.join(__dirname, '../src/scripts/ext/phalcon_darwin.sh') + | ||||
|           ' ' + | ||||
|           extension + | ||||
|           ' ' + | ||||
|           version + | ||||
|           pipe; | ||||
|       // match sqlite | ||||
|       case /^sqlite$/.test(extension): | ||||
|         extension = 'sqlite3'; | ||||
|         command = command_prefix + extension; | ||||
|         break; | ||||
|       default: | ||||
|         install_command = 'sudo pecl install -f ' + extension + pipe; | ||||
|         command = command_prefix + extension; | ||||
|         break; | ||||
|     } | ||||
|     script += | ||||
|       '\nadd_extension ' + | ||||
|       extension + | ||||
|       ' "' + | ||||
|       install_command + | ||||
|       command + | ||||
|       '" ' + | ||||
|       (await utils.getExtensionPrefix(extension)); | ||||
|   }); | ||||
| @ -78,24 +68,41 @@ export async function addExtensionDarwin( | ||||
|  * | ||||
|  * @param extension_csv | ||||
|  * @param version | ||||
|  * @param pipe | ||||
|  */ | ||||
| export async function addExtensionWindows( | ||||
|   extension_csv: string, | ||||
|   version: string, | ||||
|   pipe: string | ||||
|   version: string | ||||
| ): Promise<string> { | ||||
|   const extensions: Array<string> = await utils.extensionArray(extension_csv); | ||||
|   let script = '\n'; | ||||
|   await utils.asyncForEach(extensions, async function (extension: string) { | ||||
|     extension = extension.toLowerCase(); | ||||
|     const [extension_name, stability]: string[] = extension.split('-'); | ||||
|     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 | ||||
|       case /^5\.6(mysql|mysqli|mysqlnd)$/.test(version_extension): | ||||
|         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 | ||||
|       case /[7-8]\.\d(mysql|mysqli|mysqlnd)$/.test(version_extension): | ||||
|         script += '\nAdd-Extension mysqli\nAdd-Extension mysqlnd'; | ||||
|         break; | ||||
|       // match sqlite | ||||
|       case /^sqlite$/.test(extension): | ||||
|         extension = 'sqlite3'; | ||||
|         script += '\nAdd-Extension ' + 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 += | ||||
| @ -130,52 +137,49 @@ export async function addExtensionLinux( | ||||
|   const extensions: Array<string> = await utils.extensionArray(extension_csv); | ||||
|   let script = '\n'; | ||||
|   await utils.asyncForEach(extensions, async function (extension: string) { | ||||
|     extension = extension.toLowerCase(); | ||||
|     const version_extension: string = version + extension; | ||||
|     const [extension_name, stability]: string[] = extension.split('-'); | ||||
|     const prefix = await utils.getExtensionPrefix(extension_name); | ||||
|     let install_command = ''; | ||||
|     const ext_prefix = await utils.getExtensionPrefix(extension_name); | ||||
|     const command_prefix = 'sudo $debconf_fix apt-get install -y php'; | ||||
|     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 + | ||||
|           ' ' + | ||||
|           stability + | ||||
|           ' ' + | ||||
|           prefix; | ||||
|           ext_prefix; | ||||
|         return; | ||||
|       // match 5.6gearman..7.4gearman | ||||
|       case /^((5\.6)|(7\.[0-4]))gearman$/.test(version_extension): | ||||
|         install_command = | ||||
|           'sh ' + | ||||
|           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 += | ||||
|           '\nsh ' + | ||||
|           '\nbash ' + | ||||
|           path.join(__dirname, '../src/scripts/ext/phalcon.sh') + | ||||
|           ' ' + | ||||
|           extension + | ||||
|           ' ' + | ||||
|           version; | ||||
|         return; | ||||
|       // match 7.0xdebug..7.4xdebug | ||||
|       case /^7\.[0-4]xdebug$/.test(version_extension): | ||||
|         script += | ||||
|           '\nupdate_extension xdebug 2.9.0' + | ||||
|           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): | ||||
|         extension = 'sqlite3'; | ||||
|         command = command_prefix + version + '-' + extension + pipe; | ||||
|         break; | ||||
|       default: | ||||
|         install_command = | ||||
|           'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y php' + | ||||
|         command = | ||||
|           command_prefix + | ||||
|           version + | ||||
|           '-' + | ||||
|           extension.replace('pdo_', '').replace('pdo-', '') + | ||||
| @ -183,7 +187,7 @@ export async function addExtensionLinux( | ||||
|         break; | ||||
|     } | ||||
|     script += | ||||
|       '\nadd_extension ' + extension + ' "' + install_command + '" ' + prefix; | ||||
|       '\nadd_extension ' + extension + ' "' + command + '" ' + ext_prefix; | ||||
|   }); | ||||
|   return script; | ||||
| } | ||||
| @ -194,7 +198,7 @@ export async function addExtensionLinux( | ||||
|  * @param extension_csv | ||||
|  * @param version | ||||
|  * @param os_version | ||||
|  * @param log_prefix | ||||
|  * @param no_step | ||||
|  */ | ||||
| export async function addExtension( | ||||
|   extension_csv: string, | ||||
| @ -216,9 +220,9 @@ export async function addExtension( | ||||
|  | ||||
|   switch (os_version) { | ||||
|     case 'win32': | ||||
|       return script + (await addExtensionWindows(extension_csv, version, pipe)); | ||||
|       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,27 +29,23 @@ 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, version, os_version); | ||||
|   let script: string = await utils.readScript(filename); | ||||
|   script += await tools.addTools(tools_csv, version, os_version); | ||||
|  | ||||
|   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 { | ||||
|     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; | ||||
|     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('sh ' + script_path + ' ' + version + ' ' + __dirname); | ||||
|           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; | ||||
|       } | ||||
|     await matchers.addMatchers(); | ||||
|     } else { | ||||
|       core.setFailed('Unable to get the PHP version'); | ||||
|     } | ||||
|   } 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,116 +18,216 @@ add_log() { | ||||
|  | ||||
| # Function to remove extensions | ||||
| remove_extension() { | ||||
|   extension=$1 | ||||
|   sudo sed -i '' "/$extension/d" "$ini_file" | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 | ||||
|   local extension=$1 | ||||
|   sudo sed -Ei '' "/=(.*\/)?\"?$extension/d" "$ini_file" | ||||
|   sudo rm -rf "$scan_dir"/*"$extension"*  | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so  | ||||
| } | ||||
|  | ||||
| # Function to setup extensions | ||||
| add_extension() { | ||||
|   extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   if ! php -m | grep -i -q -w "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     echo "$prefix=$extension" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|   elif php -m | grep -i -q -w "$extension"; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   elif ! php -m | grep -i -q -w "$extension"; then | ||||
|     (eval "$install_command" >/dev/null 2>&1 && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|     add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
| # Function to test if extension is loaded | ||||
| check_extension() { | ||||
|   local extension=$1 | ||||
|   if [ "$extension" != "mysql" ]; then | ||||
|     php -m | grep -i -q -w "$extension" | ||||
|   else | ||||
|     php -m | grep -i -q "$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"  | ||||
| } | ||||
|  | ||||
| # 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 pre-release extensions using PECL | ||||
| add_unstable_extension() { | ||||
|   extension=$1 | ||||
|   stability=$2 | ||||
| # Function to install a PECL version | ||||
| add_pecl_extension() { | ||||
|   local extension=$1 | ||||
|   pecl_version=$2 | ||||
|   prefix=$3 | ||||
|   pecl_version=$(get_pecl_version "$extension" "$stability") | ||||
|   if ! php -m | grep -i -q -w "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     extension_version=$(php -d="$prefix=$extension" -r "echo phpversion('$extension');") | ||||
|     if [ "$extension_version" = "$pecl_version" ]; then | ||||
|       echo "$prefix=$extension" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|     else | ||||
|       remove_extension "$extension" | ||||
|       add_extension "$extension" "sudo pecl install -f $extension-$pecl_version" "$prefix" | ||||
|   if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then | ||||
|     pecl_version=$(get_pecl_version "$extension" "$pecl_version") | ||||
|   fi | ||||
|   elif php -m | grep -i -q -w "$extension"; then | ||||
|     extension_version=$(php -r "echo phpversion('$extension');") | ||||
|     if [ "$extension_version" = "$pecl_version" ]; then | ||||
|   if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     echo "$prefix=$ext_dir/$extension.so" >>"$ini_file" | ||||
|   fi | ||||
|   ext_version=$(php -r "echo phpversion('$extension');") | ||||
|   if [ "$ext_version" = "$pecl_version" ]; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   else | ||||
|     remove_extension "$extension" | ||||
|       add_extension "$extension" "sudo pecl install -f $extension-$pecl_version" "$prefix" | ||||
|     fi | ||||
|   else | ||||
|     add_extension "$extension" "sudo pecl install -f $extension-$pecl_version" "$prefix" | ||||
|     ( | ||||
|       pecl_install "$extension-$pecl_version"  && | ||||
|       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 setup a remote tool | ||||
| # 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"  | ||||
|     if ! [ -d "$tap_dir/$tap" ]; then | ||||
|       brew tap "$tap"  | ||||
|     fi | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install a php extension from shivammathur/extensions tap. | ||||
| add_brew_extension() { | ||||
|   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() { | ||||
|   local extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     echo "$prefix=$ext_dir/$extension.so" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|   elif check_extension "$extension"; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   elif ! check_extension "$extension"; then | ||||
|     ( | ||||
|       eval "$install_command"  && | ||||
|       check_extension "$extension" && | ||||
|       add_log "$tick" "$extension" "Installed and enabled" | ||||
|     ) || add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to pre-release extensions using PECL | ||||
| add_unstable_extension() { | ||||
|   local extension=$1 | ||||
|   stability=$2 | ||||
|   prefix=$3 | ||||
|   pecl_version=$(get_pecl_version "$extension" "$stability") | ||||
|   add_pecl_extension "$extension" "$pecl_version" "$prefix" | ||||
| } | ||||
|  | ||||
| # 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 | ||||
|   if [ "$tool" = "composer" ]; then | ||||
|     brew install composer >/dev/null 2>&1 | ||||
|     composer -q global config process-timeout 0 | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   else | ||||
|     tool_path=/usr/local/bin/"$tool" | ||||
|   tool_path="$tool_path_dir/$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" = "phive" ]; then | ||||
|         add_extension curl >/dev/null 2>&1 | ||||
|         add_extension mbstring >/dev/null 2>&1 | ||||
|         add_extension xml >/dev/null 2>&1 | ||||
|     if [ "$tool" = "composer" ]; then | ||||
|       configure_composer "$tool_path" | ||||
|     elif [ "$tool" = "phan" ]; then | ||||
|       add_extension fileinfo "pecl_install fileinfo" extension  | ||||
|       add_extension ast "pecl_install ast" extension  | ||||
|     elif [ "$tool" = "phive" ]; then | ||||
|       add_extension curl "pecl_install curl" extension  | ||||
|       add_extension mbstring "pecl_install mbstring" extension  | ||||
|       add_extension xml "pecl_install xml" extension  | ||||
|     elif [ "$tool" = "cs2pr" ]; then | ||||
|       sudo sed -i '' 's/exit(9)/exit(0)/' "$tool_path" | ||||
|         tr -d '\r' < "$tool_path" | sudo tee "$tool_path" >/dev/null 2>&1 | ||||
|       tr -d '\r' < "$tool_path" | sudo tee "$tool_path.tmp"  && sudo mv "$tool_path.tmp" "$tool_path" | ||||
|       sudo chmod a+x "$tool_path" | ||||
|     fi | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   else | ||||
|     add_log "$cross" "$tool" "Could not setup $tool" | ||||
|   fi | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to add a tool using composer | ||||
| add_composer_tool() { | ||||
| add_composertool() { | ||||
|   tool=$1 | ||||
|   release=$2 | ||||
|   prefix=$3 | ||||
|   ( | ||||
|     composer global require "$prefix$release" >/dev/null 2>&1 && | ||||
|     sudo ln -sf "$(composer -q global config home)"/vendor/bin/"$tool" /usr/local/bin/"$tool" && | ||||
|     sudo rm -f "$composer_lock"  || true | ||||
|     composer global require "$prefix$release"  && | ||||
|     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 | ||||
|     sudo "$tool" config-set php_ini "$ini_file"  | ||||
|     sudo "$tool" channel-update "$tool".php.net  | ||||
|   done | ||||
| } | ||||
|  | ||||
| @ -136,27 +236,114 @@ 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  | ||||
|   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_and_composer() { | ||||
|   export HOMEBREW_NO_INSTALL_CLEANUP=TRUE | ||||
|   brew tap shivammathur/homebrew-php >/dev/null 2>&1 | ||||
|   brew install shivammathur/php/php@"$version" >/dev/null 2>&1 | ||||
|   brew link --force --overwrite php@"$version" >/dev/null 2>&1 | ||||
| setup_php() { | ||||
|   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" | ||||
| 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 and composer | ||||
| # Setup PHP | ||||
| step_log "Setup PHP" | ||||
| setup_php_and_composer | ||||
| if [ "$existing_version" != "$version" ]; then | ||||
|   setup_php  | ||||
|   status="Installed" | ||||
| else | ||||
|   status="Found" | ||||
| fi | ||||
| ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") | ||||
| echo "date.timezone=UTC" >>"$ini_file" | ||||
| ext_dir=$(php -i | grep "extension_dir => /usr" | sed -e "s|.*=> s*||") | ||||
| sudo chmod 777 "$ini_file" | ||||
| mkdir -p "$(pecl config-get ext_dir)" | ||||
| sudo chmod 777 "$ini_file" "$tool_path_dir" | ||||
| 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 -m 777 -p "$ext_dir" "$HOME/.composer" | ||||
| semver=$(php -v | head -n 1 | cut -f 2 -d ' ') | ||||
| add_log "$tick" "PHP" "Installed PHP $semver" | ||||
| 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,15 +0,0 @@ | ||||
| php_h="https://raw.githubusercontent.com/php/php-src/PHP-$2/main/php.h" | ||||
| os=$(uname -s) | ||||
| if [ "$os" = "Linux" ]; then | ||||
|   apiv=$(curl -sSL --retry 5 "$php_h" | grep "PHP_API_VERSION" | cut -d' ' -f 3) | ||||
|   dir="/usr/lib/php/$apiv" | ||||
|   sudo mkdir -p "$dir" && sudo chown -R "$USER":"$(id -g -n)" /usr/lib/php | ||||
| elif [ "$os" = "Darwin" ]; then | ||||
|   apiv=$(curl -sSL --retry 5 "$php_h" | grep "PHP_API_VERSION" | cut -d' ' -f 3) | ||||
|   dir="/usr/local/lib/php/pecl/$apiv" | ||||
| else | ||||
|   dir='C:\\tools\\php\\ext' | ||||
| fi | ||||
| hash=$(echo -n "$1" | openssl dgst -sha256 | cut -d ' ' -f 2) | ||||
| echo "::set-output name=ext_dir::$dir" | ||||
| echo "::set-output name=ext_hash::$hash" | ||||
| @ -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 | ||||
|  | ||||
| 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 | ||||
| # 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 | ||||
| } | ||||
|  | ||||
| # Function to add gearman extension. | ||||
| add_gearman() { | ||||
|   status="Enabled" | ||||
|   add_gearman_helper  | ||||
|   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 | ||||
|  | ||||
| @ -13,17 +13,16 @@ add_log() { | ||||
| # Function to update php ppa | ||||
| update_ppa() { | ||||
|   if [ "$ppa_updated" = "false" ]; then | ||||
|     find /etc/apt/sources.list.d -type f -name 'ondrej-ubuntu-php*.list' -exec sudo DEBIAN_FRONTEND=noninteractive apt-get update -o Dir::Etc::sourcelist="{}" ';' >/dev/null 2>&1 | ||||
|     find /etc/apt/sources.list.d -type f -name 'ondrej-ubuntu-php*.list' -exec sudo DEBIAN_FRONTEND=noninteractive apt-get update -o Dir::Etc::sourcelist="{}" ';'  | ||||
|     ppa_updated="true" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install phalcon | ||||
| install_phalcon() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   version=$2 | ||||
|   (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-$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"  && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|   add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
| } | ||||
|  | ||||
| @ -36,8 +35,8 @@ tick="✓" | ||||
| cross="✗" | ||||
|  | ||||
| if [ "$extension_major_version" = "4" ]; then | ||||
|   if [ -e "$ext_dir/psr.so" ]; then | ||||
|     echo "extension=psr.so" | sudo tee -a "$ini_file" >/dev/null 2>&1 | ||||
|   if [ -e "$ext_dir/psr.so" ] && ! php -m | grep -i -q -w psr; then | ||||
|     echo "extension=psr.so" | sudo tee -a "$ini_file"  | ||||
|   fi | ||||
|  | ||||
|   if [ -e "$ext_dir/phalcon.so" ]; then | ||||
| @ -46,7 +45,7 @@ if [ "$extension_major_version" = "4" ]; then | ||||
|       if [ "$phalcon_version" != "$extension_major_version" ]; then | ||||
|         install_phalcon "$1" "$2" | ||||
|       else | ||||
|         echo "extension=phalcon.so" | sudo tee -a "$ini_file" >/dev/null 2>&1 | ||||
|         echo "extension=phalcon.so" | sudo tee -a "$ini_file"  | ||||
|         add_log "$tick" "$1" "Enabled" | ||||
|       fi | ||||
|     else | ||||
| @ -63,7 +62,7 @@ if [ "$extension_major_version" = "3" ]; then | ||||
|     if [ "$phalcon_version" != "$extension_major_version" ]; then | ||||
|       install_phalcon "$1" "$2" | ||||
|     else | ||||
|       echo "extension=phalcon.so" | sudo tee -a "$ini_file" >/dev/null 2>&1 | ||||
|       echo "extension=phalcon.so" | sudo tee -a "$ini_file"  | ||||
|       add_log "$tick" "$1" "Enabled" | ||||
|     fi | ||||
|   else | ||||
|  | ||||
| @ -1,17 +0,0 @@ | ||||
| extension=$1 | ||||
| extension_major=${extension: -1} | ||||
| php_version=$2 | ||||
| ini_file=$(php -d "date.timezone=UTC" --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 | ||||
|   echo "extension=psr" >>"$ini_file" | ||||
|   echo "extension=phalcon" >>"$ini_file" | ||||
|   phalcon_version=$(php -d="extension=phalcon" -r "echo phpversion('phalcon');" | cut -d'.' -f 1) | ||||
|   if [ "$phalcon_version" != "$extension_major" ]; then | ||||
|     brew tap shivammathur/homebrew-phalcon | ||||
|     brew install phalcon@"$php_version"_"$extension_major" | ||||
|   fi | ||||
| else | ||||
|   brew tap shivammathur/homebrew-phalcon | ||||
|   brew install phalcon@"$php_version"_"$extension_major" | ||||
| 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,192 +16,265 @@ add_log() { | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to update php ppa | ||||
| update_ppa() { | ||||
|   if [ "$ppa_updated" = "false" ]; then | ||||
|     find /etc/apt/sources.list.d -type f -name 'ondrej-ubuntu-php*.list' -exec sudo DEBIAN_FRONTEND=noninteractive apt-fast update -o Dir::Etc::sourcelist="{}" ';' >/dev/null 2>&1 | ||||
|     ppa_updated="true" | ||||
| # 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 [ ! -e /tmp/setup_php ]; then | ||||
|     add_ppa ondrej/php  | ||||
|     cleanup_lists | ||||
|     sudo "$debconf_fix" apt-get update  | ||||
|     echo '' | sudo tee /tmp/setup_php  | ||||
|   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 "$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 | ||||
|   if ! [ -e /tmp/pecl_config ]; then | ||||
|     if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then | ||||
|       add_pecl  | ||||
|     fi | ||||
|     for script in pear pecl; do | ||||
|       sudo "$script" config-set php_ini "${pecl_file:-$ini_file}"  | ||||
|       sudo "$script" channel-update "$script".php.net  | ||||
|     done | ||||
|     pecl_config="true" | ||||
|     echo '' | sudo tee /tmp/pecl_config  | ||||
|   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 setup extensions | ||||
| add_extension() { | ||||
|   extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   if ! php -m | grep -i -q -w "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     # shellcheck disable=SC2046 | ||||
|     $apt_install $(apt-cache depends php"$version"-"$extension" | awk '/Depends:/{print$2}') >/dev/null 2>&1 | ||||
|     echo "$prefix=$extension" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|   elif php -m | grep -i -q -w "$extension"; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   elif ! php -m | grep -i -q -w "$extension"; then | ||||
|     (eval "$install_command" && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|     (update_ppa && eval "$install_command" && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|     (sudo pecl install -f "$extension" >/dev/null 2>&1 && add_log "$tick" "$extension" "Installed and enabled") || | ||||
|     add_log "$cross" "$extension" "Could not install $extension on PHP $semver" | ||||
| # Function to install PECL extensions and accept default options | ||||
| pecl_install() { | ||||
|   local extension=$1 | ||||
|   yes '' | sudo pecl install -f "$extension"  | ||||
| } | ||||
|  | ||||
| # 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() { | ||||
|   local extension=$1 | ||||
|   if [ "$extension" != "mysql" ]; then | ||||
|     php -m | grep -i -q -w "$extension" | ||||
|   else | ||||
|     php -m | grep -i -q "$extension" | ||||
|   fi | ||||
|   sudo chmod 777 "$ini_file" | ||||
| } | ||||
|  | ||||
| # Function to delete extensions | ||||
| delete_extension() { | ||||
|   extension=$1 | ||||
|   sudo sed -i "/$extension/d" "$ini_file" | ||||
|   sudo rm -rf /etc/php/"$version"/cli/conf.d/*"$extension"* >/dev/null 2>&1 | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 | ||||
|   local extension=$1 | ||||
|   sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file" | ||||
|   sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file" | ||||
|   sudo rm -rf "$scan_dir"/*"$extension"*  | ||||
|   sudo rm -rf "$ext_dir"/"$extension".so  | ||||
|   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 | ||||
|   delete_extension "$extension" | ||||
| } | ||||
|  | ||||
| # Function to setup extensions | ||||
| add_extension() { | ||||
|   local extension=$1 | ||||
|   install_command=$2 | ||||
|   prefix=$3 | ||||
|   enable_extension "$extension" "$prefix" | ||||
|   if check_extension "$extension"; then | ||||
|     add_log "$tick" "$extension" "Enabled" | ||||
|   elif ! check_extension "$extension"; then | ||||
|     eval "$install_command"  || | ||||
|     (update_lists && eval "$install_command" ) || 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 | ||||
|   sudo chmod 777 "$ini_file" | ||||
| } | ||||
|  | ||||
| # Function to install a PECL version | ||||
| add_pecl_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   pecl_version=$2 | ||||
|   (sudo pecl install -f "$extension-$pecl_version" >/dev/null 2>&1 && | ||||
|   add_log "$tick" "$extension" "Installed and enabled") || | ||||
|   add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver" | ||||
|   prefix=$3 | ||||
|   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" | ||||
|   else | ||||
|     delete_extension "$extension" | ||||
|     ( | ||||
|       sudo pecl install -f "$extension-$pecl_version"  && | ||||
|       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 pre-release extensions using PECL | ||||
| add_unstable_extension() { | ||||
|   extension=$1 | ||||
|   local extension=$1 | ||||
|   stability=$2 | ||||
|   prefix=$3 | ||||
|   pecl_version=$(get_pecl_version "$extension" "$stability") | ||||
|   if ! php -m | grep -i -q -w "$extension" && [ -e "$ext_dir/$extension.so" ]; then | ||||
|     extension_version=$(php -d="$prefix=$extension" -r "echo phpversion('$extension');") | ||||
|     if [ "$extension_version" = "$pecl_version" ]; then | ||||
|       echo "$prefix=$extension" >>"$ini_file" && add_log "$tick" "$extension" "Enabled" | ||||
|     else | ||||
|       delete_extension "$extension" | ||||
|       add_pecl_extension "$extension" "$pecl_version" | ||||
|   add_pecl_extension "$extension" "$pecl_version" "$prefix" | ||||
| } | ||||
|  | ||||
| # 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 | ||||
|   elif php -m | grep -i -q -w "$extension"; then | ||||
|     extension_version=$(php -r "echo phpversion('$extension');") | ||||
|     if [ "$extension_version" = "$pecl_version" ]; then | ||||
|       add_log "$tick" "$extension" "Enabled" | ||||
|   if ! [ -d "$composer_home" ]; then | ||||
|     sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home" | ||||
|   else | ||||
|       delete_extension "$extension" | ||||
|       add_pecl_extension "$extension" "$pecl_version" | ||||
|     sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home" | ||||
|   fi | ||||
|   else | ||||
|     add_pecl_extension "$extension" "$pecl_version" | ||||
|   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 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_ppa | ||||
|     fi | ||||
|     $apt_install php"$version"-"$extension" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to setup a remote tool | ||||
| # Function to setup a remote tool. | ||||
| add_tool() { | ||||
|   url=$1 | ||||
|   tool=$2 | ||||
|   tool_path=/usr/local/bin/"$tool" | ||||
|   tool_path="$tool_path_dir/$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 | ||||
|       configure_composer "$tool_path" | ||||
|     elif [ "$tool" = "cs2pr" ]; then | ||||
|       sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path" | ||||
|     elif [ "$tool" = "phive" ]; then | ||||
|       add_extension curl >/dev/null 2>&1 | ||||
|       add_extension mbstring >/dev/null 2>&1 | ||||
|       add_extension xml >/dev/null 2>&1 | ||||
|       add_extension curl "$apt_install php$version-curl" extension  | ||||
|       add_extension mbstring "$apt_install php$version-mbstring" extension  | ||||
|       add_extension xml "$apt_install php$version-xml" extension  | ||||
|     fi | ||||
|     add_log "$tick" "$tool" "Added" | ||||
|   else | ||||
|     add_log "$cross" "$tool" "Could not setup $tool" | ||||
|     [ "$tool" = "composer" ] && exit 1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to setup a tool using composer | ||||
| add_composer_tool() { | ||||
| add_composertool() { | ||||
|   tool=$1 | ||||
|   release=$2 | ||||
|   prefix=$3 | ||||
|   ( | ||||
|     composer global require "$prefix$release" >/dev/null 2>&1 && | ||||
|     sudo ln -sf "$(composer -q global config home)"/vendor/bin/"$tool" /usr/local/bin/"$tool" && | ||||
|     sudo rm -f "$composer_lock"  || true | ||||
|     composer global require "$prefix$release"  && | ||||
|     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 | ||||
| add_devtools() { | ||||
|   if ! [ -e "/usr/bin/phpize$version" ] || ! [ -e "/usr/bin/php-config$version" ]; then | ||||
|     $apt_install php"$version"-dev php"$version"-xml >/dev/null 2>&1 | ||||
|     update_lists && $apt_install php"$version"-dev php"$version"-xml  | ||||
|   fi | ||||
|   sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1 | ||||
|   sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1 | ||||
|   sudo update-alternatives --set php-config /usr/bin/php-config"$version"  | ||||
|   sudo update-alternatives --set phpize /usr/bin/phpize"$version"  | ||||
|   configure_pecl | ||||
| } | ||||
|  | ||||
| # Function to setup the nightly build from master branch | ||||
| setup_master() { | ||||
|   tar_file=php_"$version"%2Bubuntu"$(lsb_release -r -s)".tar.xz | ||||
|   install_dir=~/php/"$version" | ||||
|   sudo mkdir -m 777 -p ~/php | ||||
|   $apt_install libicu-dev >/dev/null 2>&1 | ||||
|   curl -o "$tar_file" -L https://bintray.com/shivammathur/php/download_file?file_path="$tar_file" >/dev/null 2>&1 | ||||
|   sudo tar xf "$tar_file" -C ~/php >/dev/null 2>&1 | ||||
|   rm -rf "$tar_file" | ||||
|   sudo ln -sf -S "$version" "$install_dir"/bin/* /usr/bin/ | ||||
|   sudo ln -sf "$install_dir"/etc/php.ini /etc/php.ini | ||||
|   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 | ||||
| add_pecl() { | ||||
|   add_devtools | ||||
|   if [ ! -e /usr/bin/pecl ]; then | ||||
|     $apt_install php-pear >/dev/null 2>&1 | ||||
|     $apt_install php-pear  | ||||
|   fi | ||||
|   configure_pecl | ||||
|   add_log "$tick" "PECL" "Added" | ||||
| @ -211,57 +284,78 @@ add_pecl() { | ||||
| switch_version() { | ||||
|   for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do | ||||
|     if [ -e "/usr/bin/$tool$version" ]; then | ||||
|       sudo update-alternatives --set $tool /usr/bin/"$tool$version" >/dev/null 2>&1 | ||||
|       sudo update-alternatives --set $tool /usr/bin/"$tool$version" | ||||
|     fi | ||||
|   done | ||||
| } | ||||
|  | ||||
| # Function to get PHP version in semver format | ||||
| php_semver() { | ||||
|   if [ ! "$version" = "8.0" ]; then | ||||
|     php"$version" -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-' | ||||
|   else | ||||
|     php -v | head -n 1 | cut -f 2 -d ' ' | ||||
|   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="✗" | ||||
| ppa_updated="false" | ||||
| pecl_config="false" | ||||
| version=$1 | ||||
| apt_install="sudo DEBIAN_FRONTEND=noninteractive apt-fast install -y" | ||||
| existing_version=$(php-config --version | cut -c 1-3) | ||||
| dist=$2 | ||||
| debconf_fix="DEBIAN_FRONTEND=noninteractive" | ||||
| 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 | ||||
| sudo mkdir -p /run/php | ||||
| sudo mkdir -m 777 -p "$HOME/.composer" /var/run /run/php | ||||
| . /etc/lsb-release | ||||
|  | ||||
| if [ "$existing_version" != "$version" ]; then | ||||
|   if [ ! -e "/usr/bin/php$version" ]; then | ||||
|     update_ppa | ||||
|     if [ "$version" = "8.0" ]; then | ||||
|       setup_master  | ||||
|     else | ||||
|       $apt_install php"$version" php"$version"-curl php"$version"-mbstring php"$version"-xml >/dev/null 2>&1 | ||||
|       add_packaged_php  | ||||
|     fi | ||||
|     status="installed" | ||||
|     status="Installed" | ||||
|   else | ||||
|     status="switched" | ||||
|     status="Switched to" | ||||
|   fi | ||||
|  | ||||
|   switch_version  | ||||
|  | ||||
|   if [ "$version" = "8.0" ]; then | ||||
|     semver=$(php -v | head -n 1 | cut -f 2 -d ' ') | ||||
| else | ||||
|     semver=$(php -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-') | ||||
|   status="Found" | ||||
| fi | ||||
|  | ||||
|   if [ "$status" != "switched" ]; then | ||||
|     status="Installed PHP $semver" | ||||
|   else | ||||
|     status="Switched to PHP $semver" | ||||
| if ! command -v php"$version" >/dev/null; then | ||||
|   add_log "$cross" "PHP" "Could not setup PHP $version" | ||||
|   exit 1 | ||||
| fi | ||||
| else | ||||
|   semver=$(php -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-') | ||||
|   status="PHP $semver Found" | ||||
| 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 => /usr" | sed -e "s|.*=> s*||") | ||||
| sudo chmod 777 "$ini_file" | ||||
| add_log "$tick" "PHP" "$status" | ||||
| ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||") | ||||
| pecl_file="$scan_dir"/99-pecl.ini | ||||
| echo '' | sudo tee "$pecl_file"  | ||||
| configure_php | ||||
| sudo rm -rf /usr/local/bin/phpunit  | ||||
| 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) { | ||||
| @ -20,6 +20,67 @@ Function Add-Log($mark, $subject, $message) { | ||||
|   printf "\033[%s;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $code $mark $subject $message | ||||
| } | ||||
|  | ||||
| Function Add-ToProfile { | ||||
|   param( | ||||
|     [Parameter(Position = 0, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
|     [ValidateLength(1, [int]::MaxValue)] | ||||
|     [string] | ||||
|     $input_profile, | ||||
|     [Parameter(Position = 1, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
|     [ValidateLength(1, [int]::MaxValue)] | ||||
|     [string] | ||||
|     $search, | ||||
|     [Parameter(Position = 2, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
|     [ValidateLength(1, [int]::MaxValue)] | ||||
|     [string] | ||||
|     $value | ||||
|   ) | ||||
|   if($null -eq (Get-Content $input_profile | findstr $search)) { | ||||
|     Add-Content -Path $input_profile -Value $value | ||||
|   } | ||||
| } | ||||
|  | ||||
| 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 "$package-search" "Import-Module $module_path" | ||||
|  | ||||
|   if($null -eq (Get-Command $cmdlet -ErrorAction SilentlyContinue)) { | ||||
|     Install-Module -Name $package -Force | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Add-Extension { | ||||
|   Param ( | ||||
|     [Parameter(Position = 0, Mandatory = $true)] | ||||
| @ -31,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 } | ||||
| @ -50,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" | ||||
|     } | ||||
|   } | ||||
| @ -75,12 +146,35 @@ Function Remove-Extension() { | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Add-Tool() { | ||||
|  | ||||
| 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()] | ||||
| @ -91,40 +185,49 @@ Function Add-Tool() { | ||||
|   if (Test-Path $php_dir\$tool) { | ||||
|     Remove-Item $php_dir\$tool | ||||
|   } | ||||
|   if ($tool -eq "composer") { | ||||
|     Install-Composer -Scope System -Path $php_dir -PhpPath $php_dir | ||||
|     composer -q global config process-timeout 0 | ||||
|   } elseif ($tool -eq "symfony") { | ||||
|   if($url.Count -gt 1) { $url = $url[0] } | ||||
|   if ($tool -eq "symfony") { | ||||
|     Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool.exe | ||||
|     Add-Content -Path $PsHome\profile.ps1 -Value "New-Alias $tool $php_dir\$tool.exe" > $null 2>&1 | ||||
|     Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.exe"  | ||||
|   } else { | ||||
|     try { | ||||
|       Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool | ||||
|     } 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-Content -Path $PsHome\profile.ps1 -Value "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 | ||||
|   } | ||||
|   if($tool -eq "cs2pr") { | ||||
|     Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.bat"  | ||||
|     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  | ||||
|       Add-Extension ast  | ||||
|     } elseif($tool -eq "phive") { | ||||
|       Add-Extension xml  | ||||
|     } elseif($tool -eq "wp-cli") { | ||||
|       Copy-Item $php_dir\wp-cli.bat -Destination $php_dir\wp.bat | ||||
|     } | ||||
|   if (((Get-ChildItem -Path $php_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) { | ||||
|     Add-Log $tick $tool "Added" | ||||
|   } else { | ||||
|     Add-Log $cross $tool "Could not add $tool" | ||||
|   } | ||||
| } | ||||
|  | ||||
| Function Add-Composer-Tool() { | ||||
| Function Add-Composertool() { | ||||
|   Param ( | ||||
|     [Parameter(Position = 0, Mandatory = $true)] | ||||
|     [ValidateNotNull()] | ||||
| @ -142,17 +245,24 @@ Function Add-Composer-Tool() { | ||||
|     [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($?) { | ||||
|     $composer_dir = composer -q global config home | ForEach-Object { $_ -replace "/", "\" } | ||||
|     Add-Content -Path $PsHome\profile.ps1 -Value "New-Alias $tool $composer_dir\vendor\bin\$tool.bat" | ||||
|     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() { | ||||
| Function Add-Pecl() { | ||||
|   Add-Log $tick "PECL" "Use extensions input to setup PECL extensions on windows" | ||||
| } | ||||
|  | ||||
| @ -160,57 +270,57 @@ Function Add-PECL() { | ||||
| $tick = ([char]8730) | ||||
| $cross = ([char]10007) | ||||
| $php_dir = 'C:\tools\php' | ||||
| $ext_dir = $php_dir + '\ext' | ||||
| $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' | ||||
| $ts = $false | ||||
| if((Test-Path env:PHPTS) -and $env:PHPTS -eq 'ts') { | ||||
|   $ts = $true | ||||
| if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') { | ||||
|   $arch = 'x86' | ||||
| } | ||||
| $ts = $env:PHPTS -eq 'ts' | ||||
| if($env:PHPTS -ne 'ts') { | ||||
|   $env:PHPTS = 'nts' | ||||
| } | ||||
| if(-not(Test-Path -LiteralPath $current_profile)) { | ||||
|   New-Item -Path $current_profile -ItemType "file" -Force  | ||||
| } | ||||
|  | ||||
| Add-Printf  | ||||
| Step-Log "Setup PhpManager" | ||||
| Install-Module -Name PhpManager -Force -Scope CurrentUser | ||||
| Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php  | ||||
| Add-Log $tick "PhpManager" "Installed" | ||||
|  | ||||
| Step-Log "Setup PHP" | ||||
| $installed = $null | ||||
| if (Test-Path -LiteralPath $php_dir -PathType Container) { | ||||
|   try { | ||||
|     $installed = Get-Php -Path $php_dir | ||||
|   } catch { } | ||||
| } | ||||
|   catch { | ||||
|   } | ||||
| } | ||||
| Step-Log "Setup PHP" | ||||
| $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  | ||||
|   } | ||||
|   if ($version -eq $master_version) { | ||||
|     $version = 'master' | ||||
|   } | ||||
|  | ||||
|   try { | ||||
|     Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1 | ||||
|   } catch { } | ||||
| } else { | ||||
|   $updated = Update-Php $php_dir >$null 2>&1 | ||||
|   if($updated -eq $False) { | ||||
|   $status = "Found" | ||||
| } | ||||
| } | ||||
|  | ||||
| $installed = Get-Php -Path $php_dir | ||||
| Set-PhpIniKey -Key 'date.timezone' -Value 'UTC' -Path $php_dir | ||||
| Enable-PhpExtension -Extension openssl, curl, opcache -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') { | ||||
|   if($installed.ThreadSafe) { | ||||
|     Copy-Item $dir"\..\src\bin\php_ts_pcov.dll" -Destination $ext_dir"\php_pcov.dll" | ||||
|   } else { | ||||
|     Copy-Item $dir"\..\src\bin\php_pcov.dll" -Destination $ext_dir"\php_pcov.dll" | ||||
|   } | ||||
|   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)" | ||||
|  | ||||
							
								
								
									
										243
									
								
								src/tools.ts
									
									
									
									
									
								
							
							
						
						
									
										243
									
								
								src/tools.ts
									
									
									
									
									
								
							| @ -1,60 +1,21 @@ | ||||
| import * as utils from './utils'; | ||||
|  | ||||
| /** | ||||
|  * Function to get command to setup tool | ||||
|  * Function to get command to setup tools | ||||
|  * | ||||
|  * @param os_version | ||||
|  * @param suffix | ||||
|  */ | ||||
| export async function getArchiveCommand(os_version: string): Promise<string> { | ||||
| export async function getCommand( | ||||
|   os_version: string, | ||||
|   suffix: string | ||||
| ): Promise<string> { | ||||
|   switch (os_version) { | ||||
|     case 'linux': | ||||
|     case 'darwin': | ||||
|       return 'add_tool '; | ||||
|       return 'add_' + suffix + ' '; | ||||
|     case 'win32': | ||||
|       return 'Add-Tool '; | ||||
|     default: | ||||
|       return await utils.log( | ||||
|         'Platform ' + os_version + ' is not supported', | ||||
|         os_version, | ||||
|         'error' | ||||
|       ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function to get command to setup tools using composer | ||||
|  * | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function getPackageCommand(os_version: string): Promise<string> { | ||||
|   switch (os_version) { | ||||
|     case 'linux': | ||||
|     case 'darwin': | ||||
|       return 'add_composer_tool '; | ||||
|     case 'win32': | ||||
|       return 'Add-Composer-Tool '; | ||||
|     default: | ||||
|       return await utils.log( | ||||
|         'Platform ' + os_version + ' is not supported', | ||||
|         os_version, | ||||
|         'error' | ||||
|       ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Function to get command to setup PECL | ||||
|  * | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function getPECLCommand(os_version: string): Promise<string> { | ||||
|   switch (os_version) { | ||||
|     case 'linux': | ||||
|     case 'darwin': | ||||
|       return 'add_pecl '; | ||||
|     case 'win32': | ||||
|       return 'Add-PECL '; | ||||
|       return 'Add-' + suffix.charAt(0).toUpperCase() + suffix.slice(1) + ' '; | ||||
|     default: | ||||
|       return await utils.log( | ||||
|         'Platform ' + os_version + ' is not supported', | ||||
| @ -71,9 +32,12 @@ export async function getPECLCommand(os_version: string): Promise<string> { | ||||
|  */ | ||||
| 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-]+)*))?$/; | ||||
|   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): | ||||
|       return version; | ||||
|     default: | ||||
| @ -109,6 +73,8 @@ export async function parseTool( | ||||
| /** | ||||
|  * Function to get the url of tool with the given version | ||||
|  * | ||||
|  * @param tool | ||||
|  * @param extension | ||||
|  * @param version | ||||
|  * @param prefix | ||||
|  * @param version_prefix | ||||
| @ -134,76 +100,38 @@ export async function getUri( | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Helper function to get the codeception url | ||||
|  * | ||||
|  * @param version | ||||
|  * @param php_version | ||||
|  * @param suffix | ||||
|  */ | ||||
| export async function getCodeceptionUriBuilder( | ||||
|   version: string, | ||||
|   php_version: string, | ||||
|   suffix: string | ||||
| ): Promise<string> { | ||||
|   switch (true) { | ||||
|     case /^5\.6$|^7\.[0|1]$/.test(php_version): | ||||
|       return ['releases', version, suffix, 'codecept.phar'] | ||||
|         .filter(Boolean) | ||||
|         .join('/'); | ||||
|     case /^7\.[2-4]$/.test(php_version): | ||||
|     default: | ||||
|       return ['releases', version, '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> { | ||||
|   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): | ||||
|       return await getCodeceptionUriBuilder(version, php_version, 'php56'); | ||||
|     default: | ||||
|       return await getCodeceptionUriBuilder(version, php_version, 'php54'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Helper function to get script to setup phive | ||||
|  * | ||||
|  * @param tool | ||||
|  * @param version | ||||
|  * @param url | ||||
|  * @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 ( | ||||
|         (await getArchiveCommand(os_version)) + | ||||
|         (await getCommand(os_version, 'tool')) + | ||||
|         'https://phar.io/releases/phive.phar phive' | ||||
|       ); | ||||
|     default: | ||||
|       return ( | ||||
|         (await getArchiveCommand(os_version)) + | ||||
|         (await getCommand(os_version, 'tool')) + | ||||
|         'https://github.com/phar-io/phive/releases/download/' + | ||||
|         version + | ||||
|         '/phive-' + | ||||
| @ -214,20 +142,24 @@ export async function addPhive( | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function to get the PHPUnit url | ||||
|  * Function to get the phar url in domain/tool-version.phar format | ||||
|  * | ||||
|  * @param domain | ||||
|  * @param tool | ||||
|  * @param prefix | ||||
|  * @param version | ||||
|  */ | ||||
| export async function getPhpunitUrl( | ||||
| export async function getPharUrl( | ||||
|   domain: string, | ||||
|   tool: string, | ||||
|   prefix: string, | ||||
|   version: string | ||||
| ): Promise<string> { | ||||
|   const phpunit = 'https://phar.phpunit.de'; | ||||
|   switch (version) { | ||||
|     case 'latest': | ||||
|       return phpunit + '/' + tool + '.phar'; | ||||
|       return domain + '/' + tool + '.phar'; | ||||
|     default: | ||||
|       return phpunit + '/' + tool + '-' + version + '.phar'; | ||||
|       return domain + '/' + tool + '-' + prefix + version + '.phar'; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -283,22 +215,57 @@ export async function getSymfonyUri( | ||||
| /** | ||||
|  * Function to add/move composer in the tools list | ||||
|  * | ||||
|  * @param tools | ||||
|  * @param tools_list | ||||
|  */ | ||||
| export async function addComposer(tools_list: string[]): Promise<string[]> { | ||||
|   const regex = /^composer($|:.*)/; | ||||
|   const composer: string = tools_list.filter(tool => regex.test(tool))[0]; | ||||
|   switch (composer) { | ||||
|     case undefined: | ||||
|   const regex_any = /^composer($|:.*)/; | ||||
|   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 (true) { | ||||
|     case regex_composer1_tools.test(tools_list.join(' ')): | ||||
|       composer = 'composer:1'; | ||||
|       break; | ||||
|     case matches[0] == undefined: | ||||
|       break; | ||||
|     default: | ||||
|       tools_list = tools_list.filter(tool => !regex.test(tool)); | ||||
|       composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1'); | ||||
|       break; | ||||
|   } | ||||
|   tools_list.unshift('composer'); | ||||
|   tools_list.unshift(composer); | ||||
|   return tools_list; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function to get composer URL for a given version | ||||
|  * | ||||
|  * @param version | ||||
|  */ | ||||
| export async function getComposerUrl( | ||||
|   version: string, | ||||
|   php_version: string | ||||
| ): Promise<string> { | ||||
|   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 `${cache_url},https://getcomposer.org/composer-stable.phar`; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function to get Tools list after cleanup | ||||
|  * | ||||
| @ -313,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)]; | ||||
| @ -323,17 +293,15 @@ 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> { | ||||
|   return (await getArchiveCommand(os_version)) + url + ' ' + tool; | ||||
|   return (await getCommand(os_version, 'tool')) + url + ' ' + tool; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @ -385,14 +353,15 @@ export async function addPackage( | ||||
|   prefix: string, | ||||
|   os_version: string | ||||
| ): Promise<string> { | ||||
|   const tool_command = await getPackageCommand(os_version); | ||||
|   const tool_command = await getCommand(os_version, 'composertool'); | ||||
|   return tool_command + tool + ' ' + release + ' ' + prefix; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Setup tools | ||||
|  * | ||||
|  * @param tool_csv | ||||
|  * @param tools_csv | ||||
|  * @param php_version | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function addTools( | ||||
| @ -421,52 +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 = | ||||
|           github + 'composer/composer/releases/latest/download/composer.phar'; | ||||
|         script += await addArchive(tool, version, url, 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 getPhpunitUrl(tool, version); | ||||
|         script += await addArchive(tool, version, url, os_version); | ||||
|         url = await getPharUrl('https://phar.phpunit.de', tool, '', 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); | ||||
| @ -483,7 +448,7 @@ export async function addTools( | ||||
|         ); | ||||
|         break; | ||||
|       case 'pecl': | ||||
|         script += await getPECLCommand(os_version); | ||||
|         script += await getCommand(os_version, 'pecl'); | ||||
|         break; | ||||
|       case 'php-config': | ||||
|       case 'phpize': | ||||
| @ -493,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( | ||||
|  | ||||
							
								
								
									
										112
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								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'; | ||||
|       } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -65,7 +128,6 @@ export async function color(type: string): Promise<string> { | ||||
|  * @param message | ||||
|  * @param os_version | ||||
|  * @param log_type | ||||
|  * @param prefix | ||||
|  */ | ||||
| export async function log( | ||||
|   message: string, | ||||
| @ -121,6 +183,7 @@ export async function stepLog( | ||||
|  * @param mark | ||||
|  * @param subject | ||||
|  * @param message | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function addLog( | ||||
|   mark: string, | ||||
| @ -147,14 +210,8 @@ export async function addLog( | ||||
|  * Read the scripts | ||||
|  * | ||||
|  * @param filename | ||||
|  * @param version | ||||
|  * @param os_version | ||||
|  */ | ||||
| export async function readScript( | ||||
|   filename: string, | ||||
|   version: string, | ||||
|   os_version: string | ||||
| ): Promise<string> { | ||||
| export async function readScript(filename: string): Promise<string> { | ||||
|   return fs.readFileSync( | ||||
|     path.join(__dirname, '../src/scripts/' + filename), | ||||
|     'utf8' | ||||
| @ -165,7 +222,6 @@ export async function readScript( | ||||
|  * Write final script which runs | ||||
|  * | ||||
|  * @param filename | ||||
|  * @param version | ||||
|  * @param script | ||||
|  */ | ||||
| export async function writeScript( | ||||
| @ -196,8 +252,8 @@ export async function extensionArray( | ||||
|         .map(function (extension: string) { | ||||
|           return extension | ||||
|             .trim() | ||||
|             .replace('php-', '') | ||||
|             .replace('php_', ''); | ||||
|             .toLowerCase() | ||||
|             .replace(/^php[-_]/, ''); | ||||
|         }) | ||||
|         .filter(Boolean); | ||||
|   } | ||||
| @ -216,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); | ||||
|   } | ||||
| @ -230,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'; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -249,10 +305,10 @@ export async function getExtensionPrefix(extension: string): Promise<string> { | ||||
| export async function suppressOutput(os_version: string): Promise<string> { | ||||
|   switch (os_version) { | ||||
|     case 'win32': | ||||
|       return ' >$null 2>&1'; | ||||
|       return ' '; | ||||
|     case 'linux': | ||||
|     case 'darwin': | ||||
|       return ' >/dev/null 2>&1'; | ||||
|       return ' '; | ||||
|     default: | ||||
|       return await log( | ||||
|         'Platform ' + os_version + ' is not supported', | ||||
|  | ||||
| @ -1,63 +1,19 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     /* Basic Options */ | ||||
|     // "incremental": true,                   /* Enable incremental compilation */ | ||||
|     "target": "es6",                          /* 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"] | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								update.zip
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								update.zip
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user
	