Compare commits

..

5 Commits

Author SHA1 Message Date
975f42da8e Merge pull request #269 from shivammathur/develop
Hotfix
2020-08-08 16:53:35 +05:30
fae7892ed3 Change cURL opts 2020-08-08 15:45:40 +05:30
2a44b78bb8 Merge pull request #266 from shivammathur/develop
Hotfix
2020-08-04 22:00:38 +05:30
494d047fa5 Fix permissions in protoc setup 2020-08-04 21:37:52 +05:30
3ca32c6b64 Switch to exponential-backoff in cURL 2020-08-04 21:16:48 +05:30
95 changed files with 10548 additions and 15453 deletions

View File

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

View File

@ -8,7 +8,7 @@ Please note that this project is released with a [Contributor Code of Conduct](C
* Fork the project. * Fork the project.
* Make your bug fix or feature addition. * Make your bug fix or feature addition.
* Add tests for it, so we don't break it in a future version unintentionally. * Add tests for it. This is important so we don't break it in a future version unintentionally.
* If editing the scripts, create a demo integration test. * If editing the scripts, create a demo integration test.
* Send a pull request to the develop branch with all the details. * Send a pull request to the develop branch with all the details.
@ -18,6 +18,13 @@ Due to time constraints, you may not always get a quick response. Please do not
## Coding Guidelines ## Coding Guidelines
This project comes with `.prettierrc.json` and `eslintrc.json` configuration files. Please run the following commands to format the code before committing it.
```bash
$ npm run format
$ npm run lint
```
## Using setup-php from a Git checkout ## Using setup-php from a Git checkout
The following commands can be used to perform the initial checkout of setup-php: The following commands can be used to perform the initial checkout of setup-php:
@ -34,19 +41,6 @@ Install setup-php dependencies using [npm](https://www.npmjs.com/):
$ npm install $ npm install
``` ```
If you are using `Windows` configure `git` to handle line endings.
```cmd
git config --local core.autocrlf true
```
This project comes with `.prettierrc.json` and `eslintrc.json` configuration files. Please run the following commands to fix and verify the code quality.
```bash
$ npm run format
$ npm run lint
```
## Running the test suite ## Running the test suite
After following the steps shown above, The `setup-php` tests in the `__tests__` directory can be run using this command: After following the steps shown above, The `setup-php` tests in the `__tests__` directory can be run using this command:

5
.github/FUNDING.yml vendored
View File

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

View File

@ -11,7 +11,7 @@ assignees: 'shivammathur'
<!-- Please describe the bug concisely. --> <!-- Please describe the bug concisely. -->
**Version** **Version**
- [ ] I have checked releases, and the bug exists in the latest patch version of `v1` or `v2`. - [ ] I have checked releases and the bug exists in the latest patch version of `v1` or `v2`.
- [ ] `v2` - [ ] `v2`
- [ ] `v1` - [ ] `v1`

View File

@ -11,7 +11,7 @@ assignees: 'shivammathur'
<!-- Please describe concisely the feature you want to add. --> <!-- Please describe concisely the feature you want to add. -->
**Version** **Version**
- [ ] I have checked releases, and the feature is missing in the latest patch version of `v2`. - [ ] I have checked releases and the feature is missing in the latest patch version of `v2`.
**Underlying issue** **Underlying issue**
<!-- Please describe the issue this would solve. --> <!-- Please describe the issue this would solve. -->

View File

@ -5,12 +5,12 @@ labels: bug or enhancement
--- ---
## A Pull Request should be associated with a Discussion. ## A Pull Request should be associated with an Issue.
> If you're fixing a bug, adding a new feature or improving something please provide the details in discussions, > If you're fixing a bug, adding a new feature or improving something please provide the details in Issues,
> so that the development can be pointed in the intended direction. > so that the development can be pointed in the intended direction.
Related discussion: <!-- Please link the related discussion --> Related issue: <!-- Please link the related issue -->
> Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md) > Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md)
> Thank you for your contribution. > Thank you for your contribution.
@ -30,7 +30,7 @@ This PR [briefly explain what it does]
> In case this PR edits any scripts: > In case this PR edits any scripts:
- [ ] I have checked the edited scripts for syntax. - [ ] I have checked the edited scripts for syntax.
- [ ] I have tested the changes in an integration test (If yes, provide workflow YAML and link). - [ ] I have tested the changes in an integration test (If yes, provide workflow link).
<!-- <!--
- Please target the develop branch when submitting the pull request. - Please target the develop branch when submitting the pull request.

6
.github/SECURITY.md vendored
View File

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

View File

@ -1,77 +0,0 @@
name: Docs workflow
on:
workflow_dispatch:
schedule:
- cron: '0 15 * * 6'
jobs:
create:
name: Create
runs-on: ${{ matrix.operating-system }}
strategy:
fail-fast: false
matrix:
operating-system: [ubuntu-20.04, ubuntu-18.04, windows-2019, macos-10.15]
php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
- name: Save unix
env:
file: php${{ matrix.php-versions }}-${{ matrix.operating-system }}.md
version: ${{ matrix.php-versions }}
if: matrix.operating-system != 'windows-2019'
run: |
echo "## PHP $version" >> "$file"
printf "\n" >> "$file"
echo "\`\`\`" >> "$file"
php -m >> "$file"
echo "\`\`\`" >> "$file"
printf "\n" >> "$file"
- name: Save Windows
env:
file: php${{ matrix.php-versions }}-${{ matrix.operating-system }}.md
version: ${{ matrix.php-versions }}
if: matrix.operating-system == 'windows-2019'
run: |
Write-Output "## PHP ${{ matrix.php-versions }}`n" | Out-File -FilePath "$env:file"
Write-Output "``````" | Out-File -FilePath "$env:file" -Append
php -m | Out-File -FilePath "$env:file" -Append
Write-Output "```````n" | Out-File -FilePath "$env:file" -Append
- uses: actions/upload-artifact@v2
with:
name: lists
path: php${{ matrix.php-versions }}-${{ matrix.operating-system }}.md
update:
name: Update
needs: create
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
repository: ${{ github.repository }}.wiki
- uses: actions/download-artifact@v2
with:
path: ${{ github.workspace }}
- name: Combine
run: |
git config --local user.email "${{ secrets.email }}"
git config --local user.name "${{ github.repository_owner }}"
for os in ubuntu-20.04 ubuntu-18.04 windows-2019 macos-10.15 macos-11; do
echo "These are extensions which are loaded by default on the following PHP versions. More extensions which are available as packages and available on pecl are supported by setup-php. Refer to [php extension support](https://github.com/shivammathur/setup-php#heavy_plus_sign-php-extension-support) for more details." > Php-extensions-loaded-on-"$os".md
for version in 5.3 5.4 5.5 5.6 7.0 7.1 7.2 7.3 7.4 8.0 8.1 8.2; do
if [ "$os" = "macos-11" ]; then
cat lists/php"$version"-macos-10.15.md >> Php-extensions-loaded-on-"$os".md
else
cat lists/php"$version"-"$os".md >> Php-extensions-loaded-on-"$os".md
fi
done
done
rm -rf ./lists
if [ "$(git status --porcelain=v1 2>/dev/null | wc -l)" != "0" ]; then
git add .
git commit -m "Update PHP extensions on wiki - $(date +'%d-%m-%y')"
git push -f https://${{ github.repository_owner }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.wiki.git master || true
fi

View File

@ -28,10 +28,10 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup Node.js 15.x - name: Setup Node.js 12.x
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
node-version: 15.x node-version: 12.x
- name: Install dependencies - name: Install dependencies
run: npm install run: npm install
@ -48,4 +48,4 @@ jobs:
- name: Send Coverage - name: Send Coverage
continue-on-error: true continue-on-error: true
timeout-minutes: 1 timeout-minutes: 1
run: curl -s https://codecov.io/bash | bash -s -- -t ${{secrets.CODECOV_TOKEN}} -f coverage/lcov.info -n github-actions-codecov-${{ matrix.operating-system }} run: curl -s https://codecov.io/bash | bash -s -- -t ${{secrets.CODECOV_TOKEN}} -f coverage/clover.xml -n github-actions-codecov-${{ matrix.operating-system }}

View File

@ -24,8 +24,8 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
operating-system: [ubuntu-20.04, ubuntu-18.04, windows-latest, macos-latest] operating-system: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04, windows-latest, macos-latest]
php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2'] php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0']
env: env:
extensions: xml, opcache, xdebug, pcov extensions: xml, opcache, xdebug, pcov
key: cache-v3 key: cache-v3
@ -34,7 +34,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup cache environment - name: Setup cache environment
id: cache-env id: extcache
uses: shivammathur/cache-extensions@develop uses: shivammathur/cache-extensions@develop
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
@ -44,9 +44,9 @@ jobs:
- name: Cache extensions - name: Cache extensions
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.cache-env.outputs.dir }} path: ${{ steps.extcache.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }} key: ${{ steps.extcache.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }} restore-keys: ${{ steps.extcache.outputs.key }}
- name: Setup PHP with extensions and custom config - name: Setup PHP with extensions and custom config
run: node dist/index.js run: node dist/index.js

View File

@ -1,7 +1,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2019-2021 shivammathur and contributors Copyright (c) 2019-2020 shivammathur and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

827
README.md

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +1,52 @@
import * as config from '../src/config'; import * as config from '../src/config';
describe('Config tests', () => { describe('Config tests', () => {
it.each` it('checking addINIValuesOnWindows', async () => {
ini_values | os_version | output let win32: string = await config.addINIValues(
${'a=b, c=d'} | ${'win32'} | ${'Add-Content "$php_dir\\php.ini" "a=b\nc=d"'} 'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
${'a=b, c=d'} | ${'linux'} | ${'echo "a=b\nc=d" | sudo tee -a "${pecl_file:-${ini_file[@]}}"'} 'win32'
${'a=b, c=d'} | ${'darwin'} | ${'echo "a=b\nc=d" | sudo tee -a "${pecl_file:-${ini_file[@]}}"'} );
${'a=b & ~c'} | ${'win32'} | ${'Add-Content "$php_dir\\php.ini" "a=\'b & ~c\'"'} expect(win32).toContain(
${'a="~(b)"'} | ${'win32'} | ${'Add-Content "$php_dir\\php.ini" "a=\'~(b)\'"'} 'Add-Content "$php_dir\\php.ini" "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata"'
${'a="b, c"'} | ${'win32'} | ${'Add-Content "$php_dir\\php.ini" "a=b, c"'} );
${'a=b, c=d'} | ${'openbsd'} | ${'Platform openbsd is not supported'}
`( win32 = await config.addINIValues(
'checking addINIValues on $os_version', 'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
async ({ini_values, os_version, output}) => { 'fedora'
expect(await config.addINIValues(ini_values, os_version)).toContain( );
output expect(win32).toContain('Platform fedora is not supported');
); });
}
); it('checking addINIValuesOnLinux', async () => {
let linux: string = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'linux',
true
);
expect(linux).toContain(
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata"'
);
linux = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'fedora'
);
expect(linux).toContain('Platform fedora is not supported');
});
it('checking addINIValuesOnDarwin', async () => {
let darwin: string = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'darwin'
);
expect(darwin).toContain(
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata"'
);
darwin = await config.addINIValues(
'post_max_size=256M, short_open_tag=On, date.timezone=Asia/Kolkata',
'fedora'
);
expect(darwin).toContain('Platform fedora is not supported');
});
}); });

View File

@ -1,39 +1,90 @@
import * as coverage from '../src/coverage'; import * as coverage from '../src/coverage';
describe('Config tests', () => { describe('Config tests', () => {
it.each` it('checking addCoverage with PCOV on windows', async () => {
driver | php | os | output let win32: string = await coverage.addCoverage('PCOV', '7.4', 'win32');
${'PCOV'} | ${'7.4'} | ${'win32'} | ${'Add-Extension pcov,Disable-Extension xdebug false'} expect(win32).toContain('Add-Extension pcov');
${'pcov'} | ${'7.0'} | ${'win32'} | ${'PHP 7.1 or newer is required'} expect(win32).toContain('Remove-Extension xdebug');
${'pcov'} | ${'5.6'} | ${'win32'} | ${'PHP 7.1 or newer is required'}
${'pcov'} | ${'7.4'} | ${'win32'} | ${'Add-Extension pcov,Disable-Extension xdebug false'} win32 = await coverage.addCoverage('pcov', '7.0', 'win32');
${'pcov'} | ${'7.4'} | ${'linux'} | ${'add_extension pcov,disable_extension xdebug false'} expect(win32).toContain('PHP 7.1 or newer is required');
${'pcov'} | ${'7.4'} | ${'darwin'} | ${'add_brew_extension pcov,disable_extension xdebug false'}
${'xdebug'} | ${'7.4'} | ${'win32'} | ${'Add-Extension xdebug'} win32 = await coverage.addCoverage('pcov', '5.6', 'win32');
${'xdebug3'} | ${'7.4'} | ${'win32'} | ${'Add-Extension xdebug'} expect(win32).toContain('PHP 7.1 or newer is required');
${'xdebug2'} | ${'7.4'} | ${'win32'} | ${'Add-Extension xdebug stable 2.9.8'} });
${'xdebug'} | ${'8.0'} | ${'linux'} | ${'add_extension xdebug'}
${'xdebug3'} | ${'8.0'} | ${'linux'} | ${'add_extension xdebug'} it('checking addCoverage with PCOV on linux', async () => {
${'xdebug2'} | ${'7.4'} | ${'linux'} | ${'add_pecl_extension xdebug 2.9.8 zend_extension'} const linux: string = await coverage.addCoverage('pcov', '7.4', 'linux');
${'xdebug'} | ${'7.4'} | ${'darwin'} | ${'add_brew_extension xdebug'} expect(linux).toContain('add_extension pcov');
${'xdebug3'} | ${'7.4'} | ${'darwin'} | ${'add_brew_extension xdebug'} expect(linux).toContain('remove_extension xdebug');
${'xdebug2'} | ${'7.4'} | ${'darwin'} | ${'add_brew_extension xdebug2'} });
${'none'} | ${'7.4'} | ${'win32'} | ${'Disable-Extension xdebug false,Disable-Extension pcov false'}
${'none'} | ${'7.4'} | ${'linux'} | ${'disable_extension xdebug false,disable_extension pcov false'} it('checking addCoverage with PCOV on darwin', async () => {
${'none'} | ${'7.4'} | ${'darwin'} | ${'disable_extension xdebug false,disable_extension pcov false'} const darwin: string = await coverage.addCoverage('pcov', '7.4', 'darwin');
${'nocov'} | ${'7.x'} | ${'any'} | ${''} expect(darwin).toContain('add_extension pcov');
${''} | ${'7.x'} | ${'any'} | ${''} expect(darwin).toContain('remove_extension xdebug');
`( });
'checking addCoverage with $driver on $os',
async ({driver, php, os, output}) => { it('checking addCoverage with Xdebug on windows', async () => {
const script: string = await coverage.addCoverage(driver, php, os); const win32: string = await coverage.addCoverage('xdebug', '7.4', 'win32');
if (output) { expect(win32).toContain('Add-Extension xdebug');
output.split(',').forEach((command: string) => { });
expect(script).toContain(command);
}); it('checking addCoverage with Xdebug on linux', async () => {
} else { const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux');
expect(script).toEqual(output); expect(linux).toContain('add_extension xdebug');
} });
}
); it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '7.4', 'linux');
expect(linux).toContain('add_extension_from_source xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug on darwin', async () => {
const darwin: string = await coverage.addCoverage(
'xdebug',
'7.4',
'darwin'
);
expect(darwin).toContain('add_extension xdebug');
});
it('checking disableCoverage windows', async () => {
const win32 = await coverage.addCoverage('none', '7.4', 'win32');
expect(win32).toContain('Remove-Extension xdebug');
expect(win32).toContain('Remove-Extension pcov');
});
it('checking disableCoverage on linux', async () => {
const linux: string = await coverage.addCoverage('none', '7.4', 'linux');
expect(linux).toContain('remove_extension xdebug');
expect(linux).toContain('remove_extension pcov');
});
it('checking disableCoverage on darwin', async () => {
const darwin: string = await coverage.addCoverage('none', '7.4', 'darwin');
expect(darwin).toContain('remove_extension xdebug');
expect(darwin).toContain('remove_extension pcov');
});
it('checking no or invalid coverage driver', async () => {
let nocov: string = await coverage.addCoverage('nocov', '7.x', 'any');
expect(nocov).toEqual('');
nocov = await coverage.addCoverage('', '7.x', 'any');
expect(nocov).toEqual('');
});
}); });

View File

@ -3,33 +3,27 @@ import * as extensions from '../src/extensions';
describe('Extension tests', () => { describe('Extension tests', () => {
it('checking addExtensionOnWindows', async () => { it('checking addExtensionOnWindows', async () => {
let win32: string = await extensions.addExtension( let win32: string = await extensions.addExtension(
'none, Xdebug, pcov, sqlite, :intl, phalcon4, pecl_http, ioncube, oci8, pdo_oci, ast-beta, grpc-1.2.3, inotify-1.2.3alpha2, sqlsrv-1.2.3preview1', 'Xdebug, pcov, sqlite, :intl, phalcon4, ioncube, oci8, pdo_oci, ast-beta, grpc-1.2.3, inotify-1.2.3alpha2',
'7.4', '7.4',
'win32' 'win32'
); );
expect(win32).toContain('Disable-AllShared');
expect(win32).toContain('Add-Extension xdebug'); expect(win32).toContain('Add-Extension xdebug');
expect(win32).toContain('Add-Extension pcov'); expect(win32).toContain('Add-Extension pcov');
expect(win32).toContain('Add-Extension sqlite3'); expect(win32).toContain('Add-Extension sqlite3');
expect(win32).toContain('Disable-Extension intl'); expect(win32).toContain('Remove-Extension intl');
expect(win32).toContain('Add-Phalcon phalcon4'); expect(win32).toContain('Add-Phalcon phalcon4');
expect(win32).toContain('Add-Http');
expect(win32).toContain('Add-Ioncube'); expect(win32).toContain('Add-Ioncube');
expect(win32).toContain('Add-Oci oci8'); expect(win32).toContain('Add-OCI oci8');
expect(win32).toContain('Add-Oci pdo_oci'); expect(win32).toContain('Add-OCI pdo_oci');
expect(win32).toContain('Add-Extension ast beta'); expect(win32).toContain('Add-Extension ast beta');
expect(win32).toContain('Add-Extension grpc stable 1.2.3'); expect(win32).toContain('Add-Extension grpc stable 1.2.3');
expect(win32).toContain('Add-Extension inotify alpha 1.2.3'); expect(win32).toContain('Add-Extension inotify alpha 1.2.3');
expect(win32).toContain('Add-Extension sqlsrv devel 1.2.3');
win32 = await extensions.addExtension('pcov', '5.6', 'win32'); win32 = await extensions.addExtension('pcov', '5.6', 'win32');
expect(win32).toContain( expect(win32).toContain(
'Add-Log "$cross" "pcov" "pcov is not supported on PHP 5.6"' 'Add-Log "$cross" "pcov" "pcov is not supported on PHP 5.6"'
); );
win32 = await extensions.addExtension('xdebug2', '7.2', 'win32');
expect(win32).toContain('Add-Extension xdebug stable 2.9.8');
win32 = await extensions.addExtension('mysql', '7.4', 'win32'); win32 = await extensions.addExtension('mysql', '7.4', 'win32');
expect(win32).toContain('Add-Extension mysqli'); expect(win32).toContain('Add-Extension mysqli');
expect(win32).toContain('Add-Extension mysqlnd'); expect(win32).toContain('Add-Extension mysqlnd');
@ -52,35 +46,32 @@ describe('Extension tests', () => {
expect(win32).toContain('Add-Phalcon phalcon3'); expect(win32).toContain('Add-Phalcon phalcon3');
expect(win32).toContain('Add-Extension does_not_exist'); expect(win32).toContain('Add-Extension does_not_exist');
win32 = await extensions.addExtension('xdebug', '7.2', 'openbsd'); win32 = await extensions.addExtension('xdebug', '7.2', 'fedora');
expect(win32).toContain('Platform openbsd is not supported'); expect(win32).toContain('Platform fedora is not supported');
win32 = await extensions.addExtension('blackfire', '7.3', 'win32'); win32 = await extensions.addExtension('blackfire', '7.3', 'win32');
expect(win32).toContain('Add-Blackfire blackfire'); expect(win32).toContain('Add-Blackfire blackfire');
win32 = await extensions.addExtension('blackfire-1.31.0', '7.3', 'win32'); win32 = await extensions.addExtension('blackfire-1.31.0', '7.3', 'win32');
expect(win32).toContain('Add-Blackfire blackfire-1.31.0'); expect(win32).toContain('Add-Blackfire blackfire-1.31.0');
win32 = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'win32'
);
expect(win32).toContain(
'Add-Log "$cross" "mongodb-mongodb/mongo-php-driver@master" "mongodb-mongodb/mongo-php-driver@master is not supported on PHP 7.3"'
);
}); });
it('checking addExtensionOnLinux', async () => { it('checking addExtensionOnLinux', async () => {
let linux: string = await extensions.addExtension( let linux: string = await extensions.addExtension(
'none, Xdebug, pcov, sqlite, :intl, ast, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3', 'Xdebug, xdebug3, pcov, sqlite, :intl, ast, uopz, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3',
'7.4', '7.4',
'linux' 'linux'
); );
expect(linux).toContain('disable_all_shared'); expect(linux).toContain(
expect(linux).toContain('add_extension xdebug'); 'add_extension_from_source xdebug xdebug/xdebug master --enable-xdebug zend_extension'
expect(linux).toContain('add_extension sqlite3'); );
expect(linux).toContain('disable_extension intl'); expect(linux).toContain('sudo $debconf_fix apt-get install -y php7.4-pcov');
expect(linux).toContain(
'sudo $debconf_fix apt-get install -y php7.4-sqlite3'
);
expect(linux).toContain('remove_extension intl');
expect(linux).toContain('sudo $debconf_fix apt-get install -y php-ast');
expect(linux).toContain('sudo $debconf_fix apt-get install -y php-uopz');
expect(linux).toContain('add_unstable_extension ast beta extension'); expect(linux).toContain('add_unstable_extension ast beta extension');
expect(linux).toContain('add_pdo_extension mysql'); expect(linux).toContain('add_pdo_extension mysql');
expect(linux).toContain('add_pdo_extension odbc'); expect(linux).toContain('add_pdo_extension odbc');
@ -89,31 +80,23 @@ describe('Extension tests', () => {
'add_unstable_extension xdebug alpha zend_extension' 'add_unstable_extension xdebug alpha zend_extension'
); );
linux = await extensions.addExtension('xdebug3', '8.0', 'linux');
expect(linux).toContain(
'sudo $debconf_fix apt-get install -y php8.0-xdebug'
);
linux = await extensions.addExtension('pcov', '5.6', 'linux'); linux = await extensions.addExtension('pcov', '5.6', 'linux');
expect(linux).toContain( expect(linux).toContain(
'add_log "$cross" "pcov" "pcov is not supported on PHP 5.6"' 'add_log "$cross" "pcov" "pcov is not supported on PHP 5.6"'
); );
linux = await extensions.addExtension('gearman', '5.6', 'linux'); linux = await extensions.addExtension('gearman', '7.0', 'linux');
expect(linux).toContain('add_gearman'); expect(linux).toContain('add_gearman');
linux = await extensions.addExtension('gearman', '7.4', 'linux'); linux = await extensions.addExtension('gearman', '7.4', 'linux');
expect(linux).toContain('add_gearman'); expect(linux).toContain('add_gearman');
linux = await extensions.addExtension('couchbase', '5.6', 'linux'); linux = await extensions.addExtension('xdebug', '7.2', 'fedora');
expect(linux).toContain('add_couchbase'); expect(linux).toContain('Platform fedora is not supported');
linux = await extensions.addExtension('couchbase', '7.4', 'linux');
expect(linux).toContain('add_couchbase');
linux = await extensions.addExtension('pdo_cubrid', '7.0', 'linux');
expect(linux).toContain('add_cubrid pdo_cubrid');
linux = await extensions.addExtension('cubrid', '7.4', 'linux');
expect(linux).toContain('add_cubrid cubrid');
linux = await extensions.addExtension('xdebug2', '7.2', 'linux');
expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension');
linux = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(linux).toContain('Platform openbsd is not supported');
linux = await extensions.addExtension('phalcon3, phalcon4', '7.3', 'linux'); linux = await extensions.addExtension('phalcon3, phalcon4', '7.3', 'linux');
expect(linux).toContain('add_phalcon phalcon3'); expect(linux).toContain('add_phalcon phalcon3');
@ -122,15 +105,6 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('ioncube', '7.3', 'linux'); linux = await extensions.addExtension('ioncube', '7.3', 'linux');
expect(linux).toContain('add_ioncube'); expect(linux).toContain('add_ioncube');
linux = await extensions.addExtension('geos', '7.3', 'linux');
expect(linux).toContain('add_geos');
linux = await extensions.addExtension('pecl_http', '7.3', 'linux');
expect(linux).toContain('add_http');
linux = await extensions.addExtension('http-1.2.3', '7.3', 'linux');
expect(linux).toContain('add_http http-1.2.3');
linux = await extensions.addExtension('oci8, pdo_oci', '7.3', 'linux'); linux = await extensions.addExtension('oci8, pdo_oci', '7.3', 'linux');
expect(linux).toContain('add_oci oci8'); expect(linux).toContain('add_oci oci8');
expect(linux).toContain('add_oci pdo_oci'); expect(linux).toContain('add_oci pdo_oci');
@ -140,79 +114,33 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('blackfire-1.31.0', '7.3', 'linux'); linux = await extensions.addExtension('blackfire-1.31.0', '7.3', 'linux');
expect(linux).toContain('add_blackfire blackfire-1.31.0'); expect(linux).toContain('add_blackfire blackfire-1.31.0');
linux = await extensions.addExtension('intl-65.1', '5.6', 'linux');
expect(linux).toContain('add_intl intl-65.1');
linux = await extensions.addExtension('intl-67.1', '7.3', 'linux');
expect(linux).toContain('add_intl intl-67.1');
linux = await extensions.addExtension('intl-68.2', '8.0', 'linux');
expect(linux).toContain('add_intl intl-68.2');
linux = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'linux'
);
expect(linux).toContain(
'add_extension_from_source mongodb https://github.com mongodb mongo-php-driver master extension'
);
}); });
it('checking addExtensionOnDarwin', async () => { it('checking addExtensionOnDarwin', async () => {
let darwin: string = await extensions.addExtension( let darwin: string = await extensions.addExtension(
'none, amqp, apcu, expect, Xdebug, pcov, grpc, igbinary, imagick, imap, memcache, memcached, mongodb, msgpack, phalcon3, phalcon4, protobuf, psr, rdkafka, redis, ssh2, swoole, vips, yaml, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3', 'Xdebug, pcov, grpc, protobuf, swoole, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3',
'7.2', '7.2',
'darwin' 'darwin'
); );
expect(darwin).toContain('disable_all_shared'); expect(darwin).toContain('add_brew_extension xdebug');
expect(darwin).toContain('add_brew_extension amqp extension'); expect(darwin).toContain('add_brew_extension pcov');
expect(darwin).toContain('add_brew_extension apcu extension'); expect(darwin).toContain('add_brew_extension grpc');
expect(darwin).toContain('add_brew_extension expect extension'); expect(darwin).toContain('add_brew_extension protobuf');
expect(darwin).toContain('add_brew_extension xdebug zend_extension'); expect(darwin).toContain('add_brew_extension swoole');
expect(darwin).toContain('add_brew_extension pcov extension'); expect(darwin).toContain('pecl_install sqlite3');
expect(darwin).toContain('add_brew_extension grpc extension'); expect(darwin).toContain('remove_extension intl');
expect(darwin).toContain('add_brew_extension igbinary extension');
expect(darwin).toContain('add_brew_extension imagick extension');
expect(darwin).toContain('add_brew_extension imap extension');
expect(darwin).toContain('add_brew_extension memcache extension');
expect(darwin).toContain('add_brew_extension memcached extension');
expect(darwin).toContain('add_brew_extension mongodb extension');
expect(darwin).toContain('add_brew_extension msgpack extension');
expect(darwin).toContain('add_brew_extension phalcon3 extension');
expect(darwin).toContain('add_brew_extension phalcon4 extension');
expect(darwin).toContain('add_brew_extension protobuf extension');
expect(darwin).toContain('add_brew_extension psr extension');
expect(darwin).toContain('add_brew_extension rdkafka extension');
expect(darwin).toContain('add_brew_extension redis extension');
expect(darwin).toContain('add_brew_extension ssh2 extension');
expect(darwin).toContain('add_brew_extension swoole extension');
expect(darwin).toContain('add_brew_extension vips extension');
expect(darwin).toContain('add_brew_extension yaml extension');
expect(darwin).toContain('add_extension sqlite3');
expect(darwin).toContain('disable_extension intl');
expect(darwin).toContain('add_unstable_extension ast beta extension'); expect(darwin).toContain('add_unstable_extension ast beta extension');
expect(darwin).toContain('add_pecl_extension grpc 1.2.3 extension'); expect(darwin).toContain('add_pecl_extension grpc 1.2.3 extension');
darwin = await extensions.addExtension('couchbase', '5.6', 'darwin'); darwin = await extensions.addExtension('phalcon3', '7.0', 'darwin');
expect(darwin).toContain('add_couchbase'); expect(darwin).toContain('add_phalcon phalcon3');
darwin = await extensions.addExtension('couchbase', '7.3', 'darwin'); darwin = await extensions.addExtension('phalcon4', '7.3', 'darwin');
expect(darwin).toContain('add_couchbase'); expect(darwin).toContain('add_phalcon phalcon4');
darwin = await extensions.addExtension('ioncube', '7.3', 'darwin'); darwin = await extensions.addExtension('ioncube', '7.3', 'darwin');
expect(darwin).toContain('add_ioncube'); expect(darwin).toContain('add_ioncube');
darwin = await extensions.addExtension('geos', '7.3', 'darwin');
expect(darwin).toContain('add_geos');
darwin = await extensions.addExtension('pecl_http', '7.3', 'darwin');
expect(darwin).toContain('add_http');
darwin = await extensions.addExtension('http-1.2.3', '7.3', 'darwin');
expect(darwin).toContain('add_http http-1.2.3');
darwin = await extensions.addExtension('oci8, pdo_oci', '7.3', 'darwin'); darwin = await extensions.addExtension('oci8, pdo_oci', '7.3', 'darwin');
expect(darwin).toContain('add_oci oci8'); expect(darwin).toContain('add_oci oci8');
expect(darwin).toContain('add_oci pdo_oci'); expect(darwin).toContain('add_oci pdo_oci');
@ -234,11 +162,19 @@ describe('Extension tests', () => {
darwin = await extensions.addExtension('xdebug', '7.2', 'darwin'); darwin = await extensions.addExtension('xdebug', '7.2', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug'); expect(darwin).toContain('add_brew_extension xdebug');
darwin = await extensions.addExtension('xdebug2', '7.2', 'darwin'); darwin = await extensions.addExtension('redis', '5.6', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug2'); expect(darwin).toContain('pecl_install redis-2.2.8');
darwin = await extensions.addExtension('imagick', '5.5', 'darwin'); darwin = await extensions.addExtension('redis', '7.2', 'darwin');
expect(darwin).toContain('add_extension imagick'); expect(darwin).toContain('pecl_install redis');
darwin = await extensions.addExtension('imagick', '5.6', 'darwin');
expect(darwin).toContain('brew install pkg-config imagemagick');
expect(darwin).toContain('pecl_install imagick');
darwin = await extensions.addExtension('imagick', '7.4', 'darwin');
expect(darwin).toContain('brew install pkg-config imagemagick');
expect(darwin).toContain('pecl_install imagick');
darwin = await extensions.addExtension('blackfire', '7.3', 'darwin'); darwin = await extensions.addExtension('blackfire', '7.3', 'darwin');
expect(darwin).toContain('add_blackfire blackfire'); expect(darwin).toContain('add_blackfire blackfire');
@ -254,16 +190,7 @@ describe('Extension tests', () => {
); );
expect(darwin).toContain('add_extension does_not_exist'); expect(darwin).toContain('add_extension does_not_exist');
darwin = await extensions.addExtension('xdebug', '7.2', 'openbsd'); darwin = await extensions.addExtension('xdebug', '7.2', 'fedora');
expect(darwin).toContain('Platform openbsd is not supported'); expect(darwin).toContain('Platform fedora is not supported');
darwin = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'darwin'
);
expect(darwin).toContain(
'add_extension_from_source mongodb https://github.com mongodb mongo-php-driver master extension'
);
}); });
}); });

View File

@ -1,45 +1,64 @@
import * as install from '../src/install'; import * as install from '../src/install';
import * as utils from '../src/utils';
/** /**
* Mock install.ts * Mock install.ts
*/ */
jest.mock('../src/install', () => ({ jest.mock('../src/install', () => ({
getScript: jest build: jest.fn().mockImplementation(
.fn() async (
.mockImplementation( filename: string,
async ( version: string,
filename: string, os_version: string
version: string, ): Promise<string> => {
os_version: string const extension_csv: string = process.env['extensions'] || '';
): Promise<string> => { const ini_values_csv: string = process.env['ini-values'] || '';
const extension_csv: string = process.env['extensions'] || ''; const coverage_driver: string = process.env['coverage'] || '';
const ini_values_csv: string = process.env['ini-values'] || ''; let tools_csv: string = process.env['tools'] || '';
const coverage_driver: string = process.env['coverage'] || ''; const pecl: string = process.env['pecl'] || '';
let tools_csv: string = process.env['tools'] || ''; if (pecl == 'true') {
let script = 'initial script ' + filename + version + os_version; tools_csv = 'pecl, ' + tools_csv;
script += tools_csv ? 'add_tool' : '';
script += extension_csv ? 'install extensions' : '';
script += coverage_driver ? 'set coverage driver' : '';
script += ini_values_csv ? 'edit php.ini' : '';
return script;
} }
),
run: jest.fn().mockImplementation(async (): Promise<string> => { let script = 'initial script ' + filename + version + os_version;
const os_version: string = process.env['RUNNER_OS'] || ''; if (tools_csv) {
const version: string = await utils.parseVersion( script += 'add_tool';
await utils.getInput('php-version', true) }
); if (extension_csv) {
const tool = await utils.scriptTool(os_version); script += 'install extensions';
const filename = os_version + (await utils.scriptExtension(os_version)); }
return [ if (coverage_driver) {
await install.getScript(filename, version, os_version), script += 'set coverage driver';
tool, }
filename, if (ini_values_csv) {
version, script += 'edit php.ini';
__dirname }
].join(' ');
}) return script;
}
),
run: jest.fn().mockImplementation(
async (): Promise<string> => {
const os_version: string = process.env['RUNNER_OS'] || '';
let version: string = process.env['php-version'] || '';
version = version.length > 1 ? version.slice(0, 3) : version + '.0';
let script = '';
switch (os_version) {
case 'darwin':
case 'linux':
script = await install.build(os_version + '.sh', version, os_version);
script += 'bash script.sh ' + version + ' ' + __dirname;
break;
case 'win32':
script = await install.build(os_version + '.sh', version, os_version);
script += 'pwsh script.ps1 ' + version + ' ' + __dirname;
break;
default:
script += os_version + ' is not supported';
}
return script;
}
)
})); }));
/** /**
@ -74,13 +93,13 @@ describe('Install', () => {
let script: string = '' + (await install.run()); let script: string = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('pwsh win32.ps1 7.0 ' + __dirname); expect(script).toContain('pwsh script.ps1 7.0 ' + __dirname);
setEnv('7.3', 'win32', '', '', '', ''); setEnv('7.3', 'win32', '', '', '', '');
script = '' + (await install.run()); script = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('pwsh win32.ps1 7.3 ' + __dirname); expect(script).toContain('pwsh script.ps1 7.3 ' + __dirname);
setEnv('7.3', 'win32', 'a, b', 'a=b', 'x', ''); setEnv('7.3', 'win32', 'a, b', 'a=b', 'x', '');
@ -89,7 +108,7 @@ describe('Install', () => {
expect(script).toContain('install extensions'); expect(script).toContain('install extensions');
expect(script).toContain('edit php.ini'); expect(script).toContain('edit php.ini');
expect(script).toContain('set coverage driver'); expect(script).toContain('set coverage driver');
expect(script).toContain('pwsh win32.ps1 7.3 ' + __dirname); expect(script).toContain('pwsh script.ps1 7.3 ' + __dirname);
}); });
it('Test install on linux', async () => { it('Test install on linux', async () => {
@ -97,13 +116,7 @@ describe('Install', () => {
let script: string = '' + (await install.run()); let script: string = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('bash linux.sh 7.3 '); expect(script).toContain('bash script.sh 7.3 ');
setEnv('latest', 'linux', '', '', '', '');
script = '' + (await install.run());
expect(script).toContain('initial script');
expect(script).toContain('bash linux.sh 8.0 ');
setEnv('7.3', 'linux', 'a, b', 'a=b', 'x', 'phpunit'); setEnv('7.3', 'linux', 'a, b', 'a=b', 'x', 'phpunit');
@ -112,7 +125,7 @@ describe('Install', () => {
expect(script).toContain('install extensions'); expect(script).toContain('install extensions');
expect(script).toContain('edit php.ini'); expect(script).toContain('edit php.ini');
expect(script).toContain('set coverage driver'); expect(script).toContain('set coverage driver');
expect(script).toContain('bash linux.sh 7.3'); expect(script).toContain('bash script.sh 7.3');
expect(script).toContain('add_tool'); expect(script).toContain('add_tool');
}); });
@ -121,7 +134,7 @@ describe('Install', () => {
let script: string = '' + (await install.run()); let script: string = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('bash darwin.sh 7.3 ' + __dirname); expect(script).toContain('bash script.sh 7.3 ' + __dirname);
setEnv('7.3', 'darwin', 'a, b', 'a=b', 'x', ''); setEnv('7.3', 'darwin', 'a, b', 'a=b', 'x', '');
@ -130,7 +143,7 @@ describe('Install', () => {
expect(script).toContain('install extensions'); expect(script).toContain('install extensions');
expect(script).toContain('edit php.ini'); expect(script).toContain('edit php.ini');
expect(script).toContain('set coverage driver'); expect(script).toContain('set coverage driver');
expect(script).toContain('bash darwin.sh 7.3 ' + __dirname); expect(script).toContain('bash script.sh 7.3 ' + __dirname);
}); });
it('Test malformed version inputs', async () => { it('Test malformed version inputs', async () => {
@ -138,24 +151,18 @@ describe('Install', () => {
let script: string = '' + '' + (await install.run()); let script: string = '' + '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('bash darwin.sh 7.4 ' + __dirname); expect(script).toContain('bash script.sh 7.4 ' + __dirname);
setEnv(8.0, 'darwin', '', '', '', ''); setEnv(8.0, 'darwin', '', '', '', '');
script = '' + (await install.run()); script = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('bash darwin.sh 8.0 ' + __dirname); expect(script).toContain('bash script.sh 8.0 ' + __dirname);
setEnv(8, 'darwin', '', '', '', ''); setEnv(8, 'darwin', '', '', '', '');
script = '' + (await install.run()); script = '' + (await install.run());
expect(script).toContain('initial script'); expect(script).toContain('initial script');
expect(script).toContain('bash darwin.sh 8.0 ' + __dirname); expect(script).toContain('bash script.sh 8.0 ' + __dirname);
setEnv(8.1, 'darwin', '', '', '', '');
script = '' + (await install.run());
expect(script).toContain('initial script');
expect(script).toContain('bash darwin.sh 8.1 ' + __dirname);
}); });
}); });

View File

@ -0,0 +1,41 @@
import * as io from '@actions/io';
import * as matchers from '../src/matchers';
jest.mock('@actions/io');
describe('Matchers', () => {
it('Add matchers', async () => {
process.env['RUNNER_TOOL_CACHE'] = __dirname;
await matchers.addMatchers();
const spy = jest.spyOn(io, 'cp');
expect(spy).toHaveBeenCalledTimes(2);
});
it('Test PHPUnit 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);
});
it('Test PHP Regex', async () => {
const regex1 = /^(.*error):\s+\s+(.+) in (.+) on line (\d+)$/;
const regex2 = /^(.*Warning|.*Deprecated|.*Notice):\s+\s+(.+) in (.+) on line (\d+)$/;
expect(
regex1.test('PHP Parse error: error_message in file.php on line 10')
).toBe(true);
expect(
regex2.test('PHP Notice: info_message in file.php on line 10')
).toBe(true);
expect(
regex2.test('PHP Warning: warning_message in file.php on line 10')
).toBe(true);
expect(
regex2.test('PHP Deprecated: deprecated_message in file.php on line 10')
).toBe(true);
});
});

File diff suppressed because it is too large Load Diff

View File

@ -17,69 +17,23 @@ async function cleanup(path: string): Promise<void> {
} }
describe('Utils tests', () => { describe('Utils tests', () => {
it('checking readEnv', async () => {
process.env['test'] = 'setup-php';
process.env['test-hyphen'] = 'setup-php';
expect(await utils.readEnv('test')).toBe('setup-php');
expect(await utils.readEnv('TEST')).toBe('setup-php');
expect(await utils.readEnv('test_hyphen')).toBe('setup-php');
expect(await utils.readEnv('TEST_HYPHEN')).toBe('setup-php');
expect(await utils.readEnv('undefined')).toBe('');
});
it('checking getInput', async () => { it('checking getInput', async () => {
process.env['test'] = 'setup-php'; process.env['test'] = 'setup-php';
process.env['undefined'] = '';
expect(await utils.getInput('test', false)).toBe('setup-php'); expect(await utils.getInput('test', false)).toBe('setup-php');
expect(await utils.getInput('undefined', false)).toBe('');
expect(await utils.getInput('setup-php', false)).toBe('setup-php'); expect(await utils.getInput('setup-php', false)).toBe('setup-php');
expect(await utils.getInput('DoesNotExist', false)).toBe(''); expect(await utils.getInput('DoesNotExist', false)).toBe('');
await expect(async () => {
await utils.getInput('DoesNotExist', true);
}).rejects.toThrow('Input required and not supplied: DoesNotExist');
});
it('checking fetch', async () => {
const manifest = await utils.getManifestURL();
let response: Record<string, string> = await utils.fetch(manifest);
expect(response.error).toBe(undefined);
expect(response.data).toContain('latest');
response = await utils.fetch(manifest, 'invalid_token');
expect(response.error).not.toBe(undefined);
expect(response.data).toBe(undefined);
});
it('checking getManifestURL', async () => {
expect(await utils.getManifestURL()).toContain('php-versions.json');
});
it('checking parseVersion', async () => {
jest
.spyOn(utils, 'fetch')
.mockImplementation(
async (url, token?): Promise<Record<string, string>> => {
if (!token || token === 'valid_token') {
return {data: `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`};
} else {
return {error: 'Invalid token'};
}
}
);
expect(await utils.parseVersion('latest')).toBe('8.0');
expect(await utils.parseVersion('7')).toBe('7.0');
expect(await utils.parseVersion('7.4')).toBe('7.4');
expect(await utils.parseVersion('5.x')).toBe('5.6');
expect(await utils.parseVersion('4.x')).toBe(undefined);
}); });
it('checking asyncForEach', async () => { it('checking asyncForEach', async () => {
const array: Array<string> = ['a', 'b', 'c']; const array: Array<string> = ['a', 'b', 'c'];
let concat = ''; let concat = '';
await utils.asyncForEach( await utils.asyncForEach(array, async function (
array, str: string
async function (str: string): Promise<void> { ): Promise<void> {
concat += str; concat += str;
} });
);
expect(concat).toBe('abc'); expect(concat).toBe('abc');
}); });
@ -90,7 +44,7 @@ describe('Utils tests', () => {
expect(await utils.color('warning')).toBe('33'); expect(await utils.color('warning')).toBe('33');
}); });
it('checking readFile', async () => { it('checking readScripts', async () => {
const darwin: string = fs.readFileSync( const darwin: string = fs.readFileSync(
path.join(__dirname, '../src/scripts/darwin.sh'), path.join(__dirname, '../src/scripts/darwin.sh'),
'utf8' 'utf8'
@ -103,12 +57,12 @@ describe('Utils tests', () => {
path.join(__dirname, '../src/scripts/win32.ps1'), path.join(__dirname, '../src/scripts/win32.ps1'),
'utf8' 'utf8'
); );
expect(await utils.readFile('darwin.sh', 'src/scripts')).toBe(darwin); expect(await utils.readScript('darwin.sh')).toBe(darwin);
expect(await utils.readFile('darwin.sh', 'src/scripts')).toBe(darwin); expect(await utils.readScript('darwin.sh')).toBe(darwin);
expect(await utils.readFile('linux.sh', 'src/scripts')).toBe(linux); expect(await utils.readScript('linux.sh')).toBe(linux);
expect(await utils.readFile('linux.sh', 'src/scripts')).toBe(linux); expect(await utils.readScript('linux.sh')).toBe(linux);
expect(await utils.readFile('win32.ps1', 'src/scripts')).toBe(win32); expect(await utils.readScript('win32.ps1')).toBe(win32);
expect(await utils.readFile('win32.ps1', 'src/scripts')).toBe(win32); expect(await utils.readScript('win32.ps1')).toBe(win32);
}); });
it('checking writeScripts', async () => { it('checking writeScripts', async () => {
@ -116,19 +70,22 @@ describe('Utils tests', () => {
const runner_dir: string = process.env['RUNNER_TOOL_CACHE'] || ''; const runner_dir: string = process.env['RUNNER_TOOL_CACHE'] || '';
const script_path: string = path.join(runner_dir, 'test.sh'); const script_path: string = path.join(runner_dir, 'test.sh');
await utils.writeScript('test.sh', testString); await utils.writeScript('test.sh', testString);
await fs.readFile( await fs.readFile(script_path, function (
script_path, error: Error | null,
function (error: Error | null, data: Buffer) { data: Buffer
expect(testString).toBe(data.toString()); ) {
} expect(testString).toBe(data.toString());
); });
await cleanup(script_path); await cleanup(script_path);
}); });
it('checking extensionArray', async () => { it('checking extensionArray', async () => {
expect( expect(await utils.extensionArray('a, b, php_c, php-d')).toEqual([
await utils.extensionArray('a, :b, php_c, none, php-d, Zend e, :Zend f') 'a',
).toEqual(['none', 'a', ':b', 'c', 'd', 'e', ':f']); 'b',
'c',
'd'
]);
expect(await utils.extensionArray('')).toEqual([]); expect(await utils.extensionArray('')).toEqual([]);
expect(await utils.extensionArray(' ')).toEqual([]); expect(await utils.extensionArray(' ')).toEqual([]);
@ -140,20 +97,6 @@ describe('Utils tests', () => {
'b=2', 'b=2',
'c=3' 'c=3'
]); ]);
expect(await utils.CSVArray('\'a=1,2\', "b=3, 4", c=5, d=~e~')).toEqual([
'a=1,2',
'b=3, 4',
'c=5',
"d='~e~'"
]);
expect(await utils.CSVArray('a=\'1,2\', b="3, 4", c=5')).toEqual([
'a=1,2',
'b=3, 4',
'c=5'
]);
expect(
await utils.CSVArray('a=E_ALL, b=E_ALL & ~ E_ALL, c="E_ALL", d=\'E_ALL\'')
).toEqual(['a=E_ALL', 'b=E_ALL & ~ E_ALL', 'c=E_ALL', 'd=E_ALL']);
expect(await utils.CSVArray('')).toEqual([]); expect(await utils.CSVArray('')).toEqual([]);
expect(await utils.CSVArray(' ')).toEqual([]); expect(await utils.CSVArray(' ')).toEqual([]);
}); });
@ -188,8 +131,8 @@ describe('Utils tests', () => {
expect(step_log).toEqual('step_log "Test message"'); expect(step_log).toEqual('step_log "Test message"');
step_log = await utils.stepLog(message, 'darwin'); step_log = await utils.stepLog(message, 'darwin');
expect(step_log).toEqual('step_log "Test message"'); expect(step_log).toEqual('step_log "Test message"');
step_log = await utils.stepLog(message, 'openbsd'); step_log = await utils.stepLog(message, 'fedora');
expect(step_log).toContain('Platform openbsd is not supported'); expect(step_log).toContain('Platform fedora is not supported');
let add_log: string = await utils.addLog( let add_log: string = await utils.addLog(
'tick', 'tick',
@ -202,8 +145,8 @@ describe('Utils tests', () => {
expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"');
add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'darwin'); add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'darwin');
expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"'); expect(add_log).toEqual('add_log "tick" "xdebug" "enabled"');
add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'openbsd'); add_log = await utils.addLog('tick', 'xdebug', 'enabled', 'fedora');
expect(add_log).toContain('Platform openbsd is not supported'); expect(add_log).toContain('Platform fedora is not supported');
}); });
it('checking getExtensionPrefix', async () => { it('checking getExtensionPrefix', async () => {
@ -220,8 +163,8 @@ describe('Utils tests', () => {
expect(await utils.suppressOutput('win32')).toEqual(' >$null 2>&1'); expect(await utils.suppressOutput('win32')).toEqual(' >$null 2>&1');
expect(await utils.suppressOutput('linux')).toEqual(' >/dev/null 2>&1'); expect(await utils.suppressOutput('linux')).toEqual(' >/dev/null 2>&1');
expect(await utils.suppressOutput('darwin')).toEqual(' >/dev/null 2>&1'); expect(await utils.suppressOutput('darwin')).toEqual(' >/dev/null 2>&1');
expect(await utils.suppressOutput('openbsd')).toContain( expect(await utils.suppressOutput('fedora')).toContain(
'Platform openbsd is not supported' 'Platform fedora is not supported'
); );
}); });
@ -231,15 +174,6 @@ describe('Utils tests', () => {
); );
}); });
it('checking getCommand', async () => {
expect(await utils.getCommand('linux', 'tool')).toBe('add_tool ');
expect(await utils.getCommand('darwin', 'tool')).toBe('add_tool ');
expect(await utils.getCommand('win32', 'tool')).toBe('Add-Tool ');
expect(await utils.getCommand('openbsd', 'tool')).toContain(
'Platform openbsd is not supported'
);
});
it('checking joins', async () => { it('checking joins', async () => {
expect(await utils.joins('a', 'b', 'c')).toBe('a b c'); expect(await utils.joins('a', 'b', 'c')).toBe('a b c');
}); });
@ -248,57 +182,8 @@ describe('Utils tests', () => {
expect(await utils.scriptExtension('linux')).toBe('.sh'); expect(await utils.scriptExtension('linux')).toBe('.sh');
expect(await utils.scriptExtension('darwin')).toBe('.sh'); expect(await utils.scriptExtension('darwin')).toBe('.sh');
expect(await utils.scriptExtension('win32')).toBe('.ps1'); expect(await utils.scriptExtension('win32')).toBe('.ps1');
expect(await utils.scriptExtension('openbsd')).toContain( expect(await utils.scriptExtension('fedora')).toContain(
'Platform openbsd is not supported' 'Platform fedora is not supported'
);
});
it('checking scriptTool', async () => {
expect(await utils.scriptTool('linux')).toBe('bash');
expect(await utils.scriptTool('darwin')).toBe('bash');
expect(await utils.scriptTool('win32')).toBe('pwsh');
expect(await utils.scriptTool('openbsd')).toContain(
'Platform openbsd is not supported'
);
});
it('checking customPackage', async () => {
const script_path: string = path.join('ext', 'pkg.sh');
expect(await utils.customPackage('pkg', 'ext', '1.2.3', 'linux')).toContain(
script_path + '\nadd_pkg 1.2.3'
);
expect(
await utils.customPackage('pdo_pkg', 'ext', '1.2.3', 'linux')
).toContain(script_path + '\nadd_pkg 1.2.3');
expect(
await utils.customPackage('pkg8', 'ext', '1.2.3', 'linux')
).toContain(script_path + '\nadd_pkg 1.2.3');
});
it('checking parseExtensionSource', async () => {
expect(
await utils.parseExtensionSource(
'ext-org-name/repo-name@release',
'extension'
)
).toContain(
'\nadd_extension_from_source ext https://github.com org-name repo-name release extension'
);
expect(
await utils.parseExtensionSource(
'ext-https://sub.domain.tld/org/repo@release',
'extension'
)
).toContain(
'\nadd_extension_from_source ext https://sub.domain.tld org repo release extension'
);
expect(
await utils.parseExtensionSource(
'ext-https://sub.domain.XN--tld/org/repo@release',
'extension'
)
).toContain(
'\nadd_extension_from_source ext https://sub.domain.XN--tld org repo release extension'
); );
}); });
}); });

View File

@ -1,13 +1,13 @@
name: 'Setup PHP Action' name: 'Setup PHP Action'
author: shivammathur author: shivammathur
description: 'GitHub Action for PHP' description: 'Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer'
branding: branding:
color: 'purple' color: 'purple'
icon: 'play-circle' icon: 'play-circle'
inputs: inputs:
php-version: php-version:
description: 'Setup PHP version.' description: 'Setup PHP version.'
default: '8.0' default: '7.4'
required: true required: true
extensions: extensions:
description: 'Setup PHP extensions.' description: 'Setup PHP extensions.'
@ -21,9 +21,6 @@ inputs:
tools: tools:
description: 'Setup popular tools globally.' description: 'Setup popular tools globally.'
required: false required: false
outputs:
php-version:
description: 'PHP version in semver format'
runs: runs:
using: 'node12' using: 'node12'
main: 'dist/index.js' main: 'dist/index.js'

5450
dist/index.js vendored

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -25,7 +25,7 @@ jobs:
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
extensions: blackfire extensions: blackfire
tools: blackfire #Setup Blackfire cli tools: blackfire #Setup Blackfire client and agent
coverage: none coverage: none
- name: Profile - name: Profile
run: blackfire run php my-script.php # Refer to https://blackfire.io/docs/cookbooks/profiling-cli run: blackfire run php my-script.php # Refer to https://blackfire.io/docs/cookbooks/profiling-cli

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -26,32 +26,30 @@ jobs:
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
tools: phpunit-bridge
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql
coverage: xdebug #optional coverage: xdebug #optional
- name: Start mysql service - name: Start mysql service
run: sudo /etc/init.d/mysql start run: sudo /etc/init.d/mysql start
- name: Get composer cache directory - name: Get composer cache directory
id: composer-cache id: composercache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composercache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies - name: Install Composer dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader run: |
composer install --no-progress --prefer-dist --optimize-autoloader
- name: Run Migration - name: Run Migration
run: | run: |
composer require --dev symfony/orm-pack composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed" php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed" php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env: env:
DATABASE_URL: mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony DATABASE_URL: mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony
- name: Install PHPUnit - name: Run Tests
run: simple-phpunit install run: php bin/phpunit --coverage-text
- name: Run tests
run: simple-phpunit --coverage-text

View File

@ -26,30 +26,28 @@ jobs:
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
tools: phpunit-bridge
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, pgsql extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, pgsql
coverage: xdebug #optional coverage: xdebug #optional
- name: Get composer cache directory - name: Get composer cache directory
id: composer-cache id: composercache
run: echo "::set-output name=dir::$(composer config cache-files-dir)" run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies - name: Cache composer dependencies
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composercache.outputs.dir }}
# Use composer.json for key, if composer.lock is not committed. # Use composer.json for key, if composer.lock is not committed.
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer- restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies - name: Install Composer dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader run: |
composer install --no-progress --prefer-dist --optimize-autoloader
- name: Run Migration - name: Run Migration
run: | run: |
composer require --dev symfony/orm-pack composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed" php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed" php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env: env:
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:${{ job.services.postgres.ports[5432] }}/postgres?charset=UTF-8 DATABASE_URL: postgres://postgres:postgres@127.0.0.1:${{ job.services.postgres.ports[5432] }}/postgres?charset=UTF-8
- name: Install PHPUnit - name: Run Tests
run: simple-phpunit install run: php bin/phpunit --coverage-text
- name: Run tests
run: simple-phpunit --coverage-text

View File

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

View File

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

View File

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

View File

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

12424
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +1,15 @@
{ {
"name": "setup-php", "name": "setup-php",
"version": "2.14.0", "version": "2.4.1",
"private": false, "private": false,
"description": "Setup PHP for use with GitHub Actions", "description": "Setup PHP for use with GitHub Actions",
"main": "lib/install.js", "main": "dist/index.js",
"types": "lib/install.d.ts",
"directories": {
"lib": "lib",
"test": "__tests__",
"src": "src"
},
"files": [
"lib",
"src"
],
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"lint": "eslint **/src/*.ts --cache --fix", "lint": "eslint **/*.ts --cache",
"format": "prettier --write **/src/*.ts && git add .", "format": "prettier --write **/*.ts && git add .",
"format-check": "prettier --check **/src/*.ts", "format-check": "prettier --check **/*.ts",
"release": "ncc build -o dist && git add -f dist/", "release": "ncc build src/install.ts -o dist && git add -f dist/",
"test": "jest" "test": "jest"
}, },
"repository": { "repository": {
@ -34,31 +24,29 @@
"author": "shivammathur", "author": "shivammathur",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.5.0", "@actions/core": "^1.2.4",
"@actions/exec": "^1.1.0", "@actions/exec": "^1.0.4",
"@actions/io": "^1.1.1", "@actions/http-client": "^1.0.8",
"@actions/io": "^1.0.2",
"fs": "0.0.1-security" "fs": "0.0.1-security"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^27.0.1", "@types/jest": "^26.0.8",
"@types/node": "^16.9.1", "@types/node": "^14.0.27",
"@typescript-eslint/eslint-plugin": "^4.31.0", "@typescript-eslint/eslint-plugin": "^3.7.1",
"@typescript-eslint/parser": "^4.31.0", "@typescript-eslint/parser": "^3.7.1",
"@vercel/ncc": "^0.31.0", "@zeit/ncc": "^0.22.3",
"eslint": "^7.32.0", "eslint": "^7.6.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^6.11.0",
"eslint-plugin-import": "^2.24.2", "eslint-plugin-import": "^2.22.0",
"eslint-plugin-jest": "^24.4.0", "eslint-plugin-jest": "^23.20.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^3.1.4",
"husky": "^4.3.8", "husky": "^4.2.5",
"jest": "^27.1.1", "jest": "^26.2.2",
"jest-circus": "^27.1.1", "jest-circus": "^26.2.2",
"prettier": "^2.4.0", "prettier": "^2.0.5",
"ts-jest": "^27.0.5", "ts-jest": "^26.1.4",
"typescript": "^4.4.3" "typescript": "^3.9.7"
},
"bugs": {
"url": "https://github.com/shivammathur/setup-php/issues"
}, },
"husky": { "husky": {
"skipCI": true, "skipCI": true,

View File

@ -14,12 +14,7 @@ export async function addINIValuesUnix(
script += script +=
'\n' + (await utils.addLog('$tick', line, 'Added to php.ini', 'linux')); '\n' + (await utils.addLog('$tick', line, 'Added to php.ini', 'linux'));
}); });
return ( return 'echo "' + ini_values.join('\n') + '" >> $ini_file' + script;
'echo "' +
ini_values.join('\n') +
'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1' +
script
);
} }
/** /**

View File

@ -1,17 +0,0 @@
8,jessie
9,stretch
10,buster
11,bullseye
12,bookworm
16.04 LTS,xenial
16.10,yakkety
17.04,zesty
17.10,artful
18.04 LTS,bionic
18.10,cosmic
19.04,disco
19.10,eoan
20.04 LTS,focal
20.10,groovy
21.04,hirsute
21.10,impish
1 8 jessie
2 9 stretch
3 10 buster
4 11 bullseye
5 12 bookworm
6 16.04 LTS xenial
7 16.10 yakkety
8 17.04 zesty
9 17.10 artful
10 18.04 LTS bionic
11 18.10 cosmic
12 19.04 disco
13 19.10 eoan
14 20.04 LTS focal
15 20.10 groovy
16 21.04 hirsute
17 21.10 impish

View File

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

View File

@ -1,236 +0,0 @@
{
"composer-normalize": {
"type": "phar",
"repository": "ergebnis/composer-normalize",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-V"
},
"cs2pr": {
"type": "phar",
"repository": "staabm/annotate-pull-request-from-checkstyle",
"extension": "",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-V"
},
"infection": {
"type": "phar",
"repository": "infection/infection",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-V"
},
"phan": {
"type": "phar",
"repository": "phan/phan",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-v"
},
"php-cs-fixer": {
"type": "phar",
"repository": "FriendsOfPHP/PHP-CS-Fixer",
"extension": ".phar",
"domain": "https://github.com",
"fetch_latest": "true",
"version_prefix": "v",
"version_parameter": "-V"
},
"phpcbf": {
"type": "phar",
"repository": "squizlabs/PHP_CodeSniffer",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "--version"
},
"phpcs": {
"type": "phar",
"repository": "squizlabs/PHP_CodeSniffer",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "--version"
},
"phpmd": {
"type": "phar",
"repository": "phpmd/phpmd",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "--version"
},
"phpstan": {
"type": "phar",
"repository": "phpstan/phpstan",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-V"
},
"psalm": {
"type": "phar",
"repository": "vimeo/psalm",
"extension": ".phar",
"domain": "https://github.com",
"version_prefix": "",
"version_parameter": "-v"
},
"behat": {
"type": "composer",
"repository": "behat/behat"
},
"codeception": {
"type": "composer",
"repository": "codeception/codeception"
},
"automatic-composer-prefetcher": {
"type": "composer",
"alias": "composer-prefetcher",
"repository": "narrowspark/automatic-composer-prefetcher"
},
"composer-require-checker": {
"type": "composer",
"repository": "maglnet/composer-require-checker"
},
"composer-unused": {
"type": "composer",
"repository": "icanhazstring/composer-unused"
},
"flex": {
"type": "composer",
"repository": "symfony/flex"
},
"phinx": {
"type": "composer",
"repository": "robmorgan/phinx"
},
"phplint": {
"type": "composer",
"repository": "overtrue/phplint"
},
"phpspec": {
"type": "composer",
"repository": "phpspec/phpspec"
},
"phpunit-bridge": {
"alias": "simple-phpunit",
"type": "composer",
"repository": "symfony/phpunit-bridge"
},
"prestissimo": {
"type": "composer",
"repository": "hirak/prestissimo"
},
"vapor-cli": {
"type": "composer",
"alias": "vapor",
"repository": "laravel/vapor-cli"
},
"blackfire": {
"type": "custom-package",
"alias": "blackfire-agent"
},
"grpc_php_plugin": {
"type": "custom-package",
"repository": "grpc/grpc",
"domain": "https://github.com",
"version_prefix": "v"
},
"protoc": {
"type": "custom-package",
"repository": "protocolbuffers/protobuf",
"domain": "https://github.com",
"version_prefix": "v"
},
"blackfire-player": {
"type": "custom-function",
"domain": "https://get.blackfire.io",
"function": "blackfire_player",
"version_prefix": "v",
"version_parameter": "-V"
},
"composer": {
"type": "custom-function",
"domain": "https://getcomposer.org",
"repository": "composer/composer",
"function": "composer"
},
"deployer": {
"type": "custom-function",
"domain": "https://deployer.org",
"repository": "deployphp/deployer",
"function": "deployer",
"version_prefix": "v",
"version_parameter": "-V"
},
"pecl": {
"type": "custom-function",
"function": "pecl"
},
"phing": {
"type": "custom-function",
"domain": "https://www.phing.info",
"repository": "phingofficial/phing",
"function": "phing",
"extension": ".phar",
"version_prefix": "",
"version_parameter": "-v"
},
"phive": {
"type": "custom-function",
"repository": "phar-io/phive",
"domain": "https://phar.io",
"function": "phive",
"version_prefix": "",
"version_parameter": "status"
},
"phpcpd": {
"type": "custom-function",
"repository": "sebastianbergmann/phpcpd",
"domain": "https://phar.phpunit.de",
"function": "phpcpd",
"version_prefix": "",
"version_parameter": "--version"
},
"phpunit": {
"type": "custom-function",
"repository": "sebastianbergmann/phpunit",
"domain": "https://phar.phpunit.de",
"function": "phpcpd",
"version_prefix": "",
"version_parameter": "--version"
},
"phpize": {
"type": "custom-function",
"function": "dev_tools",
"alias": "php-config"
},
"php-config": {
"type": "custom-function",
"function": "dev_tools"
},
"symfony-cli": {
"type": "custom-function",
"function": "symfony",
"alias": "symfony",
"domain": "https://github.com",
"repository": "symfony/cli",
"version_prefix": "v",
"version_parameter": "version"
},
"wp-cli": {
"type": "custom-function",
"function": "wp_cli",
"repository": "wp-cli/wp-cli",
"domain": "https://github.com",
"alias": "wp",
"extension": ".phar",
"version_parameter": "--version",
"version_prefix": "v"
}
}

View File

@ -1,115 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/tools_schema.json",
"type": "object",
"title": "Tools",
"default": {},
"examples": [
{
"tool": {
"alias": "tool_alias",
"domain": "https://example.com",
"extension": ".ext",
"fetch_latest": "true",
"function": "function_name",
"repository": "user/tool",
"type": "phar, composer, custom-package or custom-function",
"version_parameter": "--version",
"version_prefix": "v"
}
}
],
"items": {
"properties": {
"alias": {
"$id": "#/items/properties/alias",
"type": "string",
"title": "The alias schema",
"description": "Alias for a tool.",
"examples": [
"tool_alias"
]
},
"domain": {
"$id": "#/items/properties/domain",
"type": "string",
"title": "The domain schema",
"description": "Domain URL of the tool.",
"examples": [
"https://example.com"
]
},
"extension": {
"$id": "#/items/properties/extension",
"type": "string",
"title": "The extension schema",
"description": "File extension of the tool.",
"examples": [
".ext"
]
},
"fetch_latest": {
"$id": "#/items/properties/fetch_latest",
"type": "string",
"title": "The fetch_latest schema",
"description": "Fetch the latest version from GitHub releases.",
"enum": [
"true",
"false"
]
},
"function": {
"$id": "#/items/properties/function",
"type": "string",
"title": "The function schema",
"description": "Function name in tools.ts which returns the script to setup the tool.",
"examples": [
"function_name"
]
},
"repository": {
"$id": "#/items/properties/repository",
"type": "string",
"title": "The repository schema",
"description": "GitHub repository of the tool.",
"examples": [
"user/tool"
]
},
"type": {
"$id": "#/items/properties/type",
"type": "string",
"title": "The type schema",
"description": "Type of tool: phar, composer, custom-package or custom-function.",
"enum": [
"phar",
"composer",
"custom-package",
"custom-function"
]
},
"version_parameter": {
"$id": "#/items/properties/version_parameter",
"type": "string",
"title": "The version_parameter schema",
"description": "Parameter to get the tool version.",
"examples": [
"--version"
]
},
"version_prefix": {
"$id": "#/items/properties/version_prefix",
"type": "string",
"title": "The version_prefix schema",
"description": "Prefix of the version in the download URL.",
"examples": [
"v"
]
}
},
"required": [
"type"
],
"additionalProperties": true
}
}

View File

@ -16,20 +16,28 @@ export async function addCoverageXdebug(
os_version: string, os_version: string,
pipe: string pipe: string
): Promise<string> { ): Promise<string> {
let script = '\n'; const xdebug =
script +=
(await extensions.addExtension(':pcov:false', version, os_version, true)) +
pipe;
script +=
(await extensions.addExtension(extension, version, os_version, true)) + (await extensions.addExtension(extension, version, os_version, true)) +
pipe; pipe;
script += await utils.addLog( const ini = await config.addINIValues(
'xdebug.mode=coverage',
os_version,
true
);
const log = await utils.addLog(
'$tick', '$tick',
extension, extension,
'Xdebug enabled as coverage driver', 'Xdebug enabled as coverage driver',
os_version os_version
); );
return script; switch (true) {
case /^xdebug3$/.test(extension):
case /^8\.0$/.test(version):
return '\n' + xdebug + '\n' + ini + '\n' + log;
case /^xdebug$/.test(extension):
default:
return xdebug + '\n' + log;
}
} }
/** /**
@ -47,19 +55,24 @@ export async function addCoveragePCOV(
let script = '\n'; let script = '\n';
switch (true) { switch (true) {
default: default:
script +=
(await extensions.addExtension(
':xdebug:false',
version,
os_version,
true
)) + pipe;
script += script +=
(await extensions.addExtension('pcov', version, os_version, true)) + (await extensions.addExtension('pcov', version, os_version, true)) +
pipe; pipe +
'\n';
script += script +=
(await config.addINIValues('pcov.enabled=1', os_version, true)) + '\n'; (await config.addINIValues('pcov.enabled=1', os_version, true)) + '\n';
// add command to disable xdebug and enable pcov
switch (os_version) {
case 'linux':
case 'darwin':
script += 'remove_extension xdebug' + pipe + '\n';
break;
case 'win32':
script += 'Remove-Extension xdebug' + pipe + '\n';
break;
}
// success // success
script += await utils.addLog( script += await utils.addLog(
'$tick', '$tick',
@ -96,16 +109,17 @@ export async function disableCoverage(
pipe: string pipe: string
): Promise<string> { ): Promise<string> {
let script = '\n'; let script = '\n';
script += switch (os_version) {
(await extensions.addExtension(':pcov:false', version, os_version, true)) + case 'linux':
pipe; case 'darwin':
script += script += 'remove_extension xdebug' + pipe + '\n';
(await extensions.addExtension( script += 'remove_extension pcov' + pipe + '\n';
':xdebug:false', break;
version, case 'win32':
os_version, script += 'Remove-Extension xdebug' + pipe + '\n';
true script += 'Remove-Extension pcov' + pipe + '\n';
)) + pipe; break;
}
script += await utils.addLog( script += await utils.addLog(
'$tick', '$tick',
'none', 'none',
@ -131,18 +145,15 @@ export async function addCoverage(
coverage_driver = coverage_driver.toLowerCase(); coverage_driver = coverage_driver.toLowerCase();
const script: string = const script: string =
'\n' + (await utils.stepLog('Setup Coverage', os_version)); '\n' + (await utils.stepLog('Setup Coverage', os_version));
const pipe: string = (await utils.suppressOutput(os_version)) + '\n'; const pipe: string = await utils.suppressOutput(os_version);
switch (coverage_driver) { switch (coverage_driver) {
case 'pcov': case 'pcov':
return script + (await addCoveragePCOV(version, os_version, pipe)); return script + (await addCoveragePCOV(version, os_version, pipe));
case 'xdebug': case 'xdebug':
case 'xdebug3': case 'xdebug3':
return ( return (
script + (await addCoverageXdebug('xdebug', version, os_version, pipe)) script +
); (await addCoverageXdebug(coverage_driver, version, os_version, pipe))
case 'xdebug2':
return (
script + (await addCoverageXdebug('xdebug2', version, os_version, pipe))
); );
case 'none': case 'none':
return script + (await disableCoverage(version, os_version, pipe)); return script + (await disableCoverage(version, os_version, pipe));

View File

@ -1,14 +1,35 @@
import * as path from 'path';
import * as utils from './utils'; import * as utils from './utils';
/**
* Function to get script to install custom extensions
*
* @param script
* @param command
*/
export async function customExtension(
script: string,
...command: string[]
): Promise<string> {
return (
'\n. ' +
path.join(__dirname, '../src/scripts/ext/' + script) +
'\n' +
(await utils.joins(...command))
);
}
/** /**
* Install and enable extensions for darwin * Install and enable extensions for darwin
* *
* @param extension_csv * @param extension_csv
* @param version * @param version
* @param pipe
*/ */
export async function addExtensionDarwin( export async function addExtensionDarwin(
extension_csv: string, extension_csv: string,
version: string version: string,
pipe: string
): Promise<string> { ): Promise<string> {
const extensions: Array<string> = await utils.extensionArray(extension_csv); const extensions: Array<string> = await utils.extensionArray(extension_csv);
let add_script = '\n'; let add_script = '\n';
@ -17,41 +38,42 @@ export async function addExtensionDarwin(
const version_extension: string = version + extension; const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-'); const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name); const ext_prefix = await utils.getExtensionPrefix(ext_name);
const command_prefix = 'pecl_install ';
let command = '';
switch (true) { switch (true) {
// match :extension // match :extension
case /^:/.test(ext_name): case /^:/.test(ext_name):
remove_script += '\ndisable_extension' + ext_name.replace(/:/g, ' '); remove_script += '\nremove_extension ' + ext_name.slice(1);
return; return;
// Match none // match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
case /^none$/.test(ext_name): // match 5.3blackfire-1.31.0...5.6blackfire-1.31.0, 7.0blackfire-1.31.0...7.4blackfire-1.31.0
add_script += '\ndisable_all_shared'; case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
return;
// match extensions for compiling from source
case /.+-.+\/.+@.+/.test(extension):
add_script += await utils.parseExtensionSource(extension, ext_prefix);
return;
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match couchbase, geos, pdo_oci, oci8, http, pecl_http
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension version_extension
): ):
case /^couchbase$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test( add_script += await customExtension(
extension 'blackfire.sh',
): 'add_blackfire',
case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension): extension
add_script += await utils.customPackage( );
ext_name, return;
'ext', // match pdo_oci and oci8
extension, case /^pdo_oci$|^oci8$/.test(extension):
'darwin' add_script += await customExtension('oci.sh', 'add_oci', extension);
return;
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
add_script += await customExtension('ioncube.sh', 'add_ioncube');
return;
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
add_script += await customExtension(
'phalcon.sh',
'add_phalcon',
extension
); );
return; return;
// match pre-release versions. For example - xdebug-beta // match pre-release versions. For example - xdebug-beta
case /.+-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(extension): case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nadd_unstable_extension', '\nadd_unstable_extension',
ext_name, ext_name,
@ -60,7 +82,7 @@ export async function addExtensionDarwin(
); );
return; return;
// match semver // match semver
case /.+-\d+\.\d+\.\d+.*/.test(extension): case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nadd_pecl_extension', '\nadd_pecl_extension',
ext_name, ext_name,
@ -72,31 +94,40 @@ export async function addExtensionDarwin(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension): case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'darwin'); add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
return; return;
// match 5.6 and newer - amqp, apcu, expect, grpc, igbinary, imagick, imap, memcache, memcached, mongodb, msgpack, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq // match 5.6xdebug to 8.0xdebug, 5.6swoole to 8.0swoole
// match 7.1 and newer - pcov // match 5.6grpc to 7.4grpc, 5.6protobuf to 7.4protobuf
// match 5.6 to 7.4 - propro // match 7.1pcov to 8.0pcov
// match 7.0 and newer - vips case /(5\.6|7\.[0-4]|8\.[0-9])xdebug/.test(version_extension):
case /(?<!5\.[3-5])(amqp|apcu|expect|grpc|igbinary|imagick|imap|memcache|memcached|mongodb|msgpack|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test( case /(5\.6|7\.[0-4])(grpc|protobuf|swoole)/.test(version_extension):
version_extension case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension):
): command = 'add_brew_extension ' + ext_name;
case /(5\.6|7\.[0-4])propro/.test(version_extension): break;
case /(?<!5\.[3-6]|7\.0)pcov/.test(version_extension): // match 5.6redis
case /(5\.6|7\.[0-3])phalcon3|7\.[2-4]phalcon4/.test(version_extension): case /5\.6redis/.test(version_extension):
case /(?<!5\.[3-6])vips/.test(version_extension): command = command_prefix + 'redis-2.2.8';
add_script += await utils.joins( break;
'\nadd_brew_extension', // match imagick
ext_name, case /^imagick$/.test(extension):
ext_prefix command = await utils.joins(
'brew install pkg-config imagemagick' + pipe,
'&& ' + command_prefix + 'imagick' + pipe
); );
return; break;
// match sqlite // match sqlite
case /^sqlite$/.test(extension): case /^sqlite$/.test(extension):
extension = 'sqlite3'; extension = 'sqlite3';
command = command_prefix + extension;
break; break;
default: default:
command = command_prefix + extension;
break; break;
} }
add_script += await utils.joins('\nadd_extension', extension, ext_prefix); add_script += await utils.joins(
'\nadd_extension',
extension,
'"' + command + '"',
ext_prefix
);
}); });
return add_script + remove_script; return add_script + remove_script;
} }
@ -121,50 +152,45 @@ export async function addExtensionWindows(
switch (true) { switch (true) {
// Match :extension // Match :extension
case /^:/.test(ext_name): case /^:/.test(ext_name):
remove_script += '\nDisable-Extension' + ext_name.replace(/:/g, ' '); remove_script += '\nRemove-Extension ' + ext_name.slice(1);
break; break;
// Match none // match 5.4blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
case /^none$/.test(ext_name): // match 5.4blackfire-1.31.0...5.6blackfire-1.31.0, 7.0blackfire-1.31.0...7.4blackfire-1.31.0
add_script += '\nDisable-AllShared'; case /^(5\.[4-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
break;
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 7.1pecl_http...8.0pecl_http and 7.1http...8.0http
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension version_extension
): ):
case /^pdo_oci$|^oci8$|^pdo_firebird$/.test(extension): add_script += await customExtension(
case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension): 'blackfire.ps1',
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension): 'Add-Blackfire',
case /^(7\.[1-4]|8\.0)(pecl_)?http/.test(version_extension): extension
add_script += await utils.customPackage(
ext_name,
'ext',
extension,
'win32'
); );
return; break;
// match pdo_oci and oci8
case /^pdo_oci$|^oci8$/.test(extension):
add_script += await customExtension('oci.ps1', 'Add-OCI', extension);
break;
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
add_script += await customExtension('ioncube.ps1', 'Add-Ioncube');
break;
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
add_script += await customExtension(
'phalcon.ps1',
'Add-Phalcon',
extension
);
break;
// match pre-release versions. For example - xdebug-beta // match pre-release versions. For example - xdebug-beta
case /.+-(stable|beta|alpha|devel|snapshot)/.test(extension): case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nAdd-Extension', '\nAdd-Extension',
ext_name, ext_name,
ext_version.replace('stable', '') ext_version
);
break;
// match extensions for compiling from source
case /.+-.+\/.+@.+/.test(extension):
add_script += await utils.getUnsupportedLog(
extension,
version,
'win32'
); );
break; break;
// match semver without state // match semver without state
case /.+-\d+\.\d+\.\d+$/.test(extension): case /.*-\d+\.\d+\.\d+$/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nAdd-Extension', '\nAdd-Extension',
ext_name, ext_name,
@ -173,34 +199,34 @@ export async function addExtensionWindows(
); );
break; break;
// match semver with state // match semver with state
case /.+-\d+\.\d+\.\d+[a-zA-Z]+\d*/.test(extension): case /.*-(\d+\.\d+\.\d)(beta|alpha|devel|snapshot)\d*/.test(
matches = /.+-(\d+\.\d+\.\d+)([a-zA-Z]+)\d*/.exec( version_extension
):
matches = /.*-(\d+\.\d+\.\d)(beta|alpha|devel|snapshot)\d*/.exec(
version_extension version_extension
) as RegExpExecArray; ) as RegExpExecArray;
add_script += await utils.joins( add_script += await utils.joins(
'\nAdd-Extension', '\nAdd-Extension',
ext_name, ext_name,
matches[2].replace('preview', 'devel'), matches[2],
matches[1] matches[1]
); );
break; break;
// match 7.2xdebug2 to 7.4xdebug2
case /7\.[2-4]xdebug2/.test(version_extension):
add_script += '\nAdd-Extension xdebug stable 2.9.8';
break;
// match 5.3pcov to 7.0pcov // match 5.3pcov to 7.0pcov
case /(5\.[3-6]|7\.0)pcov/.test(version_extension): case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'win32'); add_script += await utils.getUnsupportedLog('pcov', version, 'win32');
break; break;
// match 5.3 to 5.6 - mysql, mysqli, mysqlnd // match 5.3mysql..5.6mysql
case /^5\.[3-6](?<!pdo_)(mysql|mysqli|mysqlnd)$/.test(version_extension): // match 5.3mysqli..5.6mysqli
// match 5.3mysqlnd..5.6mysqlnd
case /^5\.\d(mysql|mysqli|mysqlnd)$/.test(version_extension):
add_script += add_script +=
'\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd'; '\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd';
break; break;
// match 7.0 and newer mysql, mysqli and mysqlnd // match 7.0mysql..8.0mysql
case /(?<!5\.[3-6])(?<!pdo_)(mysql|mysqli|mysqlnd)$/.test( // match 7.0mysqli..8.0mysqli
version_extension // match 7.0mysqlnd..8.0mysqlnd
): case /[7-8]\.\d(mysql|mysqli|mysqlnd)$/.test(version_extension):
add_script += '\nAdd-Extension mysqli\nAdd-Extension mysqlnd'; add_script += '\nAdd-Extension mysqli\nAdd-Extension mysqlnd';
break; break;
// match sqlite // match sqlite
@ -221,10 +247,12 @@ export async function addExtensionWindows(
* *
* @param extension_csv * @param extension_csv
* @param version * @param version
* @param pipe
*/ */
export async function addExtensionLinux( export async function addExtensionLinux(
extension_csv: string, extension_csv: string,
version: string version: string,
pipe: string
): Promise<string> { ): Promise<string> {
const extensions: Array<string> = await utils.extensionArray(extension_csv); const extensions: Array<string> = await utils.extensionArray(extension_csv);
let add_script = '\n'; let add_script = '\n';
@ -233,47 +261,46 @@ export async function addExtensionLinux(
const version_extension: string = version + extension; const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-'); const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name); const ext_prefix = await utils.getExtensionPrefix(ext_name);
const command_prefix = 'sudo $debconf_fix apt-get install -y php';
let command = '';
switch (true) { switch (true) {
// Match :extension // Match :extension
case /^:/.test(ext_name): case /^:/.test(ext_name):
remove_script += '\ndisable_extension' + ext_name.replace(/:/g, ' '); remove_script += '\nremove_extension ' + ext_name.slice(1);
return; return;
// Match none // match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
case /^none$/.test(ext_name): // match 5.3blackfire-{semver}...5.6blackfire-{semver}, 7.0blackfire-{semver}...7.4blackfire-{semver}
add_script += '\ndisable_all_shared'; case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
return;
// match extensions for compiling from source
case /.+-.+\/.+@.+/.test(extension):
add_script += await utils.parseExtensionSource(extension, ext_prefix);
return;
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match 5.3pdo_cubrid...7.2php_cubrid, 5.3cubrid...7.4cubrid
// match couchbase, geos, pdo_oci, oci8, http, pecl_http
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension version_extension
): ):
case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test( add_script += await customExtension(
version_extension 'blackfire.sh',
): 'add_blackfire',
case /^couchbase$|^gearman$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test( extension
extension
):
case /(?<!5\.[3-5])intl-[\d]+\.[\d]+$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
add_script += await utils.customPackage(
ext_name,
'ext',
extension,
'linux'
); );
return; return;
// match pdo_oci and oci8
case /^pdo_oci$|^oci8$/.test(extension):
add_script += await customExtension('oci.sh', 'add_oci', extension);
return;
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
add_script += await customExtension('ioncube.sh', 'add_ioncube');
return;
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
add_script += await customExtension(
'phalcon.sh',
'add_phalcon',
extension
);
return;
// match 5.6gearman..7.4gearman
case /^((5\.6)|(7\.[0-4]))gearman$/.test(version_extension):
add_script += await customExtension('gearman.sh', 'add_gearman');
return;
// match pre-release versions. For example - xdebug-beta // match pre-release versions. For example - xdebug-beta
case /.+-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(extension): case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nadd_unstable_extension', '\nadd_unstable_extension',
ext_name, ext_name,
@ -282,7 +309,7 @@ export async function addExtensionLinux(
); );
return; return;
// match semver versions // match semver versions
case /.+-\d+\.\d+\.\d+.*/.test(extension): case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins( add_script += await utils.joins(
'\nadd_pecl_extension', '\nadd_pecl_extension',
ext_name, ext_name,
@ -294,28 +321,40 @@ export async function addExtensionLinux(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension): case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'linux'); add_script += await utils.getUnsupportedLog('pcov', version, 'linux');
return; return;
// match 7.2xdebug2...7.4xdebug2 // match 7.2xdebug3..7.4xdebug3
case /^7\.[2-4]xdebug2$/.test(version_extension): case /^7\.[2-4]xdebug3$/.test(version_extension):
add_script += await utils.joins( add_script +=
'\nadd_pecl_extension', '\nadd_extension_from_source xdebug xdebug/xdebug master --enable-xdebug zend_extension';
'xdebug',
'2.9.8',
ext_prefix
);
return; return;
// match 8.0xdebug3
case /^8\.[0-9]xdebug3$/.test(version_extension):
extension = 'xdebug';
command = command_prefix + version + '-' + extension + pipe;
break;
// match pdo extensions // match pdo extensions
case /^pdo[_-].+/.test(extension): case /.*pdo[_-].*/.test(version_extension):
extension = extension.replace(/pdo[_-]|3/, ''); extension = extension.replace(/pdo[_-]|3/, '');
add_script += '\nadd_pdo_extension ' + extension; add_script += '\nadd_pdo_extension ' + extension;
return; return;
// match ast and uopz
case /^(ast|uopz)$/.test(extension):
command = command_prefix + '-' + extension + pipe;
break;
// match sqlite // match sqlite
case /^sqlite$/.test(extension): case /^sqlite$/.test(extension):
extension = 'sqlite3'; extension = 'sqlite3';
command = command_prefix + version + '-' + extension + pipe;
break; break;
default: default:
command = command_prefix + version + '-' + extension + pipe;
break; break;
} }
add_script += await utils.joins('\nadd_extension', extension, ext_prefix); add_script += await utils.joins(
'\nadd_extension',
extension,
'"' + command + '"',
ext_prefix
);
}); });
return add_script + remove_script; return add_script + remove_script;
} }
@ -334,15 +373,15 @@ export async function addExtension(
os_version: string, os_version: string,
no_step = false no_step = false
): Promise<string> { ): Promise<string> {
const log: string = await utils.stepLog('Setup Extensions', os_version); const pipe: string = await utils.suppressOutput(os_version);
let script = '\n'; let script = '\n';
switch (no_step) { switch (no_step) {
case true: case true:
script += log + (await utils.suppressOutput(os_version)); script += (await utils.stepLog('Setup Extensions', os_version)) + pipe;
break; break;
case false: case false:
default: default:
script += log; script += await utils.stepLog('Setup Extensions', os_version);
break; break;
} }
@ -350,9 +389,9 @@ export async function addExtension(
case 'win32': case 'win32':
return script + (await addExtensionWindows(extension_csv, version)); return script + (await addExtensionWindows(extension_csv, version));
case 'darwin': case 'darwin':
return script + (await addExtensionDarwin(extension_csv, version)); return script + (await addExtensionDarwin(extension_csv, version, pipe));
case 'linux': case 'linux':
return script + (await addExtensionLinux(extension_csv, version)); return script + (await addExtensionLinux(extension_csv, version, pipe));
default: default:
return await utils.log( return await utils.log(
'Platform ' + os_version + ' is not supported', 'Platform ' + os_version + ' is not supported',

View File

@ -1,10 +1,11 @@
import {exec} from '@actions/exec'; import {exec} from '@actions/exec/lib/exec';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as config from './config'; import * as config from './config';
import * as coverage from './coverage'; import * as coverage from './coverage';
import * as extensions from './extensions'; import * as extensions from './extensions';
import * as tools from './tools'; import * as tools from './tools';
import * as utils from './utils'; import * as utils from './utils';
import * as matchers from './matchers';
/** /**
* Build the script * Build the script
@ -13,21 +14,30 @@ import * as utils from './utils';
* @param version * @param version
* @param os_version * @param os_version
*/ */
export async function getScript( export async function build(
filename: string, filename: string,
version: string, version: string,
os_version: string os_version: string
): Promise<string> { ): Promise<string> {
const url = 'https://setup-php.com/sponsor';
// taking inputs // taking inputs
process.env['fail_fast'] = await utils.getInput('fail-fast', false); const extension_csv: string =
const extension_csv: string = await utils.getInput('extensions', false); (await utils.getInput('extensions', false)) ||
(await utils.getInput('extension', false));
const ini_values_csv: string = await utils.getInput('ini-values', false); const ini_values_csv: string = await utils.getInput('ini-values', false);
const coverage_driver: string = await utils.getInput('coverage', false); const coverage_driver: string = await utils.getInput('coverage', false);
const tools_csv: string = await utils.getInput('tools', 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) ||
/.*-(\d+\.\d+\.\d+).*/.test(extension_csv)
) {
tools_csv = 'pecl, ' + tools_csv;
}
let script: string = await utils.readFile(filename, 'src/scripts'); let script: string = await utils.readScript(filename);
script += await tools.addTools(tools_csv, version, os_version); script += await tools.addTools(tools_csv, version, os_version);
if (extension_csv) { if (extension_csv) {
script += await extensions.addExtension(extension_csv, version, os_version); script += await extensions.addExtension(extension_csv, version, os_version);
} }
@ -37,8 +47,6 @@ export async function getScript(
if (ini_values_csv) { if (ini_values_csv) {
script += await config.addINIValues(ini_values_csv, os_version); script += await config.addINIValues(ini_values_csv, os_version);
} }
script += '\n' + (await utils.stepLog(`Sponsor setup-php`, os_version));
script += '\n' + (await utils.addLog('$tick', 'setup-php', url, os_version));
return await utils.writeScript(filename, script); return await utils.writeScript(filename, script);
} }
@ -48,32 +56,28 @@ export async function getScript(
*/ */
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
if ((await utils.readEnv('ImageOS')) == 'ubuntu16') { let version: string = await utils.getInput('php-version', true);
core.setFailed( version = version.length > 1 ? version.slice(0, 3) : version + '.0';
'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' const os_version: string = process.platform;
);
return; // check the os version and run the respective script
} let script_path = '';
const version: string = await utils.parseVersion( switch (os_version) {
await utils.getInput('php-version', true) case 'darwin':
); case 'linux':
if (version) { script_path = await build(os_version + '.sh', version, os_version);
const os_version: string = process.platform; await exec('bash ' + script_path + ' ' + version + ' ' + __dirname);
const tool = await utils.scriptTool(os_version); break;
const script = os_version + (await utils.scriptExtension(os_version)); case 'win32':
const location = await getScript(script, version, os_version); script_path = await build('win32.ps1', version, os_version);
await exec(await utils.joins(tool, location, version, __dirname)); await exec('pwsh ' + script_path + ' ' + version + ' ' + __dirname);
} else { break;
core.setFailed('Unable to get the PHP version');
} }
await matchers.addMatchers();
} catch (error) { } catch (error) {
core.setFailed((error as Error).message); core.setFailed(error.message);
} }
} }
// call the run function // call the run function
(async () => { run();
await run();
})().catch(error => {
core.setFailed(error.message);
});

13
src/matchers.ts Normal file
View File

@ -0,0 +1,13 @@
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');
const runner_dir: string = await utils.getInput('RUNNER_TOOL_CACHE', false);
await io.cp(path.join(config_path, 'phpunit.json'), runner_dir);
await io.cp(path.join(config_path, 'php.json'), runner_dir);
}

View File

@ -1,371 +0,0 @@
# Variables
export tick="✓"
export cross="✗"
export curl_opts=(-sL)
export old_versions="5.[3-5]"
export jit_versions="8.[0-9]"
export nightly_versions="8.[1-9]"
export xdebug3_versions="7.[2-4]|8.[0-9]"
export tool_path_dir="/usr/local/bin"
export composer_home="$HOME/.composer"
export composer_bin="$composer_home/vendor/bin"
export composer_json="$composer_home/composer.json"
export composer_lock="$composer_home/composer.lock"
export latest="releases/latest/download"
export github="https://github.com/shivammathur"
export jsdeliver="https://cdn.jsdelivr.net/gh/shivammathur"
# Function to log start of a operation.
step_log() {
message=$1
printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
}
# Function to log result of a operation.
add_log() {
mark=$1
subject=$2
message=$3
if [ "$mark" = "$tick" ]; then
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
else
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
[ "$fail_fast" = "true" ] && exit 1
fi
}
# Function to log result of installing extension.
add_extension_log() {
(
check_extension "$(echo "$1" | cut -d '-' -f 1)" && add_log "$tick" "$1" "$2"
) || add_log "$cross" "$1" "Could not install $1 on PHP ${semver:?}"
}
# Function to read env inputs.
read_env() {
[[ -z "${update}" ]] && update='false' && UPDATE='false' || update="${update}"
[ "$update" = false ] && [[ -n ${UPDATE} ]] && update="${UPDATE}"
[[ -z "${runner}" ]] && runner='github' && RUNNER='github' || runner="${runner}"
[ "$runner" = false ] && [[ -n ${RUNNER} ]] && runner="${RUNNER}"
[[ -z "${fail_fast}" ]] && fail_fast='false' || fail_fast="${fail_fast}"
}
# Function to download a file using cURL.
# mode: -s pipe to stdout, -v save file and return status code
# execute: -e save file as executable
get() {
mode=$1
execute=$2
file_path=$3
shift 3
links=("$@")
if [ "$mode" = "-s" ]; then
sudo curl "${curl_opts[@]}" "${links[0]}"
else
for link in "${links[@]}"; do
status_code=$(sudo curl -w "%{http_code}" -o "$file_path" "${curl_opts[@]}" "$link")
[ "$status_code" = "200" ] && break
done
[ "$execute" = "-e" ] && sudo chmod a+x "$file_path"
[ "$mode" = "-v" ] && echo "$status_code"
fi
}
# Function to download and run scripts from GitHub releases with jsdeliver fallback.
run_script() {
repo=$1
shift
args=("$@")
get -q -e /tmp/install.sh "$github/$repo/$latest/install.sh" "$jsdeliver/$1@main/scripts/install.sh"
bash /tmp/install.sh "${args[@]}"
}
# Function to install required packages on self-hosted runners.
self_hosted_setup() {
if [ "$runner" = "self-hosted" ]; then
if [[ "${version:?}" =~ $old_versions ]]; then
add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner"
exit 1
else
self_hosted_helper >/dev/null 2>&1
fi
fi
}
# Function to test if extension is loaded.
check_extension() {
extension=$1
if [ "$extension" != "mysql" ]; then
php -m | grep -i -q -w "$extension"
else
php -m | grep -i -q "$extension"
fi
}
# Function to check if extension is shared
shared_extension() {
[ -e "${ext_dir:?}/$1.so" ]
}
# Function to enable cached extensions.
enable_cache_extension() {
deps=()
for ext in /tmp/extcache/"$1"/*; do
deps+=("$(basename "$ext")")
done
if [ "x${deps[*]}" = "x" ]; then
sudo rm -rf /tmp/extcache/"$1"
enable_extension "$1" "$2"
else
deps+=("$1")
if php "${deps[@]/#/-d ${2}=}" -m 2>/dev/null | grep -i -q "$1"; then
for ext in "${deps[@]}"; do
sudo rm -rf /tmp/extcache/"$ext"
enable_extension "$ext" "$2"
done
fi
fi
}
# Function to enable existing extensions.
enable_extension() {
modules_dir="/var/lib/php/modules/$version"
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
enable_extension_dependencies "$1" "$2"
if [ -d /tmp/extcache/"$1" ]; then
enable_cache_extension "$1" "$2"
elif ! check_extension "$1" && shared_extension "$1"; then
echo "$2=${ext_dir:?}/$1.so" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
fi
}
# Function to get a map of extensions and their dependent shared extensions.
get_extension_map() {
php -d'error_reporting=0' "${dist:?}"/../src/scripts/ext/extension_map.php
}
# Function to enable extension dependencies which are also extensions.
enable_extension_dependencies() {
extension=$1
prefix=$2
if ! [ -e /tmp/map.orig ]; then
get_extension_map | sudo tee /tmp/map.orig >/dev/null
fi
for dependency in $(grep "$extension:" /tmp/map.orig | cut -d ':' -f 2 | tr '\n' ' '); do
enable_extension "$dependency" "$prefix"
done
}
# Function to disable dependent extensions.
disable_extension_dependents() {
local extension=$1
for dependent in $(get_extension_map | grep -E ".*:.*\s$extension(\s|$)" | cut -d ':' -f 1 | tr '\n' ' '); do
disable_extension_helper "$dependent" true
add_log "${tick:?}" ":$extension" "Disabled $dependent as it depends on $extension"
done
}
# Function to disable an extension.
disable_extension() {
extension=$1
if check_extension "$extension"; then
if shared_extension "$extension"; then
disable_extension_helper "$extension" true
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Disabled") ||
add_log "${cross:?}" ":$extension" "Could not disable $extension on PHP ${semver:?}"
else
add_log "${cross:?}" ":$extension" "Could not disable $extension on PHP $semver as it not a shared extension"
fi
elif shared_extension "$extension"; then
add_log "${tick:?}" ":$extension" "Disabled"
else
add_log "${tick:?}" ":$extension" "Could not find $extension on PHP $semver"
fi
}
# Function to disable shared extensions.
disable_all_shared() {
sudo sed -i.orig -E -e "/^(zend_)?extension\s*=/d" "${ini_file[@]}" "$pecl_file" 2>/dev/null || true
sudo find "${ini_dir:-$scan_dir}"/.. -name "*.ini" -not -path "*php.ini" -not -path "*mods-available*" -delete >/dev/null 2>&1 || true
add_log "${tick:?}" "none" "Disabled all shared extensions"
}
# Function to configure PHP
configure_php() {
(
echo -e "date.timezone=UTC\nmemory_limit=-1"
[[ "$version" =~ $jit_versions ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
[[ "$version" =~ $xdebug3_versions ]] && echo -e "xdebug.mode=coverage"
) | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
}
# Function to configure PECL.
configure_pecl() {
if ! [ -e /tmp/pecl_config ]; then
for script in pear pecl; do
sudo "$script" config-set php_ini "${pecl_file:-${ini_file[@]}}"
sudo "$script" channel-update "$script".php.net
done
echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
fi
}
# Function to get the PECL version of an extension.
get_pecl_version() {
extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(stable|alpha|beta|rc|snapshot|preview)")"
pecl_rest='https://pecl.php.net/rest/r/'
response=$(get -s -n "" "$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 "([0-9]+\.[0-9]+\.[0-9]+)")
fi
echo "$pecl_version"
}
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1
add_pecl >/dev/null 2>&1
yes '' 2>/dev/null | sudo pecl install -f "$extension" >/dev/null 2>&1
}
# Function to install a specific version of PECL extension.
add_pecl_extension() {
extension=$1
pecl_version=$2
prefix=$3
enable_extension "$extension" "$prefix"
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
pecl_version=$(get_pecl_version "$extension" "$pecl_version")
fi
ext_version=$(php -r "echo phpversion('$extension');")
if [ "$ext_version" = "$pecl_version" ]; then
add_log "${tick:?}" "$extension" "Enabled"
else
disable_extension_helper "$extension" >/dev/null 2>&1
pecl_install "$extension-$pecl_version"
add_extension_log "$extension-$pecl_version" "Installed and enabled"
fi
}
# Function to setup pre-release extensions using PECL.
add_unstable_extension() {
extension=$1
stability=$2
prefix=$3
pecl_version=$(get_pecl_version "$extension" "$stability")
add_pecl_extension "$extension" "$pecl_version" "$prefix"
}
# Function to extract tool version.
get_tool_version() {
tool=$1
param=$2
alp="[a-zA-Z0-9]"
version_regex="[0-9]+((\.{1}$alp+)+)(\.{0})(-$alp+){0,1}"
if [ "$tool" = "composer" ]; then
if [ "$param" != "snapshot" ]; then
composer_version="$(grep -Ea "const\sVERSION" "$tool_path_dir/composer" | grep -Eo "$version_regex")"
else
composer_version="$(grep -Ea "const\sBRANCH_ALIAS_VERSION" "$tool_path_dir/composer" | grep -Eo "$version_regex")+$(grep -Ea "const\sVERSION" "$tool_path_dir/composer" | grep -Eo "[a-zA-z0-9]+" | tail -n 1)"
fi
echo "$composer_version" | sudo tee /tmp/composer_version
else
$tool "$param" 2>/dev/null | sed -Ee "s/[Cc]omposer(.)?$version_regex//g" | grep -Eo "$version_regex" | head -n 1
fi
}
# 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
ver_param=$3
tool_path="$tool_path_dir/$tool"
if ! [[ "$PATH" =~ $tool_path_dir ]]; then
export PATH=$PATH:"$tool_path_dir"
echo "export PATH=\$PATH:$tool_path_dir" | sudo tee -a "$GITHUB_ENV" >/dev/null
fi
if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path"
fi
IFS="," read -r -a url <<<"$url"
status_code=$(get -v -e "$tool_path" "${url[@]}")
if [ "$status_code" != "200" ] && [[ "${url[0]}" =~ .*github.com.*releases.*latest.* ]]; then
url[0]="${url[0]//releases\/latest\/download/releases/download/$(get -s -n "" "$(echo "${url[0]}" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "${url[0]}" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
status_code=$(get -v -e "$tool_path" "${url[0]}")
fi
if [ "$status_code" = "200" ]; then
add_tools_helper "$tool"
tool_version=$(get_tool_version "$tool" "$ver_param")
add_log "$tick" "$tool" "Added $tool $tool_version"
else
add_log "$cross" "$tool" "Could not setup $tool"
fi
}
# Function to setup a tool using composer.
add_composertool() {
tool=$1
release=$2
prefix=$3
if [[ "$tool" =~ prestissimo|composer-prefetcher ]]; then
composer_version=$(cat /tmp/composer_version)
if [ "$(echo "$composer_version" | cut -d'.' -f 1)" != "1" ]; then
echo "::warning:: Skipping $tool, as it does not support Composer $composer_version. Specify composer:v1 in tools to use $tool"
add_log "$cross" "$tool" "Skipped"
return
fi
fi
(
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
composer global require "$prefix$release" 2>&1 | tee /tmp/composer.log >/dev/null 2>&1
log=$(grep "$prefix$tool" /tmp/composer.log) &&
tool_version=$(get_tool_version 'echo' "$log") &&
add_log "$tick" "$tool" "Added $tool $tool_version"
) || add_log "$cross" "$tool" "Could not setup $tool"
add_tools_helper "$tool"
if [ -e "$composer_bin/composer" ]; then
sudo cp -p "$tool_path_dir/composer" "$composer_bin"
fi
}
# Function to get PHP version in semver format.
php_semver() {
php -v | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+((-?[a-zA-Z]+([0-9]+)?)?){2}" | head -n 1
}
# Function to get the tag for a php version.
php_src_tag() {
commit=$(php_extra_version | grep -Eo "[0-9a-zA-Z]+")
if [[ -n "${commit}" ]]; then
echo "$commit"
else
echo "php-$semver"
fi
}

View File

@ -1,236 +1,279 @@
# Function to log start of a operation.
step_log() {
message=$1
printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
}
# Function to log result of a operation.
add_log() {
mark=$1
subject=$2
message=$3
if [ "$mark" = "$tick" ]; then
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
else
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
fi
}
# Function to log result of installing extension.
add_extension_log() {
extension=$1
status=$2
extension_name=$(echo "$extension" | cut -d '-' -f 1)
(
check_extension "$extension_name" && add_log "$tick" "$extension_name" "$status"
) || add_log "$cross" "$extension_name" "Could not install $extension on PHP $semver"
}
# Function to read env inputs.
read_env() {
[[ -z "${update}" ]] && update='false' && UPDATE='false' || update="${update}"
[ "$update" = false ] && [[ -n ${UPDATE} ]] && update="${UPDATE}"
[[ -z "${runner}" ]] && runner='github' && RUNNER='github' || runner="${runner}"
[ "$runner" = false ] && [[ -n ${RUNNER} ]] && runner="${RUNNER}"
}
# Function to setup environment for self-hosted runners. # Function to setup environment for self-hosted runners.
self_hosted_helper() { self_hosted_setup() {
if ! command -v brew >/dev/null; then if [[ $(command -v brew) == "" ]]; then
step_log "Setup Brew" step_log "Setup Brew"
get -q -e "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/master/install.sh" && /tmp/install.sh >/dev/null 2>&1 curl "${curl_opts[@]}" https://raw.githubusercontent.com/Homebrew/install/master/install.sh | bash -s >/dev/null 2>&1
add_log "${tick:?}" "Brew" "Installed Homebrew" add_log "$tick" "Brew" "Installed Homebrew"
fi fi
} }
# Helper function to disable an extension. # Function to remove extensions.
disable_extension_helper() { remove_extension() {
extension=$1
if check_extension "$extension"; then
sudo sed -i '' "/$extension/d" "$ini_file"
sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
(! check_extension "$extension" && add_log "$tick" ":$extension" "Removed") ||
add_log "$cross" ":$extension" "Could not remove $extension on PHP $semver"
else
add_log "$tick" ":$extension" "Could not find $extension on PHP $semver"
fi
}
# Function to test if extension is loaded.
check_extension() {
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.
get_pecl_version() {
extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot)")"
pecl_rest='https://pecl.php.net/rest/r/'
response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
pecl_version=$(echo "$response" | grep -m 1 -Eio "(\d*\.\d*\.\d*$stability\d*)")
if [ ! "$pecl_version" ]; then
pecl_version=$(echo "$response" | grep -m 1 -Eo "(\d*\.\d*\.\d*)")
fi
echo "$pecl_version"
}
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1 local extension=$1
local disable_dependents=${2:-false} yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
if [ "$disable_dependents" = "true" ]; then
disable_extension_dependents "$extension"
fi
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
sudo rm -rf "$scan_dir"/*"$extension"*
} }
# Function to fetch a brew tap. # Function to install a specific version of PECL extension.
fetch_brew_tap() { add_pecl_extension() {
tap=$1 extension=$1
tap_user=$(dirname "$tap") pecl_version=$2
tap_name=$(basename "$tap") prefix=$3
mkdir -p "$tap_dir/$tap_user" if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot).* ]]; then
get -s -n "" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user" pecl_version=$(get_pecl_version "$extension" "$pecl_version")
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 fi
} if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"
# Function to add a brew tap. fi
add_brew_tap() { ext_version=$(php -r "echo phpversion('$extension');")
tap=$1 if [ "$ext_version" = "$pecl_version" ]; then
if ! [ -d "$tap_dir/$tap" ]; then add_log "$tick" "$extension" "Enabled"
if [ "${runner:?}" = "self-hosted" ]; then else
brew tap "$tap" >/dev/null 2>&1 remove_extension "$extension" >/dev/null 2>&1
else pecl_install "$extension-$pecl_version"
fetch_brew_tap "$tap" >/dev/null 2>&1 add_extension_log "$extension-$pecl_version" "Installed and enabled"
if ! [ -d "$tap_dir/$tap" ]; then
brew tap "$tap" >/dev/null 2>&1
fi
fi
fi fi
} }
# Function to install a php extension from shivammathur/extensions tap. # Function to install a php extension from shivammathur/extensions tap.
add_brew_extension() { add_brew_extension() {
formula=$1 extension=$1
prefix=$2 if ! brew tap | grep shivammathur/extensions; then
extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")" brew tap --shallow shivammathur/extensions
enable_extension "$extension" "$prefix"
if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled"
else
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
update_dependencies >/dev/null 2>&1
brew install -f "$formula@$version" >/dev/null 2>&1
sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
add_extension_log "$extension" "Installed and enabled"
fi fi
brew install "$extension@$version"
sudo cp "$(brew --prefix)/opt/$extension@$version/$extension.so" "$ext_dir"
} }
# Function to setup extensions. # Function to setup extensions
add_extension() { add_extension() {
extension=$1 extension=$1
prefix=$2 install_command=$2
enable_extension "$extension" "$prefix" prefix=$3
if check_extension "$extension"; then if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
add_log "${tick:?}" "$extension" "Enabled" echo "$prefix=$ext_dir/$extension.so" >>"$ini_file" && add_log "$tick" "$extension" "Enabled"
else elif check_extension "$extension"; then
if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then add_log "$tick" "$extension" "Enabled"
run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1 elif ! check_extension "$extension"; then
else eval "$install_command" >/dev/null 2>&1 &&
pecl_install "$extension" >/dev/null 2>&1 && if [[ "$version" =~ $old_versions ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
fi
add_extension_log "$extension" "Installed and enabled" add_extension_log "$extension" "Installed and enabled"
fi fi
} }
# Function to handle request to add phpize and php-config. # Function to setup pre-release extensions using PECL.
add_devtools() { add_unstable_extension() {
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
composer -q global config process-timeout 0
echo "::add-path::/Users/$USER/.composer/vendor/bin"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
fi
}
# Function to setup a remote tool.
add_tool() {
url=$1
tool=$2
tool_path="$tool_path_dir/$tool"
if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path"
fi
if [ "$tool" = "composer" ]; then
IFS="," read -r -a urls <<< "$url"
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
else
status_code=$(sudo curl -s -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
configure_composer "$tool_path"
elif [ "$tool" = "phan" ]; then
add_extension fileinfo "pecl_install fileinfo" extension >/dev/null 2>&1
add_extension ast "pecl_install ast" extension >/dev/null 2>&1
elif [ "$tool" = "phive" ]; then
add_extension curl "pecl_install curl" extension >/dev/null 2>&1
add_extension mbstring "pecl_install mbstring" extension >/dev/null 2>&1
add_extension xml "pecl_install xml" extension >/dev/null 2>&1
elif [ "$tool" = "cs2pr" ]; then
sudo sed -i '' 's/exit(9)/exit(0)/' "$tool_path"
tr -d '\r' <"$tool_path" | sudo tee "$tool_path.tmp" >/dev/null 2>&1 && sudo mv "$tool_path.tmp" "$tool_path"
sudo chmod a+x "$tool_path"
elif [ "$tool" = "wp-cli" ]; then
sudo cp -p "$tool_path" "$tool_path_dir"/wp
fi
add_log "$tick" "$tool" "Added"
else
add_log "$cross" "$tool" "Could not setup $tool"
fi
}
# Function to add a tool using composer.
add_composertool() {
tool=$1 tool=$1
add_log "${tick:?}" "$tool" "Added $tool $semver" release=$2
prefix=$3
(
composer global require "$prefix$release" >/dev/null 2>&1 && add_log "$tick" "$tool" "Added"
) || add_log "$cross" "$tool" "Could not setup $tool"
}
# Function to configure PECL
configure_pecl() {
for tool in pear pecl; do
sudo "$tool" config-set php_ini "$ini_file"
sudo "$tool" channel-update "$tool".php.net
done
} }
# Function to handle request to add PECL. # Function to handle request to add PECL.
add_pecl() { add_pecl() {
configure_pecl >/dev/null 2>&1 add_log "$tick" "PECL" "Added"
pear_version=$(get_tool_version "pecl" "version")
add_log "${tick:?}" "PECL" "Found PECL $pear_version"
} }
# Function to link all libraries of a formula. # Function to setup PHP 5.6 and newer.
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 to overwrite packages.
patch_brew() {
formula_installer="$brew_repo"/Library/Homebrew/formula_installer.rb
code=" keg.link(verbose: verbose?"
sudo sed -i '' "s/$code)/$code, overwrite: true)/" "$formula_installer"
# shellcheck disable=SC2064
trap "sudo sed -i '' 's/$code, overwrite: true)/$code)/' $formula_installer" exit
}
# Helper function to update the dependencies.
update_dependencies_helper() {
dependency=$1
get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$dependency.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$dependency.rb"
link_libraries "$dependency"
}
# Function to update dependencies.
update_dependencies() {
if ! [ -e /tmp/update_dependencies ] && [ "${runner:?}" != "self-hosted" ] && [ "${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[@]}"
echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1
fi
}
# Function to fix dependencies on install PHP version.
fix_dependencies() {
broken_deps_paths=$(php -v 2>&1 | grep -Eo '/opt/[a-zA-Z0-9@\.]+')
if [ "x$broken_deps_paths" != "x" ]; then
update_dependencies
IFS=" " read -r -a formulae <<< "$(echo "$broken_deps_paths" | tr '\n' ' ' | sed 's|/opt/||g' 2>&1)$php_formula"
brew reinstall "${formulae[@]}"
brew link --force --overwrite "$php_formula" || true
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 5.6 and newer using Homebrew.
add_php() {
action=$1
existing_version=$2
add_brew_tap shivammathur/homebrew-php
update_dependencies
if [ "$existing_version" != "false" ]; then
([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula"
else
brew install -f "$php_formula"
fi
brew link --force --overwrite "$php_formula"
}
# Function to get extra version.
php_extra_version() {
php_formula_file="$tap_dir"/shivammathur/homebrew-php/Formula/php@"$version".rb
if [ -e "$php_formula_file" ] && ! grep -q "deprecate!" $php_formula_file && grep -Eq "archive/[0-9a-zA-Z]+" "$php_formula_file"; then
echo " ($(grep -Eo "archive/[0-9a-zA-Z]+" "$php_formula_file" | cut -d'/' -f 2))"
fi
}
# Function to Setup PHP.
setup_php() { setup_php() {
step_log "Setup PHP" action=$1
existing_version=$(get_brewed_php) export HOMEBREW_NO_INSTALL_CLEANUP=TRUE
if [[ "$version" =~ ${old_versions:?} ]]; then brew tap --shallow shivammathur/homebrew-php
run_script "php5-darwin" "${version/./}" >/dev/null 2>&1 if brew list php@"$version" 2>/dev/null | grep -q "Error" && [ "$action" != "upgrade" ]; then
status="Installed" brew unlink php@"$version"
elif [ "$existing_version" != "$version" ]; then
add_php "install" "$existing_version" >/dev/null 2>&1
status="Installed"
elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
add_php "upgrade" "$existing_version" >/dev/null 2>&1
status="Updated to"
else else
status="Found" brew "$action" shivammathur/php/php@"$version"
fix_dependencies >/dev/null 2>&1
fi fi
ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") brew link --force --overwrite php@"$version"
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_semver)
extra_version=$(php_extra_version)
if [ "${semver%.*}" != "$version" ]; then
add_log "${cross:?}" "PHP" "Could not setup PHP $version"
exit 1
fi
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
echo "::set-output name=php-version::$semver"
add_log "$tick" "PHP" "$status PHP $semver$extra_version"
} }
# Variables # Variables
tick="✓"
cross="✗"
version=$1 version=$1
dist=$2 nodot_version=${1/./}
php_formula=shivammathur/php/php@"$version" old_versions="5.[3-5]"
brew_prefix="$(brew --prefix)" tool_path_dir="/usr/local/bin"
brew_repo="$(brew --repository)" curl_opts=(-sL)
tap_dir="$brew_repo"/Library/Taps existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
scripts="${dist}"/../src/scripts
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
# shellcheck source=.
. "${scripts:?}"/ext/source.sh
. "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/common.sh
read_env read_env
self_hosted_setup if [ "$runner" = "self-hosted" ]; then
setup_php if [[ "$version" =~ $old_versions ]]; then
add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner"
exit 1
else
self_hosted_setup >/dev/null 2>&1
fi
fi
# Setup PHP
step_log "Setup PHP"
if [[ "$version" =~ $old_versions ]]; then
curl "${curl_opts[@]}" https://github.com/shivammathur/php5-darwin/releases/latest/download/install.sh | bash -s "$nodot_version" >/dev/null 2>&1
status="Installed"
elif [ "$existing_version" != "$version" ]; then
setup_php "install" >/dev/null 2>&1
status="Installed"
elif [ "$existing_version" = "$version" ] && [ "$update" = "true" ]; then
setup_php "upgrade" >/dev/null 2>&1
status="Updated to"
else
status="Found"
fi
ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
sudo chmod 777 "$ini_file" "$tool_path_dir"
echo -e "date.timezone=UTC\nmemory_limit=-1" >>"$ini_file"
ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
sudo mkdir -p "$ext_dir"
semver=$(php -v | head -n 1 | cut -f 2 -d ' ')
if [[ ! "$version" =~ $old_versions ]]; then configure_pecl >/dev/null 2>&1; fi
add_log "$tick" "PHP" "$status PHP $semver"

View File

@ -10,18 +10,14 @@ Function Add-Blackfire() {
$no_dot_version = $version.replace('.', '') $no_dot_version = $version.replace('.', '')
$extension_version = $extension.split('-')[1] $extension_version = $extension.split('-')[1]
if ($extension_version -notmatch "\S") { if ($extension_version -notmatch "\S") {
if($version -lt '7.0') { $extension_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).probe.php
$extension_version = '1.50.0'
} else {
$extension_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).probe.php
}
} }
if (Test-Path $ext_dir\blackfire.dll) { if (Test-Path $ext_dir\blackfire.dll) {
Enable-PhpExtension -Extension blackfire -Path $php_dir Enable-PhpExtension -Extension blackfire -Path $php_dir
$status="Enabled" $status="Enabled"
} else { } else {
$nts = if (!$installed.ThreadSafe) { "_nts" } else { "" } $nts = if (!$installed.ThreadSafe) { "_nts" } else { "" }
Invoke-WebRequest -Uri "https://packages.blackfire.io/binaries/blackfire-php/${extension_version}/blackfire-php-windows_${arch}-php-${no_dot_version}${nts}.dll" -OutFile $ext_dir\blackfire.dll > $null 2>&1 Invoke-WebRequest -UseBasicParsing -Uri "https://packages.blackfire.io/binaries/blackfire-php/${extension_version}/blackfire-php-windows_${arch}-php-${no_dot_version}${nts}.dll" -OutFile $ext_dir\blackfire.dll > $null 2>&1
Enable-PhpExtension -Extension blackfire -Path $php_dir Enable-PhpExtension -Extension blackfire -Path $php_dir
$status="Installed and enabled" $status="Installed and enabled"
} }

View File

@ -5,16 +5,12 @@ add_blackfire() {
no_dot_version=${version/./} no_dot_version=${version/./}
platform=$(uname -s | tr '[:upper:]' '[:lower:]') platform=$(uname -s | tr '[:upper:]' '[:lower:]')
extension_version=$(echo "$extension" | cut -d '-' -f 2) extension_version=$(echo "$extension" | cut -d '-' -f 2)
blackfire_ini_file="${pecl_file:-${ini_file[@]}}" blackfire_ini_file="${scan_dir:?}/50-blackfire.ini"
if ! shared_extension blackfire; then if [ ! -e "${ext_dir:?}/blackfire.so" ]; then
if [ "$extension_version" = "blackfire" ]; then if [ "$extension_version" = "blackfire" ]; then
if [[ ${version:?} =~ 5.[3-6] ]]; then extension_version=$(curl -sSL https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)
extension_version='1.50.0'
else
extension_version=$(get -s -n "" https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)
fi
fi fi
get -q -n "${ext_dir:?}/blackfire.so" https://packages.blackfire.io/binaries/blackfire-php/"$extension_version"/blackfire-php-"$platform"_amd64-php-"$no_dot_version".so >/dev/null 2>&1 sudo curl -o "${ext_dir:?}/blackfire.so" "${curl_opts[@]:?}" https://packages.blackfire.io/binaries/blackfire-php/"$extension_version"/blackfire-php-"$platform"_amd64-php-"$no_dot_version".so >/dev/null 2>&1
fi fi
echo "extension=blackfire.so" | sudo tee -a "$blackfire_ini_file" >/dev/null 2>&1 echo "extension=blackfire.so" | sudo tee -a "$blackfire_ini_file" >/dev/null 2>&1
add_extension_log "$extension-$extension_version" "Installed and enabled" add_extension_log "$extension-$extension_version" "Installed and enabled"

View File

@ -1,43 +0,0 @@
# Function to install libraries required by couchbase
add_couchbase_libs() {
if [ "$(uname -s)" = "Linux" ]; then
trunk="https://github.com/couchbase/libcouchbase/releases"
if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then
release="2.10.9"
else
release="$(curl -sL $trunk/latest | grep -Eo "libcouchbase-[0-9]+\.[0-9]+\.[0-9]+" | head -n 1 | cut -d'-' -f 2)"
fi
deb_url="$trunk/download/$release/libcouchbase-${release}_ubuntu${VERSION_ID/./}_${VERSION_CODENAME}_amd64.tar"
get -q -n /tmp/libcouchbase.tar "$deb_url"
sudo tar -xf /tmp/libcouchbase.tar -C /tmp
install_packages libev4 libevent-dev
sudo dpkg -i /tmp/libcouchbase-*/*.deb
else
if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then
brew install libcouchbase@2
brew link --overwrite --force libcouchbase@2
else
brew install libcouchbase
fi
fi
}
# Function to add couchbase.
add_couchbase() {
add_couchbase_libs >/dev/null 2>&1
enable_extension "couchbase" "extension"
if check_extension "couchbase"; then
add_log "${tick:?}" "couchbase" "Enabled"
else
if [[ "${version:?}" =~ ${old_versions:?} ]]; then
pecl_install couchbase-2.2.3 >/dev/null 2>&1
elif [[ "${version:?}" =~ 5.6|7.[0-1] ]]; then
pecl_install couchbase-2.6.2 >/dev/null 2>&1
elif [[ "${version:?}" =~ 7.2 ]]; then
pecl_install couchbase-3.0.4 >/dev/null 2>&1
else
pecl_install couchbase >/dev/null 2>&1
fi
add_extension_log "couchbase" "Installed and enabled"
fi
}

View File

@ -1,60 +0,0 @@
# Function to log license details.
add_license_log() {
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "$ext" "Click to read the $ext related license information"
printf "Cubrid CCI package is required for %s extension.\n" "$ext"
printf "The extension %s and Cubrid CCI are provided under the license linked below.\n" "$ext"
printf "Refer to: \033[35;1m%s \033[0m\n" "https://github.com/CUBRID/cubrid-cci/blob/develop/COPYING"
echo "::endgroup::"
}
# Function to setup gcc-7 and g++-7
setup_compiler() {
if ! command -v gcc-7 >/dev/null || ! command -v g++-7 >/dev/null; then
add_ppa ubuntu-toolchain-r/test
add_packages gcc-7 g++-7 -y
fi
printf "gcc g++" | xargs -d ' ' -I {} sudo update-alternatives --install /usr/bin/{} {} /usr/bin/{}-7 7
}
# Function to set cubrid repo for the extension.
set_cubrid_repo() {
case "${ext:?}" in
"cubrid") cubrid_repo="cubrid-php";;
"pdo_cubrid") cubrid_repo="cubrid-pdo";;
esac
}
# Function to set cubrid branch for a PHP version.
set_cubrid_branch() {
case "${version:?}" in
5.[3-6]) cubrid_branch="RB-9.3.0";;
*) cubrid_branch="develop";;
esac
}
add_cubrid_helper() {
ext=$1
enable_extension "$ext" extension
if ! check_extension "$ext"; then
status='Installed and enabled'
set_cubrid_repo
set_cubrid_branch
patch_phpize
read -r "${ext}_PREFIX_CONFIGURE_OPTS" <<< "CFLAGS=-Wno-implicit-function-declaration"
read -r "${ext}_CONFIGURE_OPTS" <<< "--with-php-config=$(command -v php-config)"
add_extension_from_source "$ext" https://github.com CUBRID "$cubrid_repo" "$cubrid_branch" extension
restore_phpize
fi
}
# Function to add cubrid and pdo_cubrid.
add_cubrid() {
ext=$1
status='Enabled'
add_cubrid_helper "$ext" >/dev/null 2>&1
add_extension_log "$ext" "$status"
check_extension "$ext" && add_license_log
}
# shellcheck source=.
. "${scripts:?}"/ext/patches/phpize.sh

View File

@ -1,109 +0,0 @@
<?php
/**
* Class for a map of extensions and their dependent extensions.
*
* Class ExtensionMap
*/
class ExtensionMap {
/** @var string Directory in which shared extensions are stored. */
private $extension_dir;
/** @var string File extension for PHP extension file. */
private $file_extension;
/** @var string Prefix in PHP extension file. */
private $file_prefix;
/** @var string String to store the map */
private $map;
/**
* ExtensionMap constructor.
*/
function __construct() {
$this->extension_dir = ini_get('extension_dir');
$this->file_extension = (PHP_OS == 'WINNT' ? '.dll' : '.so');
$this->file_prefix = (PHP_OS == 'WINNT' ? 'php_' : '');
$this->map = '';
}
/**
* Function to check if a shared extension file exists.
*
* @param string $extension
* @return bool
*/
public function checkSharedExtension($extension) {
$extension_file = $this->extension_dir. DIRECTORY_SEPARATOR . $this->file_prefix . $extension . $this->file_extension;
return file_exists($extension_file);
}
/**
* Function to get all shared extensions.
*
* @return string[]
*/
public function getSharedExtensions() {
$files = scandir($this->extension_dir);
$extensions = array_diff($files, array('.','..'));
$filter_pattern = "/$this->file_extension|$this->file_prefix/";
return array_map(function ($extension) use($filter_pattern) {
return preg_replace($filter_pattern, '', $extension);
}, $extensions);
}
/**
* Function to patch dependencies if there are any bugs in Reflection data.
*
* @param string $extension
* @param array $dependencies
* @return array
*/
public function patchDependencies($extension, $dependencies) {
// memcached 2.2.0 has no dependencies in reflection data.
if($extension == 'memcached') {
$dependencies = array_unique(array_merge($dependencies, array('igbinary', 'json', 'msgpack')));
}
return $dependencies;
}
/**
* Function to add extension to the map.
*
* @param string $extension
* @throws ReflectionException
*/
public function addExtensionToMap($extension) {
// PHP 5.3 does not allow using $this.
$self = $this;
$ref = new ReflectionExtension($extension);
$dependencies = array_keys(array_map('strtolower', $ref->getDependencies()));
$dependencies = $this->patchDependencies($extension, $dependencies);
$dependencies = array_filter($dependencies, function ($dependency) use ($self) {
return $self->checkSharedExtension($dependency);
});
$self->map .= $extension . ': ' . implode(' ', $dependencies) . PHP_EOL;
}
/**
* Function to print the map of shared extensions and their dependent extensions.
*
* @return string
*/
public function __toString() {
$extensions = array_map('strtolower', $this->getSharedExtensions());
foreach ($extensions as $extension) {
try {
$this->addExtensionToMap($extension);
} catch (ReflectionException $e) {
}
}
return $this->map;
}
}
$extension_map = new ExtensionMap();
echo $extension_map;

View File

@ -1,20 +0,0 @@
Function Add-Choco() {
try {
if($null -eq (Get-Command -Name choco.exe -ErrorAction SilentlyContinue)) {
# Source: https://docs.chocolatey.org/en-us/choco/setup
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}
} catch { }
}
Function Add-Firebird() {
Add-Choco > $null 2>&1
choco install firebird -params '/ClientAndDevTools' -y --force > $null 2>&1
if((Get-ChildItem $env:ProgramFiles\**\**\fbclient.dll | Measure-Object).Count -eq 1) {
Add-Extension pdo_firebird
} else {
Add-Log $cross pdo_firebird "Could not install pdo_firebird on PHP $( $installed.FullVersion )"
}
}

View File

@ -1,35 +0,0 @@
add_firebird_client_darwin() {
firebird_tag='R3_0_7'
pkg_name=$(get -s -n "" https://github.com/FirebirdSQL/firebird/releases/tag/"$firebird_tag" | grep -Eo "Firebird-.*.pkg" | head -n 1)
get -q -e "/tmp/firebird.pkg" https://github.com/FirebirdSQL/firebird/releases/download/"$firebird_tag"/"$pkg_name"
sudo installer -pkg /tmp/firebird.pkg -target /
sudo mkdir -p /opt/firebird/include /opt/firebird/lib
sudo find /Library/Frameworks/Firebird.framework -name '*.h' -exec cp "{}" /opt/firebird/include \;
sudo find /Library/Frameworks/Firebird.framework -name '*.dylib' -exec cp "{}" /opt/firebird/lib \;
}
add_firebird_helper() {
firebird_dir=$1
tag="$(php_src_tag)"
export PDO_FIREBIRD_CONFIGURE_OPTS="--with-pdo-firebird=$firebird_dir"
export PDO_FIREBIRD_LINUX_LIBS="firebird-dev"
export PDO_FIREBIRD_PATH="ext/pdo_firebird"
add_extension_from_source pdo_firebird https://github.com php php-src "$tag" extension get
}
add_firebird() {
enable_extension pdo_firebird
if ! check_extension pdo_firebird; then
if [ "$(uname -s)" = "Linux" ]; then
if [[ "${version:?}" =~ 5.3|${nightly_versions:?} ]]; then
add_firebird_helper /usr >/dev/null 2>&1
else
add_pdo_extension firebird >/dev/null 2>&1
fi
else
add_firebird_client_darwin >/dev/null 2>&1
add_firebird_helper /opt/firebird >/dev/null 2>&1
fi
add_extension_log pdo_firebird "Installed and enabled"
fi
}

View File

@ -1,16 +1,17 @@
# Helper function to add gearman extension. # Helper function to add gearman extension.
add_gearman_helper() { add_gearman_helper() {
add_ppa ondrej/pkg-gearman sudo "${debconf_fix:?}" add-apt-repository ppa:ondrej/pkg-gearman -y
install_packages libgearman-dev if [ -e "${ext_dir:?}/gearman.so" ] && [ "$DISTRIB_RELEASE" != "16.04" ]; then
enable_extension gearman extension ${apt_install:?} libgearman-dev
if ! check_extension gearman; then echo "extension=gearman.so" | sudo tee -a "${scan_dir:?}/20-gearman.ini" >/dev/null 2>&1
else
status="Installed and enabled" status="Installed and enabled"
if [[ "${version:?}" =~ 5.[3-5] ]]; then if [ "$DISTRIB_RELEASE" = "16.04" ]; then
pecl_install gearman-1.1.2 sudo "${debconf_fix:?}" apt-get update -y
${apt_install:?} php"${version:?}"-gearman
else else
install_packages php"${version:?}"-gearman || pecl_install gearman ${apt_install:?} libgearman-dev php"${version:?}"-gearman
fi fi
enable_extension gearman extension
fi fi
} }

View File

@ -1,17 +0,0 @@
# Helper function to compile and install geos
add_geos_helper() {
export GEOS_LINUX_LIBS='libgeos-dev'
export GEOS_DARWIN_LIBS='geos'
add_extension_from_source geos https://github.com libgeos php-geos 1.0.0 extension get
}
# Function to add geos
add_geos() {
enable_extension "geos" "extension"
if check_extension "geos"; then
add_log "${tick:?}" "geos" "Enabled"
else
add_geos_helper >/dev/null 2>&1
add_extension_log "geos" "Installed and enabled"
fi
}

View File

@ -1,55 +0,0 @@
Function Get-ICUUrl() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
$icu_version,
[Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()]
$arch,
[Parameter(Position = 2, Mandatory = $true)]
[ValidateNotNull()]
$vs_version
)
$trunk = "https://windows.php.net"
$urls=@("${trunk}/downloads/php-sdk/deps/${vs_version}/${arch}", "${trunk}/downloads/php-sdk/deps/archives/${vs_version}/${arch}")
foreach ($url in $urls) {
$web_content = Invoke-WebRequest -Uri $url
foreach ($link in $web_content.Links) {
if ($link -match "/.*ICU-${icu_version}.*/") {
return $trunk + $link.HREF
}
}
}
}
Function Repair-ICU() {
$icu = deplister $ext_dir\php_http.dll | Select-String "icu[a-z]+(\d+).dll,([A-Z]+)" | Foreach-Object { $_.Matches }
if($icu -and $icu.Groups[2].Value -ne 'OK') {
$vs = "vs" + $installed.VCVersion
if ($installed.VCVersion -lt 16) {
$vs = "vc" + $installed.VCVersion
}
$zip_url = Get-ICUUrl $icu.Groups[1].Value $installed.Architecture $vs
if ($zip_url -ne '') {
New-Item -Path "$php_dir" -Name "icu" -ItemType "directory" -Force > $null 2>&1
Invoke-WebRequest -Uri $zip_url -OutFile "$php_dir\icu\icu.zip"
Expand-Archive -Path $php_dir\icu\icu.zip -DestinationPath $php_dir\icu -Force
Get-ChildItem $php_dir\icu\bin -Filter *.dll | Copy-Item -Destination $php_dir -Force
}
}
}
Function Add-Http() {
Add-Extension raphf >$null 2>&1
if($version -lt '8.0') {
Add-Extension propro >$null 2>&1
}
Add-Extension pecl_http >$null 2>&1
Repair-ICU
try {
php --ri "http" 2> $null | Out-Null
Add-Log $tick "http" "Installed and enabled"
} catch {
Add-Log $cross "http" "Could not install http on PHP $( $installed.FullVersion )"
}
}

View File

@ -1,120 +0,0 @@
# Function to get http version for a PHP version.
get_http_version() {
if [[ ${version:?} =~ 5.[3-6] ]]; then
echo "pecl_http-2.6.0"
elif [[ ${version:?} =~ 7.[0-4] ]]; then
echo "pecl_http-3.2.4"
else
echo "pecl_http-$(get_pecl_version "pecl_http" "stable")"
fi
}
# Function to enable http extension.
enable_http() {
enable_extension propro extension
enable_extension raphf extension
if (! [[ ${version:?} =~ ${jit_versions:?} ]] && check_extension propro && check_extension raphf) ||
( [[ ${version:?} =~ ${jit_versions:?} ]] && check_extension raphf); then
enable_extension http extension
fi
}
# Function to install extensions.
add_extension_helper() {
if [ "$os" = "Linux" ]; then
add_extension "$1" extension
else
add_brew_extension "$1" extension
fi
}
# Function to install http dependencies.
add_http_dependencies() {
if [[ ${version:?} =~ ${old_versions:?} ]]; then
add_pecl_extension raphf 1.1.2 extension
add_pecl_extension propro 1.0.2 extension
elif [[ ${version:?} =~ 5.6|7.[0-4] ]]; then
add_extension_helper propro
add_extension_helper raphf
else
add_extension_helper raphf
fi
}
# Function to get configure options for http.
get_http_configure_opts() {
if [ "$os" = 'Linux' ]; then
for lib in zlib libbrotli libcurl libevent libicu libidn2 libidn libidnkit2 libidnkit; do
http_opts+=( "--with-http-$lib-dir=/usr" )
done
else
http_opts+=( "--with-http-zlib-dir=$(xcrun --show-sdk-path)/usr" )
http_opts+=( "--with-http-libbrotli-dir=$(brew --prefix brotli)" )
http_opts+=( "--with-http-libcurl-dir=$(brew --prefix curl)" )
http_opts+=( "--with-http-libicu-dir=$(brew --prefix icu4c)" )
http_opts+=( "--with-http-libevent-dir=$(brew --prefix libevent)" )
http_opts+=( "--with-http-libidn2-dir=$(brew --prefix libidn2)" )
fi
}
# Compile and install http explicitly.
# This is done as pecl compiles raphf and propro as well.
add_http_helper() {
ext=$1
http_opts=() && get_http_configure_opts
export HTTP_PREFIX_CONFIGURE_OPTS="CFLAGS=-Wno-implicit-function-declaration"
http_configure_opts="--with-http --with-php-config=$(command -v php-config) ${http_opts[*]}"
export HTTP_CONFIGURE_OPTS="$http_configure_opts"
export HTTP_LINUX_LIBS="zlib1g libbrotli-dev libcurl4-openssl-dev libevent-dev libicu-dev libidn2-dev"
export HTTP_DARWIN_LIBS="brotli curl icu4c libevent libidn2"
if [[ "${version:?}" =~ ${nightly_versions:?} ]]; then
add_extension_from_source http https://github.com m6w6 ext-http master extension
else
add_extension_from_source pecl_http https://pecl.php.net http http "${ext##*-}" extension pecl
fi
}
# Function to setup latest http extension.
add_http_latest() {
enable_http
if ! check_extension http; then
add_http_dependencies
if [ "$os" = "Linux" ]; then
if ! [[ "${version:?}" =~ ${old_versions:?}|${nightly_versions:?} ]]; then
install_packages "php$version-http"
else
add_http_helper "$(get_http_version)" "$os"
fi
else
if ! [[ "${version:?}" =~ ${old_versions:?} ]]; then
add_brew_extension pecl_http extension
fi
fi
status="Installed and enabled"
fi
}
# Function to setup http extension given a version.
add_http_version() {
ext=$1
enable_http
if [ "x$(php -r "echo phpversion('http');")" != "x${ext##*-}" ]; then
disable_extension_helper http >/dev/null
add_http_helper pecl_http-"${ext##*-}" "$os"
status="Installed and enabled"
fi
}
# Function to setup http extension
add_http() {
ext=$1
status="Enabled"
if [[ "$ext" =~ ^(pecl_http|http)$ ]]; then
add_http_latest >/dev/null 2>&1
else
add_http_version "$ext" >/dev/null 2>&1
fi
add_extension_log "http" "$status"
}
os="$(uname -s)"

View File

@ -1,23 +0,0 @@
# Function to install ICU
install_icu() {
icu=$1
if [ "$(php -i | grep "ICU version =>" | sed -e "s|.*=> s*||")" != "$icu" ]; then
get -q -n /tmp/icu.tar.zst "https://github.com/shivammathur/icu-intl/releases/download/icu4c/icu4c-$icu.tar.zst"
sudo tar -I zstd -xf /tmp/icu.tar.zst -C /usr/local
sudo cp -r /usr/local/icu/lib/* /usr/lib/x86_64-linux-gnu/
fi
}
# Function to add ext-intl with the given version of ICU
add_intl() {
icu=$(echo "$1" | cut -d'-' -f 2)
supported_version=$(get -s -n "" https://api.github.com/repos/shivammathur/icu-intl/releases | grep -Po "${icu//./\\.}" | head -n 1)
if [ "$icu" != "$supported_version" ]; then
add_log "${cross:?}" "intl" "ICU $icu is not supported"
else
install_icu "$icu" >/dev/null 2>&1
get -q -n "${ext_dir:?}/intl.so" "https://github.com/shivammathur/icu-intl/releases/download/intl/php${version:?}-intl-$icu.so"
enable_extension intl extension
add_extension_log intl "Installed and enabled with ICU $icu"
fi
}

View File

@ -19,7 +19,7 @@ Function Add-Ioncube() {
if (-not($installed.ThreadSafe)) { if (-not($installed.ThreadSafe)) {
$ts_part = "_nonts" $ts_part = "_nonts"
} }
Invoke-WebRequest -Uri "https://downloads.ioncube.com/loader_downloads/ioncube_loaders_win$ts_part`_vc$vc`_$arch_part.zip" -OutFile $ext_dir\ioncube.zip Invoke-WebRequest -UseBasicParsing -Uri "https://downloads.ioncube.com/loader_downloads/ioncube_loaders_win$ts_part`_vc$vc`_$arch_part.zip" -OutFile $ext_dir\ioncube.zip
Expand-Archive -Path $ext_dir\ioncube.zip -DestinationPath $ext_dir -Force Expand-Archive -Path $ext_dir\ioncube.zip -DestinationPath $ext_dir -Force
Copy-Item $ext_dir\ioncube\ioncube_loader_win_$version.dll $ext_dir\php_ioncube.dll Copy-Item $ext_dir\ioncube\ioncube_loader_win_$version.dll $ext_dir\php_ioncube.dll
} }

View File

@ -7,11 +7,11 @@ add_license_log() {
# Function to install ioncube. # Function to install ioncube.
add_ioncube() { add_ioncube() {
if ! shared_extension ioncube; then if [ ! -e "${ext_dir:?}/ioncube.so" ]; then
status='Installed and enabled' status='Installed and enabled'
os_name='lin' && [ "$(uname -s)" = "Darwin" ] && os_name='mac' os_name='lin' && [ "$(uname -s)" = "Darwin" ] && os_name='mac'
get -s -n "" https://downloads.ioncube.com/loader_downloads/ioncube_loaders_"$os_name"_x86-64.tar.gz | tar -xzf - -C /tmp curl "${curl_opts[@]:?}" https://downloads.ioncube.com/loader_downloads/ioncube_loaders_"$os_name"_x86-64.tar.gz | tar -xzf - -C /tmp
sudo mv /tmp/ioncube/ioncube_loader_"$os_name"_"${version:?}".so "${ext_dir:?}/ioncube.so" sudo mv /tmp/ioncube/ioncube_loader_"$os_name"_"${version:?}".so "$ext_dir/ioncube.so"
fi fi
echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini" >/dev/null 2>&1 echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini" >/dev/null 2>&1
add_extension_log "ioncube" "$status" add_extension_log "ioncube" "$status"

View File

@ -14,14 +14,14 @@ Function Add-InstantClient() {
if ($arch -eq 'x86') { if ($arch -eq 'x86') {
$suffix = 'nt' $suffix = 'nt'
} }
Invoke-WebRequest -Uri https://download.oracle.com/otn_software/nt/instantclient/instantclient-basiclite-$suffix.zip -OutFile $php_dir\instantclient.zip Invoke-WebRequest -UseBasicParsing -Uri https://download.oracle.com/otn_software/nt/instantclient/instantclient-basiclite-$suffix.zip -OutFile $php_dir\instantclient.zip
Expand-Archive -Path $php_dir\instantclient.zip -DestinationPath $php_dir -Force Expand-Archive -Path $php_dir\instantclient.zip -DestinationPath $php_dir -Force
Copy-Item $php_dir\instantclient*\* $php_dir Copy-Item $php_dir\instantclient*\* $php_dir
} }
} }
# Function to install oci8 and pdo_oci. # Function to install oci8 and pdo_oci.
Function Add-Oci() { Function Add-OCI() {
Param ( Param (
[Parameter(Position = 0, Mandatory = $true)] [Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
@ -35,21 +35,16 @@ Function Add-Oci() {
if ($extension -eq "pdo_oci") { if ($extension -eq "pdo_oci") {
Enable-PhpExtension pdo_oci -Path $php_dir Enable-PhpExtension pdo_oci -Path $php_dir
} else { } else {
if(-not(Test-Path $ext_dir\php_oci8.dll)) { $status = 'Installed and enabled'
$status = 'Installed and enabled' $ociVersion = '2.2.0'
$ociVersion = Get-PeclPackageVersion oci8 -MinimumStability stable -MaximumStability stable | Select-Object -First 1 if ($version -eq '7.0') {
if ($version -eq '7.0') { $ociVersion = '2.1.8'
$ociVersion = '2.1.8' } elseif ($version -lt '7.0') {
} elseif ($version -lt '7.0') { $ociVersion = '2.0.12'
$ociVersion = '2.0.12'
} elseif ($version -lt '8.0') {
$ociVersion = '2.2.0'
}
$ociUrl = Get-PeclArchiveUrl oci8 $ociVersion $installed
Invoke-WebRequest -Uri $ociUrl -OutFile $php_dir\oci8.zip
Expand-Archive -Path $php_dir\oci8.zip -DestinationPath $ext_dir -Force
} }
$ociUrl = Get-PeclArchiveUrl oci8 $ociVersion $installed
Invoke-WebRequest -UseBasicParsing -Uri $ociUrl -OutFile $php_dir\oci8.zip
Expand-Archive -Path $php_dir\oci8.zip -DestinationPath $ext_dir -Force
Add-Content -Value "`r`nextension=php_oci8.dll" -Path $php_dir\php.ini Add-Content -Value "`r`nextension=php_oci8.dll" -Path $php_dir\php.ini
} }
Add-Log $tick $extension $status Add-Log $tick $extension $status

View File

@ -7,10 +7,20 @@ add_license_log() {
echo "::endgroup::" echo "::endgroup::"
} }
# Function to get the tag for a php version.
get_tag() {
master_version='8.0'
tag='master'
if [ ! "${version:?}" = "$master_version" ]; then
tag="php-$(php -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-')"
fi
echo "$tag"
}
# Function to install instantclient and SDK. # Function to install instantclient and SDK.
add_client() { add_client() {
sudo mkdir -p -m 777 "$oracle_home"
if [ ! -e "$oracle_client" ]; then if [ ! -e "$oracle_client" ]; then
sudo mkdir -p -m 777 "$oracle_home" "$oracle_client"
for package in basiclite sdk; do for package in basiclite sdk; do
if [ "$os" = 'Linux' ]; then if [ "$os" = 'Linux' ]; then
libs='/usr/lib/' libs='/usr/lib/'
@ -23,29 +33,81 @@ add_client() {
arch='macos' arch='macos'
lib_ext='dylib' lib_ext='dylib'
fi fi
get -q -n "/opt/oracle/$package.zip" "https://download.oracle.com/otn_software/$os_name/instantclient/instantclient-$package-$arch.zip" curl -o "/opt/oracle/$package.zip" "${curl_opts[@]:?}" "https://download.oracle.com/otn_software/$os_name/instantclient/instantclient-$package-$arch.zip"
unzip -o "/opt/oracle/$package.zip" -d "$oracle_home" unzip "/opt/oracle/$package.zip" -d "$oracle_home"
done done
for icdir in /opt/oracle/instantclient_*; do sudo ln -sf /opt/oracle/instantclient*/*.$lib_ext* $libs
sudo mv "$icdir"/* "$oracle_client"/ sudo ln -sf /opt/oracle/instantclient* "$oracle_client"
done fi
sudo ln -sf /opt/oracle/instantclient/*.$lib_ext* $libs }
# Function to get PHP source.
get_php() {
[ ! -d "/opt/oracle/php-src-$tag" ] && curl "${curl_opts[@]}" "https://github.com/php/php-src/archive/$tag.tar.gz" | tar xzf - -C "$oracle_home/"
}
# Function to get phpize location on darwin.
get_phpize() {
if [[ "$version" =~ 5.[3-5] ]]; then
echo '/opt/local/bin/phpize'
else
echo "/usr/local/bin/$(readlink /usr/local/bin/phpize)"
fi
}
# Function to patch phpize to link to php headers on darwin.
patch_phpize() {
if [ "$os" = "Darwin" ]; then
sudo cp "$phpize_orig" "$phpize_orig.bck"
sudo sed -i '' 's~includedir=.*~includedir="$(xcrun --show-sdk-path)/usr/include/php"~g' "$phpize_orig"
fi
}
# Function to restore phpize.
restore_phpize() {
if [ "$os" = "Darwin" ]; then
sudo mv "$phpize_orig.bck" "$phpize_orig" || true
fi
}
# Function to patch pdo_oci.
patch_pdo_oci_config() {
curl -O "${curl_opts[@]}" https://raw.githubusercontent.com/php/php-src/master/ext/pdo_oci/config.m4
sudo sed -i '' "/PHP_CHECK_PDO_INCLUDES/d" config.m4 || sudo sed -i "/PHP_CHECK_PDO_INCLUDES/d" config.m4
}
# Function to install the dependencies.
add_dependencies() {
if [ "$os" = 'Linux' ]; then
if [ "${runner:?}" = "self-hosted" ]; then
${apt_install:?} autoconf automake libaio-dev gcc g++ php"$version"-dev
else
update_lists
${apt_install:?} php"$version"-dev
fi
sudo update-alternatives --set php-config /usr/bin/php-config"$version"
sudo update-alternatives --set phpize /usr/bin/phpize"$version"
fi fi
} }
# Function to install oci8 and pdo_oci. # Function to install oci8 and pdo_oci.
add_oci_helper() { add_oci_helper() {
if ! shared_extension "$ext"; then if ! [ -e "${ext_dir:?}/$ext.so" ]; then
status='Installed and enabled' status='Installed and enabled'
read -r "${ext}_LINUX_LIBS" <<< "libaio-dev" phpize_orig=$(get_phpize)
read -r "${ext}_CONFIGURE_OPTS" <<< "--with-php-config=$(command -v php-config) --with-${ext/_/-}=instantclient,$oracle_client" tag=$(get_tag)
read -r "${ext}_PATH" <<< "ext/$ext" get_php
patch_phpize patch_phpize
add_extension_from_source "$ext" https://github.com php php-src "$(php_src_tag)" extension get (
cd "/opt/oracle/php-src-$tag/ext/$ext" || exit 1
[ "$ext" = "pdo_oci" ] && patch_pdo_oci_config
sudo phpize && ./configure --with-php-config="$(command -v php-config)" --with-"${ext/_/-}"=instantclient,"$oracle_client"
sudo make -j"$(nproc)"
sudo cp ./modules/* "$ext_dir/"
)
restore_phpize restore_phpize
else
enable_extension "$ext" extension
fi fi
echo "extension=$ext.so" | sudo tee "${scan_dir:?}/99-$ext.ini"
} }
# Function to add oci extension oci8 and pdo_oci. # Function to add oci extension oci8 and pdo_oci.
@ -56,10 +118,8 @@ add_oci() {
oracle_client=$oracle_home/instantclient oracle_client=$oracle_home/instantclient
os=$(uname -s) os=$(uname -s)
add_client >/dev/null 2>&1 add_client >/dev/null 2>&1
add_dependencies >/dev/null 2>&1
add_oci_helper >/dev/null 2>&1 add_oci_helper >/dev/null 2>&1
add_extension_log "$ext" "$status" add_extension_log "$ext" "$status"
check_extension "$ext" && add_license_log check_extension "$ext" && add_license_log
} }
# shellcheck source=.
. "${scripts:?}"/ext/patches/phpize.sh

View File

@ -1,11 +0,0 @@
patch_firebird() {
if [[ "${version:?}" =~ ${old_versions:?} ]]; then
sudo sed -i '' '/PHP_CHECK_PDO_INCLUDES/d' config.m4 2>/dev/null || sudo sed -i '/PHP_CHECK_PDO_INCLUDES/d' config.m4
fi
lib_arch=$(gcc -dumpmachine)
lib_dir=/usr/lib/"$lib_arch"
if [ -d "$lib_dir" ]; then
sudo ln -sf "$lib_dir"/libfbclient.so.2 /usr/lib/libfbclient.so
sudo ln -sf "$lib_dir"/libib_util.so /usr/lib/
fi
}

View File

@ -1,7 +0,0 @@
patch_geos() {
if [ "$(php -r "echo PHP_VERSION_ID;")" -ge 70000 ]; then
sed -i~ -e "s/, ce->name/, ZSTR_VAL(ce->name)/; s/ulong /zend_ulong /" geos.c
fi
get -q -n /tmp/php8.patch https://git.remirepo.net/cgit/rpms/php/php-geos.git/plain/0003-add-all-arginfo-and-fix-build-with-PHP-8.patch
patch -p1 < /tmp/php8.patch 2>/dev/null || true
}

View File

@ -1,11 +0,0 @@
patch_pecl_http() {
if [ "$(uname -s)" = 'Darwin' ] && ! [[ ${version:?} =~ ${old_versions:?} ]]; then
if [[ ${version:?} =~ 5.6|7.[0-4] ]]; then
sed -i '' -e "s|ext/propro|$(brew --prefix propro@"${version:?}")/include/php/ext/propro@${version:?}|" "./src/php_http_api.h"
fi
sed -i '' -e "s|ext/raphf|$(brew --prefix raphf@"${version:?}")/include/php/ext/raphf@${version:?}|" "./src/php_http_api.h"
if [ "${version:?}" = "5.6" ]; then
sed -i '' -e "s|\$abs_srcdir|\$abs_srcdir ${brew_prefix:?}/include|" -e "s|/ext/propro|/php/ext/propro@5.6|" -e "s|/ext/raphf|/php/ext/raphf@5.6|" "./config9.m4"
fi
fi
}

View File

@ -1,6 +0,0 @@
patch_pdo_oci() {
get -q -n config.m4 https://raw.githubusercontent.com/php/php-src/PHP-8.0/ext/pdo_oci/config.m4
if [[ ${version:?} =~ 5.[3-6] ]]; then
sudo sed -i '' "/PHP_CHECK_PDO_INCLUDES/d" config.m4 2>/dev/null || sudo sed -i "/PHP_CHECK_PDO_INCLUDES/d" config.m4
fi
}

View File

@ -1,26 +0,0 @@
# Function to get phpize location on darwin.
get_phpize() {
if [[ "${version:?}" =~ 5.[3-5] ]]; then
echo '/opt/local/bin/phpize'
else
echo "/usr/local/bin/$(readlink /usr/local/bin/phpize)"
fi
}
# Function to patch phpize to link to php headers on darwin.
patch_phpize() {
if [ "$(uname -s)" = "Darwin" ]; then
sudo cp "$phpize_orig" "$phpize_orig.bck"
sudo sed -i '' 's~includedir=.*~includedir="$(xcrun --show-sdk-path)/usr/include/php"~g' "$phpize_orig"
fi
}
# Function to restore phpize.
restore_phpize() {
if [ "$os" = "Darwin" ]; then
sudo mv "$phpize_orig.bck" "$phpize_orig" || true
fi
}
os="$(uname -s)"
phpize_orig="$(get_phpize)"

View File

@ -1,4 +0,0 @@
patch_protobuf() {
mkdir -p third_party/wyhash
cp ../../../../third_party/wyhash/* third_party/wyhash
}

View File

@ -1,13 +1,13 @@
# Function to install phalcon # Function to install phalcon
Function Add-PhalconHelper() { Function Add-PhalconHelper() {
if ($extension_version -eq '4') { if ($extension_version -eq '4') {
Install-Phpextension -Extension phalcon -MinimumStability stable -Path $php_dir Install-Phpextension phalcon -MinimumStability stable -Path $php_dir
} else { } else {
$domain = 'https://github.com' $domain = 'https://github.com'
$nts = if (!$installed.ThreadSafe) { "_nts" } else { "" } $nts = if (!$installed.ThreadSafe) { "_nts" } else { "" }
$match = Invoke-WebRequest -Uri "$domain/phalcon/cphalcon/releases/v3.4.5" | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`"" $match = Invoke-WebRequest -UseBasicParsing -Uri $domain/phalcon/cphalcon/releases | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`""
$zip_file = $match.Matches[0].Groups[1].Value $zip_file = $match.Matches[0].Groups[1].Value
Invoke-WebRequest -Uri $domain/$zip_file -OutFile $ENV:RUNNER_TOOL_CACHE\phalcon.zip > $null 2>&1 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 Expand-Archive -Path $ENV:RUNNER_TOOL_CACHE\phalcon.zip -DestinationPath $ENV:RUNNER_TOOL_CACHE\phalcon -Force > $null 2>&1
Copy-Item -Path "$ENV:RUNNER_TOOL_CACHE\phalcon\php_phalcon.dll" -Destination "$ext_dir\php_phalcon.dll" Copy-Item -Path "$ENV:RUNNER_TOOL_CACHE\phalcon\php_phalcon.dll" -Destination "$ext_dir\php_phalcon.dll"
Enable-PhpExtension -Extension phalcon -Path $php_dir Enable-PhpExtension -Extension phalcon -Path $php_dir
@ -30,7 +30,7 @@ Function Add-Phalcon() {
if (Test-Path $ext_dir\php_psr.dll) { if (Test-Path $ext_dir\php_psr.dll) {
Enable-PhpExtension -Extension psr -Path $php_dir Enable-PhpExtension -Extension psr -Path $php_dir
} else { } else {
Install-Phpextension -Extension psr -MinimumStability stable -Path $php_dir Install-Phpextension psr -MinimumStability stable -Path $php_dir
} }
} }
@ -49,6 +49,7 @@ Function Add-Phalcon() {
} }
Add-Log $tick $extension $status Add-Log $tick $extension $status
} catch [Exception] { } catch [Exception] {
Write-Output $_.Exception|format-list -force
Add-Log $cross $extension "Could not install $extension on PHP $($installed.FullVersion)" Add-Log $cross $extension "Could not install $extension on PHP $($installed.FullVersion)"
} }
} }

View File

@ -1,16 +1,22 @@
# Helper function to add phalcon. # Helper function to add phalcon.
add_phalcon_helper() { add_phalcon_helper() {
status='Installed and enabled' status='Installed and enabled'
if [ "$extension" = "phalcon4" ]; then if [ "$os_name" = "Linux" ]; then
install_packages "php${version:?}-psr" "php${version:?}-$extension" update_lists
${apt_install:?} "php${version:?}-$extension"
else else
install_packages "php${version:?}-$extension" phalcon_ini_file=${ini_file:?}
sed -i '' '/extension.*psr/d' "${ini_file:?}"
brew tap shivammathur/homebrew-phalcon
brew install phalcon@"${version:?}"_"$extension_major_version"
sudo cp /usr/local/opt/psr@"${version:?}"/psr.so "${ext_dir:?}"
sudo cp /usr/local/opt/phalcon@"${version:?}"_"$extension_major_version"/phalcon.so "${ext_dir:?}"
fi fi
} }
# Function to add phalcon3. # Function to add phalcon3.
add_phalcon3() { add_phalcon3() {
if shared_extension phalcon; then if [ -e "${ext_dir:?}/phalcon.so" ]; then
phalcon_version=$(php -d="extension=phalcon.so" -r "echo phpversion('phalcon');" | cut -d'.' -f 1) phalcon_version=$(php -d="extension=phalcon.so" -r "echo phpversion('phalcon');" | cut -d'.' -f 1)
if [ "$phalcon_version" != "$extension_major_version" ]; then if [ "$phalcon_version" != "$extension_major_version" ]; then
add_phalcon_helper add_phalcon_helper
@ -24,10 +30,10 @@ add_phalcon3() {
# Function to add phalcon4. # Function to add phalcon4.
add_phalcon4() { add_phalcon4() {
if shared_extension phalcon && ! php -m | grep -i -q -w psr; then if [ -e "${ext_dir:?}/psr.so" ] && ! php -m | grep -i -q -w psr; then
echo "extension=psr.so" | sudo tee -a "${ini_file:?}" echo "extension=psr.so" | sudo tee -a "${ini_file:?}"
fi fi
if shared_extension phalcon; then if [ -e "$ext_dir/phalcon.so" ]; then
if php -m | grep -i -q -w psr; then if php -m | grep -i -q -w psr; then
phalcon_version=$(php -d="extension=phalcon" -r "echo phpversion('phalcon');" | cut -d'.' -f 1) phalcon_version=$(php -d="extension=phalcon" -r "echo phpversion('phalcon');" | cut -d'.' -f 1)
if [ "$phalcon_version" != "$extension_major_version" ]; then if [ "$phalcon_version" != "$extension_major_version" ]; then
@ -47,7 +53,8 @@ add_phalcon4() {
add_phalcon() { add_phalcon() {
extension=$1 extension=$1
status='Enabled' status='Enabled'
phalcon_ini_file="${pecl_file:-${ini_file[@]}}" os_name=$(uname -s)
phalcon_ini_file="${scan_dir:?}/50-phalcon.ini"
extension_major_version=${extension: -1} extension_major_version=${extension: -1}
if [ "$extension_major_version" = "4" ]; then if [ "$extension_major_version" = "4" ]; then
add_phalcon4 >/dev/null 2>&1 add_phalcon4 >/dev/null 2>&1

View File

@ -1,144 +0,0 @@
# Function to parse extension environment variables
parse_args() {
extension=$1
suffix=$(echo "$2" | tr '[:lower:]' '[:upper:]')
up_ext_name=$(echo "$extension" | tr '[:lower:]' '[:upper:]')
var="${extension}_${suffix}"
up_var="${up_ext_name}_${suffix}"
! [[ "$suffix" =~ .*PREFIX|LIBS|PATH.* ]] && hyp='-'
output=$(echo "${!var} ${!up_var}" | sed "s/, *$hyp/ $hyp/g" | sed -E "s/^,|,$//g")
echo "$output" | xargs -n 1 | sort | uniq | xargs
}
# Function to log if a library is installed
add_lib_log() {
lib=$1
if check_lib "$lib"; then
add_log "${tick:?}" "$lib" "Installed"
else
add_log "${cross:?}" "$lib" "Could not install $lib"
fi
}
# Function to check if a library is installed
check_lib() {
lib=$1
if [ "$(uname -s)" = "Linux" ]; then
[ "x$(dpkg -s "$lib" 2>/dev/null | grep Status)" != "x" ]
else
[ "x$(find "${brew_prefix:?}"/Cellar -maxdepth 1 -name "$lib")" != "x" ]
fi
}
# Function to add a library on linux
add_linux_libs() {
lib=$1
if ! check_lib "$lib"; then
install_packages "$lib" >/dev/null 2>&1 || true
fi
add_lib_log "$lib"
}
# Function to add a library on macOS
add_darwin_libs() {
lib=$1
if ! check_lib "$lib"; then
brew install "$lib" >/dev/null 2>&1 || true
if [[ "$lib" = *@* ]]; then
brew link --overwrite --force "$lib" >/dev/null 2>&1 || true
fi
fi
add_lib_log "$lib"
}
# Function to add required libraries
add_libs() {
all_libs=("$@")
for lib in "${all_libs[@]}"; do
if [ "$(uname -s)" = "Linux" ]; then
add_linux_libs "$lib"
else
add_darwin_libs "$lib"
fi
done
}
# Function to run command in a group
run_group() {
command=$1
log=$2
echo "$command" | sudo tee ./run_group.sh >/dev/null 2>&1
echo "::group::$log"
. ./run_group.sh
rm ./run_group.sh
echo "::endgroup::"
}
patch_extension() {
extension=$1
if [ -e "${scripts:?}"/ext/patches/"$extension".sh ]; then
# shellcheck source=.
. "${scripts:?}"/ext/patches/"$extension".sh
patch_"${extension}"
fi
}
fetch_extension() {
fetch=$1
if [ "$fetch" = "clone" ]; then
run_group "git clone -nv $url/$org/$repo /tmp/$repo-$release" "git clone"
cd /tmp/"$repo-$release" || exit 1
git checkout -q "$release"
cd "$sub_dir" || exit 1
if [ -e .gitmodules ]; then
jobs="$(grep -c "\[submodule" .gitmodules)"
run_group "git submodule update --jobs $jobs --init --recursive" "git submodule"
fi
elif [ "$fetch" = "get" ]; then
get -q -n /tmp/"$extension".tar.gz "$url/$org/$repo/archive/$release.tar.gz"
tar -xzf /tmp/"$extension".tar.gz -C /tmp
cd /tmp/"$repo"-"$release"/"$sub_dir" || exit
elif [ "$fetch" = "pecl" ]; then
source="pecl"
pecl_name=${extension/http/pecl_http}
get -q -n /tmp/"$pecl_name".tgz https://pecl.php.net/get/"$pecl_name"-"$release".tgz
tar -xzf /tmp/"$pecl_name".tgz -C /tmp
cd /tmp/"$pecl_name"-"$release" || exit
fi
}
# Function to install extension from a git repository
add_extension_from_source() {
extension="${1/pecl_/}"
url=$2
org=$3
repo=$4
release=$5
prefix=$6
fetch=${7:-clone}
slug="$extension-$release"
source="$url/$org/$repo"
libraries="$(parse_args "$extension" LIBS) $(parse_args "$extension" "$(uname -s)"_LIBS)"
opts="$(parse_args "$extension" CONFIGURE_OPTS)"
prefix_opts="$(parse_args "$extension" CONFIGURE_PREFIX_OPTS)"
suffix_opts="$(parse_args "$extension" CONFIGURE_SUFFIX_OPTS)"
sub_dir="$(parse_args "$extension" PATH)"
step_log "Setup $slug"
(
add_devtools phpize >/dev/null 2>&1
disable_extension_helper "$extension"
fetch_extension "$fetch"
if ! [ "$(find . -maxdepth 1 -name '*.m4' -exec grep -H 'PHP_NEW_EXTENSION' {} \; | wc -l)" != "0" ]; then
add_log "${cross:?}" "$source" "$source does not have a PHP extension"
else
[[ -n "${libraries// }" ]] && run_group "add_libs $libraries" "add libraries"
patch_extension "$extension" >/dev/null 2>&1
run_group "phpize" "phpize"
run_group "sudo $prefix_opts ./configure $suffix_opts $opts" "configure"
run_group "sudo make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)" "make"
run_group "sudo make install" "make install"
enable_extension "$extension" "$prefix"
fi
)
add_extension_log "$slug" "Installed from $source and enabled"
}

View File

@ -1,61 +1,170 @@
# Function to setup environment for self-hosted runners. # Function to log start of a operation.
self_hosted_helper() { step_log() {
if ! command -v sudo >/dev/null; then message=$1
apt-get update printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
apt-get install -y sudo || add_log "${cross:?}" "sudo" "Could not install sudo" }
# Function to log result of a operation.
add_log() {
mark=$1
subject=$2
message=$3
if [ "$mark" = "$tick" ]; then
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
else
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
fi fi
}
# Function to log result of installing extension.
add_extension_log() {
extension=$1
status=$2
extension_name=$(echo "$extension" | cut -d '-' -f 1)
(
check_extension "$extension_name" && add_log "$tick" "$extension_name" "$status"
) || add_log "$cross" "$extension_name" "Could not install $extension on PHP $semver"
}
# Function to read env inputs.
read_env() {
. /etc/lsb-release
[[ -z "${update}" ]] && update='false' && UPDATE='false' || update="${update}"
[ "$update" = false ] && [[ -n ${UPDATE} ]] && update="${UPDATE}"
[[ -z "${runner}" ]] && runner='github' && RUNNER='github' || runner="${runner}"
[ "$runner" = false ] && [[ -n ${RUNNER} ]] && runner="${RUNNER}"
}
# Function to backup and cleanup package lists.
cleanup_lists() {
if [ ! -e /etc/apt/sources.list.d.save ]; then
sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
sudo mkdir /etc/apt/sources.list.d
sudo mv /etc/apt/sources.list.d.save/*ondrej*.list /etc/apt/sources.list.d/
trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/" exit
fi
}
# Function to add ppa:ondrej/php.
add_ppa() {
if ! apt-cache policy | grep -q ondrej/php; then
cleanup_lists
LC_ALL=C.UTF-8 sudo apt-add-repository ppa:ondrej/php -y
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
sudo "$debconf_fix" apt-get update
fi
fi
}
# Function to update the package lists.
update_lists() {
if [ ! -e /tmp/setup_php ]; then
[ "$DISTRIB_RELEASE" = "20.04" ] && add_ppa >/dev/null 2>&1
cleanup_lists
sudo "$debconf_fix" apt-get update >/dev/null 2>&1
echo '' | sudo tee "/tmp/setup_php" >/dev/null 2>&1
fi
}
# Function to setup environment for self-hosted runners.
self_hosted_setup() {
echo "Set disable_coredump false" | sudo tee -a /etc/sudo.conf
if ! command -v apt-fast >/dev/null; then if ! command -v apt-fast >/dev/null; then
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
trap "sudo rm -f /usr/bin/apt-fast 2>/dev/null" exit
fi fi
install_packages apt-transport-https ca-certificates curl file make jq unzip autoconf automake gcc g++ gnupg update_lists && $apt_install curl make software-properties-common unzip
add_ppa
} }
# Function to install a package # Function to configure PECL.
install_packages() { configure_pecl() {
packages=("$@") if [ "$pecl_config" = "false" ] && [ -e /usr/bin/pecl ]; then
[[ "${packages[*]}" =~ php ]] && add_ppa ondrej/php >/dev/null 2>&1
$apt_install "${packages[@]}" >/dev/null 2>&1 || (update_lists && $apt_install "${packages[@]}" >/dev/null 2>&1) for tool in pear pecl; do
sudo "$tool" config-set php_ini "$scan_dir"/99-pecl.ini
sudo "$tool" channel-update "$tool".php.net
done
pecl_config="true"
fi
} }
# Function to disable an extension. # Fuction to get the PECL version of an extension.
disable_extension_helper() { get_pecl_version() {
extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot)")"
pecl_rest='https://pecl.php.net/rest/r/'
response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
pecl_version=$(echo "$response" | grep -m 1 -Pio "(\d*\.\d*\.\d*$stability\d*)")
if [ ! "$pecl_version" ]; then
pecl_version=$(echo "$response" | grep -m 1 -Po "(\d*\.\d*\.\d*)")
fi
echo "$pecl_version"
}
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1 local extension=$1
local disable_dependents=${2:-false} yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
if [ "$disable_dependents" = "true" ]; then
disable_extension_dependents "$extension"
fi
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file[@]}" "$pecl_file"
sudo find "$ini_dir"/.. -name "*$extension.ini" -not -path "*mods-available*" -delete >/dev/null 2>&1 || true
} }
# Function to add PDO extension. # Function to check if an extension is loaded.
check_extension() {
extension=$1
if [ "$extension" != "mysql" ]; then
php -m | grep -i -q -w "$extension"
else
php -m | grep -i -q "$extension"
fi
}
# Function to delete extensions.
delete_extension() {
extension=$1
sudo sed -i "/$extension/d" "$ini_file"
sudo sed -i "/$extension/d" "$pecl_file"
sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
}
# Function to disable and delete extensions.
remove_extension() {
extension=$1
if check_extension "$extension"; then
if [[ ! "$version" =~ $old_versions ]] && [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
sudo phpdismod -v "$version" "$extension" >/dev/null 2>&1
fi
delete_extension "$extension"
(! check_extension "$extension" && add_log "$tick" ":$extension" "Removed") ||
add_log "$cross" ":$extension" "Could not remove $extension on PHP $semver"
else
add_log "$tick" ":$extension" "Could not find $extension on PHP $semver"
fi
}
# Function to enable existing extensions.
enable_extension() {
if ! check_extension "$1" && [ -e "$ext_dir/$1.so" ]; then
echo "$2=$1.so" >>"$pecl_file"
fi
}
# Funcion to add PDO extension.
add_pdo_extension() { add_pdo_extension() {
pdo_ext="pdo_$1" pdo_ext="pdo_$1"
if check_extension "$pdo_ext"; then if check_extension "$pdo_ext"; then
add_log "${tick:?}" "$pdo_ext" "Enabled" add_log "$tick" "$pdo_ext" "Enabled"
else else
ext=$1 read -r ext ext_name <<< "$1 $1"
ext_name=$1 sudo rm -rf "$scan_dir"/*pdo.ini >/dev/null 2>&1
if shared_extension pdo; then if ! check_extension "pdo" 2>/dev/null; then echo "extension=pdo.so" >> "$ini_file"; fi
disable_extension_helper pdo
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1
fi
if [ "$ext" = "mysql" ]; then if [ "$ext" = "mysql" ]; then
enable_extension "mysqlnd" "extension" enable_extension "mysqlnd" "extension"
ext_name='mysqli' ext_name="mysqli"
elif [ "$ext" = "dblib" ]; then
ext_name="sybase"
elif [ "$ext" = "firebird" ]; then
install_packages libfbclient2 >/dev/null 2>&1
enable_extension "pdo_firebird" "extension"
ext_name="interbase"
elif [ "$ext" = "sqlite" ]; then elif [ "$ext" = "sqlite" ]; then
ext="sqlite3" read -r ext ext_name <<< "sqlite3 sqlite3"
ext_name="sqlite3"
fi fi
add_extension "$ext_name" "extension" >/dev/null 2>&1 add_extension "$ext_name" "$apt_install php$version-$ext" "extension" >/dev/null 2>&1
add_extension "$pdo_ext" "extension" >/dev/null 2>&1 enable_extension "$pdo_ext" "extension"
add_extension_log "$pdo_ext" "Enabled" add_extension_log "$pdo_ext" "Enabled"
fi fi
} }
@ -63,79 +172,200 @@ add_pdo_extension() {
# Function to add extensions. # Function to add extensions.
add_extension() { add_extension() {
extension=$1 extension=$1
prefix=$2 install_command=$2
prefix=$3
enable_extension "$extension" "$prefix" enable_extension "$extension" "$prefix"
if check_extension "$extension"; then if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled" add_log "$tick" "$extension" "Enabled"
else else
if [[ "$version" =~ ${nightly_versions:?} ]]; then if [[ "$version" =~ 5.[4-5] ]]; then
pecl_install "$extension" install_command="update_lists && ${install_command/5\.[4-5]-$extension/5-$extension=$release_version}"
else
install_packages "php$version-$extension" || pecl_install "$extension"
fi fi
eval "$install_command" >/dev/null 2>&1 ||
(update_lists && eval "$install_command" >/dev/null 2>&1) || pecl_install "$extension"
add_extension_log "$extension" "Installed and enabled" add_extension_log "$extension" "Installed and enabled"
fi fi
sudo chmod 777 "${ini_file[@]}" sudo chmod 777 "$ini_file"
}
# Function to install a PECL version.
add_pecl_extension() {
extension=$1
pecl_version=$2
prefix=$3
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot).* ]]; then
pecl_version=$(get_pecl_version "$extension" "$pecl_version")
fi
if ! check_extension "$extension" && [ -e "$ext_dir/$extension.so" ]; then
echo "$prefix=$ext_dir/$extension.so" >>"$pecl_file"
fi
ext_version=$(php -r "echo phpversion('$extension');")
if [ "$ext_version" = "$pecl_version" ]; then
add_log "$tick" "$extension" "Enabled"
else
delete_extension "$extension"
pecl_install "$extension-$pecl_version"
add_extension_log "$extension-$pecl_version" "Installed and enabled"
fi
}
# Function to pre-release extensions using PECL.
add_unstable_extension() {
extension=$1
stability=$2
prefix=$3
pecl_version=$(get_pecl_version "$extension" "$stability")
add_pecl_extension "$extension" "$pecl_version" "$prefix"
}
# Function to install extension from source
add_extension_from_source() {
extension=$1
repo=$2
release=$3
args=$4
prefix=$5
(
add_devtools
delete_extension "$extension"
curl -o /tmp/"$extension".tar.gz "${curl_opts[@]}" https://github.com/"$repo"/archive/"$release".tar.gz
tar xf /tmp/"$extension".tar.gz -C /tmp
cd /tmp/"$extension-$release" || exit 1
phpize && ./configure "$args" && make && sudo make install
enable_extension "$extension" "$prefix"
) >/dev/null 2>&1
add_extension_log "$extension-$release" "Installed and enabled"
}
# 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
composer -q global config process-timeout 0
echo "::add-path::/home/$USER/.composer/vendor/bin"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
fi
}
# Function to setup a remote tool.
add_tool() {
url=$1
tool=$2
tool_path="$tool_path_dir/$tool"
if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path"
fi
if [ "$tool" = "composer" ]; then
IFS="," read -r -a urls <<< "$url"
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
else
status_code=$(sudo curl -s -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
configure_composer "$tool_path"
elif [ "$tool" = "cs2pr" ]; then
sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
elif [ "$tool" = "phan" ]; then
add_extension fileinfo "$apt_install php$version-fileinfo" extension >/dev/null 2>&1
add_extension ast "$apt_install php-ast" extension >/dev/null 2>&1
elif [ "$tool" = "phive" ]; then
add_extension curl "$apt_install php$version-curl" extension >/dev/null 2>&1
add_extension mbstring "$apt_install php$version-mbstring" extension >/dev/null 2>&1
add_extension xml "$apt_install php$version-xml" extension >/dev/null 2>&1
elif [ "$tool" = "wp-cli" ]; then
sudo cp -p "$tool_path" "$tool_path_dir"/wp
fi
add_log "$tick" "$tool" "Added"
else
add_log "$cross" "$tool" "Could not setup $tool"
fi
}
# Function to setup a tool using composer.
add_composertool() {
tool=$1
release=$2
prefix=$3
(
composer global require "$prefix$release" >/dev/null 2>&1 &&
add_log "$tick" "$tool" "Added"
) || add_log "$cross" "$tool" "Could not setup $tool"
} }
# Function to setup phpize and php-config. # Function to setup phpize and php-config.
add_devtools() { add_devtools() {
tool=$1 if ! [ -e "/usr/bin/phpize$version" ] || ! [ -e "/usr/bin/php-config$version" ]; then
if ! command -v "$tool$version" >/dev/null; then update_lists && $apt_install php"$version"-dev php"$version"-xml >/dev/null 2>&1
install_packages "php$version-dev" "php$version-xml"
fi fi
switch_version "phpize" "php-config" sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
add_log "${tick:?}" "$tool" "Added $tool $semver" sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
configure_pecl >/dev/null 2>&1
} }
# Function to setup the nightly build from shivammathur/php-builder # Function to setup the nightly build from master branch.
setup_nightly() { setup_master() {
run_script "php-builder" "${runner:?}" "$version" curl "${curl_opts[@]}" "$github"/php-builder/releases/latest/download/install.sh | bash -s "$runner"
} }
# Function to setup PHP 5.3, PHP 5.4 and PHP 5.5. # Function to setup PHP 5.3, PHP 5.4 and PHP 5.5.
setup_old_versions() { setup_old_versions() {
run_script "php5-ubuntu" "$version" curl "${curl_opts[@]}" "$github"/php5-ubuntu/releases/latest/download/install.sh | bash -s "$version"
configure_pecl
release_version=$(php -v | head -n 1 | cut -d' ' -f 2)
} }
# Function to add PECL. # Function to add PECL.
add_pecl() { add_pecl() {
add_devtools phpize >/dev/null 2>&1 add_devtools >/dev/null 2>&1
if ! command -v pecl >/dev/null; then if [ ! -e /usr/bin/pecl ]; then
install_packages php-pear $apt_install php-pear >/dev/null 2>&1 || update_lists && $apt_install php-pear >/dev/null 2>&1
fi fi
configure_pecl >/dev/null 2>&1 configure_pecl >/dev/null 2>&1
pear_version=$(get_tool_version "pecl" "version") add_log "$tick" "PECL" "Added"
add_log "${tick:?}" "PECL" "Added PECL $pear_version"
} }
# Function to switch versions of PHP binaries. # Function to switch versions of PHP binaries.
switch_version() { switch_version() {
tools=("$@") && ! (( ${#tools[@]} )) && tools+=(pear pecl php phar phar.phar php-cgi php-config phpize phpdbg) for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
to_wait=()
for tool in "${tools[@]}"; do
if [ -e "/usr/bin/$tool$version" ]; then if [ -e "/usr/bin/$tool$version" ]; then
sudo update-alternatives --set "$tool" /usr/bin/"$tool$version" & sudo update-alternatives --set $tool /usr/bin/"$tool$version"
to_wait+=($!)
fi fi
done done
wait "${to_wait[@]}" }
# Function to get PHP version in semver format.
php_semver() {
if [ ! "$version" = "$master_version" ]; 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 install packaged PHP # Function to install packaged PHP
add_packaged_php() { add_packaged_php() {
if [ "$runner" = "self-hosted" ] || [ "${use_package_cache:-true}" = "false" ]; then if [ "$runner" = "self-hosted" ] || [ "${use_package_cache:-true}" = "false" ]; then
update_lists update_lists
IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")" IFS=' ' read -r -a packages <<< "$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
install_packages "${packages[@]}" $apt_install "${packages[@]}"
else else
run_script "php-ubuntu" "$version" curl "${curl_opts[@]}" "$github"/php-ubuntu/releases/latest/download/install.sh | bash -s "$version"
fi fi
} }
# Function to update PHP. # Function to update PHP.
update_php() { update_php() {
initial_version=$(php_semver) initial_version=$(php_semver)
use_package_cache="false"
add_packaged_php add_packaged_php
updated_version=$(php_semver) updated_version=$(php_semver)
if [ "$updated_version" != "$initial_version" ]; then if [ "$updated_version" != "$initial_version" ]; then
@ -147,9 +377,9 @@ update_php() {
# Function to install PHP. # Function to install PHP.
add_php() { add_php() {
if [[ "$version" =~ ${nightly_versions:?} ]]; then if [ "$version" = "$master_version" ]; then
setup_nightly setup_master
elif [[ "$version" =~ ${old_versions:?} ]]; then elif [[ "$version" =~ $old_versions ]]; then
setup_old_versions setup_old_versions
else else
add_packaged_php add_packaged_php
@ -157,80 +387,62 @@ add_php() {
status="Installed" status="Installed"
} }
# Function to ini file for pear and link it to each SAPI. # Variables
link_pecl_file() { tick="✓"
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1 cross="✗"
for file in "${ini_file[@]}"; do pecl_config="false"
sapi_scan_dir="$(realpath -m "$(dirname "$file")")/conf.d" version=$1
[ "$sapi_scan_dir" != "$scan_dir" ] && ! [ -h "$sapi_scan_dir" ] && sudo ln -sf "$pecl_file" "$sapi_scan_dir/99-pecl.ini" master_version="8.0"
done old_versions="5.[3-5]"
} debconf_fix="DEBIAN_FRONTEND=noninteractive"
github="https://github.com/shivammathur"
apt_install="sudo $debconf_fix apt-fast install -y"
tool_path_dir="/usr/local/bin"
curl_opts=(-sL)
existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
# Function to get extra version. read_env
php_extra_version() { if [ "$runner" = "self-hosted" ]; then
if [ -e /etc/php/"$version"/COMMIT ]; then if [[ "$version" =~ $old_versions ]]; then
echo " ($(cat "/etc/php/$version/COMMIT"))" add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner"
exit 1
else
self_hosted_setup >/dev/null 2>&1
fi fi
} fi
# Function to Setup PHP # Setup PHP
setup_php() { step_log "Setup PHP"
step_log "Setup PHP" sudo mkdir -p /var/run /run/php
sudo mkdir -m 777 -p /var/run /run/php if [ "$existing_version" != "$version" ]; then
if [ "$(php-config --version 2>/dev/null | cut -c 1-3)" != "$version" ]; then if [ ! -e "/usr/bin/php$version" ]; then
if [ ! -e "/usr/bin/php$version" ]; then add_php >/dev/null 2>&1
add_php >/dev/null 2>&1
else
if [ "${update:?}" = "true" ]; then
update_php >/dev/null 2>&1
else
status="Switched to"
fi
fi
if ! [[ "$version" =~ ${old_versions:?}|${nightly_versions:?} ]]; then
switch_version >/dev/null 2>&1
fi
else else
if [ "$update" = "true" ]; then if [ "$update" = "true" ]; then
update_php >/dev/null 2>&1 update_php >/dev/null 2>&1
else else
status="Found" status="Switched to"
fi fi
fi fi
if ! command -v php"$version" >/dev/null; then if ! [[ "$version" =~ $old_versions ]]; then
add_log "$cross" "PHP" "Could not setup PHP $version" switch_version >/dev/null 2>&1
exit 1
fi fi
semver=$(php_semver) else
extra_version=$(php_extra_version) if [ "$update" = "true" ]; then
ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||") update_php >/dev/null 2>&1
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||") else
ini_dir=$(php --ini | grep "(php.ini)" | sed -e "s|.*: s*||") status="Found"
pecl_file="$scan_dir"/99-pecl.ini if [ "$version" = "$master_version" ]; then
export ext_dir switch_version >/dev/null 2>&1
mapfile -t ini_file < <(sudo find "$ini_dir/.." -name "php.ini" -exec readlink -m {} +) fi
link_pecl_file fi
configure_php fi
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}"
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
echo "::set-output name=php-version::$semver"
add_log "${tick:?}" "PHP" "$status PHP $semver$extra_version"
}
# Variables semver=$(php_semver)
version=$1 ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
dist=$2 scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
debconf_fix="DEBIAN_FRONTEND=noninteractive" ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
apt_install="sudo $debconf_fix apt-fast install -y --no-install-recommends" pecl_file="$scan_dir"/99-pecl.ini
scripts="${dist}"/../src/scripts echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir"
. /etc/os-release add_log "$tick" "PHP" "$status PHP $semver"
# shellcheck source=.
. "${scripts:?}"/ext/source.sh
. "${scripts:?}"/tools/ppa.sh
. "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/common.sh
read_env
self_hosted_setup
setup_php

View File

@ -1,26 +0,0 @@
Function Add-ToolsHelper() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
$tool
)
if($tool -eq "codeception") {
Copy-Item $composer_bin\codecept.bat -Destination $composer_bin\codeception.bat
} elseif($tool -eq "composer") {
Edit-ComposerConfig $bin_dir\$tool
} elseif($tool -eq "cs2pr") {
(Get-Content $bin_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $bin_dir/cs2pr
} elseif($tool -eq "phan") {
Add-Extension fileinfo >$null 2>&1
Add-Extension ast >$null 2>&1
} elseif($tool -eq "phive") {
Add-Extension xml >$null 2>&1
} elseif($tool -eq "symfony-cli") {
Add-ToProfile $current_profile "symfony" "New-Alias symfony $bin_dir\symfony-cli.exe"
Add-ToProfile $current_profile "symfony_cli" "New-Alias symfony-cli $bin_dir\symfony-cli.exe"
} elseif($tool -match "vapor-cli") {
Copy-Item $composer_bin\vapor.bat -Destination $composer_bin\vapor-cli.bat
} elseif($tool -eq "wp-cli") {
Copy-Item $bin_dir\wp-cli.bat -Destination $bin_dir\wp.bat
}
}

View File

@ -1,20 +0,0 @@
add_tools_helper() {
tool=$1
if [ "$tool" = "codeception" ]; then
sudo ln -s "${composer_bin:?}"/codecept "${composer_bin:?}"/codeception
elif [ "$tool" = "composer" ]; then
configure_composer "${tool_path:?}"
elif [ "$tool" = "cs2pr" ]; then
sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "${tool_path:?}" 2>/dev/null ||
sudo sed -i '' 's/\r$//; s/exit(9)/exit(0)/' "${tool_path:?}"
elif [ "$tool" = "phan" ]; then
add_extension fileinfo extension >/dev/null 2>&1
add_extension ast extension >/dev/null 2>&1
elif [ "$tool" = "phive" ]; then
add_extension curl extension >/dev/null 2>&1
add_extension mbstring extension >/dev/null 2>&1
add_extension xml extension >/dev/null 2>&1
elif [[ "$tool" =~ (symfony|vapor|wp)-cli ]]; then
sudo ln -s "${tool_path:?}" "${tool_path_dir:?}"/${tool%-*}
fi
}

View File

@ -1,19 +1,17 @@
# Function to add blackfire cli. # Function to add blackfire and blackfire-agent.
Function Add-Blackfire() { Function Add-Blackfire() {
$arch_name ='amd64' $agent_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).agent
if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') { $url = "https://packages.blackfire.io/binaries/blackfire-agent/${agent_version}/blackfire-agent-windows_${arch_name}.zip"
$arch_name = '386' Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $bin_dir\blackfire.zip >$null 2>&1
}
$cli_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).cli
$url = "https://packages.blackfire.io/binaries/blackfire/${cli_version}/blackfire-windows_${arch_name}.zip"
Invoke-WebRequest -Uri $url -OutFile $bin_dir\blackfire.zip >$null 2>&1
Expand-Archive -Path $bin_dir\blackfire.zip -DestinationPath $bin_dir -Force >$null 2>&1 Expand-Archive -Path $bin_dir\blackfire.zip -DestinationPath $bin_dir -Force >$null 2>&1
Add-ToProfile $current_profile 'blackfire' "New-Alias blackfire $bin_dir\blackfire.exe" Add-ToProfile $current_profile 'blackfire' "New-Alias blackfire $bin_dir\blackfire.exe"
Add-ToProfile $current_profile 'blackfire-agent' "New-Alias blackfire-agent $bin_dir\blackfire-agent.exe"
if ((Test-Path env:BLACKFIRE_SERVER_ID) -and (Test-Path env:BLACKFIRE_SERVER_TOKEN)) { if ((Test-Path env:BLACKFIRE_SERVER_ID) -and (Test-Path env:BLACKFIRE_SERVER_TOKEN)) {
blackfire agent:config --server-id=$env:BLACKFIRE_SERVER_ID --server-token=$env:BLACKFIRE_SERVER_TOKEN >$null 2>&1 blackfire-agent --register --server-id=$env:BLACKFIRE_SERVER_ID --server-token=$env:BLACKFIRE_SERVER_TOKEN >$null 2>&1
} }
if ((Test-Path env:BLACKFIRE_CLIENT_ID) -and (Test-Path env:BLACKFIRE_CLIENT_TOKEN)) { if ((Test-Path env:BLACKFIRE_CLIENT_ID) -and (Test-Path env:BLACKFIRE_CLIENT_TOKEN)) {
blackfire client:config --client-id=$env:BLACKFIRE_CLIENT_ID --client-token=$env:BLACKFIRE_CLIENT_TOKEN --ca-cert=$php_dir\ssl\cacert.pem >$null 2>&1 blackfire config --client-id=$env:BLACKFIRE_CLIENT_ID --client-token=$env:BLACKFIRE_CLIENT_TOKEN --ca-cert=$php_dir\ssl\cacert.pem >$null 2>&1
} }
Add-Log $tick "blackfire" "Added blackfire $cli_version" Add-Log $tick "blackfire" "Added"
Add-Log $tick "blackfire-agent" "Added"
} }

View File

@ -1,39 +1,34 @@
add_blackfire_linux() { add_blackfire_linux() {
sudo mkdir -p /var/run/blackfire sudo mkdir -p /var/run/blackfire
add_list debian/blackfire http://packages.blackfire.io/debian https://packages.blackfire.io/gpg.key any main sudo curl "${curl_opts[@]:?}" https://packages.blackfire.io/gpg.key | sudo apt-key add -
install_packages blackfire echo "deb http://packages.blackfire.io/debian any main" | sudo tee /etc/apt/sources.list.d/blackfire.list
sudo "${debconf_fix:?}" apt-get update
${apt_install:?} blackfire-agent
} }
add_blackfire_darwin() { add_blackfire_darwin() {
sudo mkdir -p /usr/local/var/run sudo mkdir -p /usr/local/var/run
add_brew_tap blackfireio/homebrew-blackfire brew tap --shallow blackfireio/homebrew-blackfire
brew install blackfire brew install blackfire-agent
} }
blackfire_config() { blackfire_config() {
if [[ -n $BLACKFIRE_SERVER_ID ]] && [[ -n $BLACKFIRE_SERVER_TOKEN ]]; then if [[ -n $BLACKFIRE_SERVER_ID ]] && [[ -n $BLACKFIRE_SERVER_TOKEN ]]; then
blackfire agent:config --server-id="$BLACKFIRE_SERVER_ID" --server-token="$BLACKFIRE_SERVER_TOKEN" sudo blackfire-agent --register --server-id="$BLACKFIRE_SERVER_ID" --server-token="$BLACKFIRE_SERVER_TOKEN"
if [ "$os" = "Linux" ]; then [ "$os" = "Linux" ] && sudo /etc/init.d/blackfire-agent restart
if [ -d /run/systemd/system ]; then [ "$os" = "Darwin" ] && brew services start blackfire-agent
sudo systemctl start blackfire-agent
else
sudo service blackfire-agent start
fi
elif [ "$os" = "Darwin" ]; then
brew services start blackfire
fi
fi fi
if [[ -n $BLACKFIRE_CLIENT_ID ]] && [[ -n $BLACKFIRE_CLIENT_TOKEN ]]; then if [[ -n $BLACKFIRE_CLIENT_ID ]] && [[ -n $BLACKFIRE_CLIENT_TOKEN ]]; then
blackfire client:config --client-id="$BLACKFIRE_CLIENT_ID" --client-token="$BLACKFIRE_CLIENT_TOKEN" blackfire config --client-id="$BLACKFIRE_CLIENT_ID" --client-token="$BLACKFIRE_CLIENT_TOKEN"
fi fi
} }
# Function to add blackfire cli. # Function to add blackfire and blackfire-agent.
add_blackfire() { add_blackfire() {
os="$(uname -s)" os="$(uname -s)"
[ "$os" = "Linux" ] && add_blackfire_linux >/dev/null 2>&1 [ "$os" = "Linux" ] && add_blackfire_linux >/dev/null 2>&1
[ "$os" = "Darwin" ] && add_blackfire_darwin >/dev/null 2>&1 [ "$os" = "Darwin" ] && add_blackfire_darwin >/dev/null 2>&1
blackfire_config >/dev/null 2>&1 blackfire_config >/dev/null 2>&1
tool_version=$(get_tool_version "blackfire" "version") add_log "${tick:?}" "blackfire" "Added"
add_log "${tick:?}" "blackfire" "Added blackfire $tool_version" add_log "${tick:?}" "blackfire-agent" "Added"
} }

View File

@ -9,12 +9,11 @@ Function Add-Msys2() {
Function Add-Grpc_php_plugin() { Function Add-Grpc_php_plugin() {
$msys_location = Add-Msys2 $msys_location = Add-Msys2
$logs = . $msys_location\usr\bin\bash -l -c "pacman -S --noconfirm mingw-w64-x86_64-grpc" >$null 2>&1 . $msys_location\usr\bin\bash -l -c "pacman -S --noconfirm mingw-w64-x86_64-grpc" >$null 2>&1
$grpc_version = Get-ToolVersion 'Write-Output' "$logs" Write-Output "::add-path::$msys_location\mingw64\bin"
Write-Output "$msys_location\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8
Write-Output "::set-output name=grpc_php_plugin_path::$msys_location\mingw64\bin\grpc_php_plugin.exe" Write-Output "::set-output name=grpc_php_plugin_path::$msys_location\mingw64\bin\grpc_php_plugin.exe"
Add-ToProfile $current_profile 'grpc_php_plugin' "New-Alias grpc_php_plugin $msys_location\mingw64\bin\grpc_php_plugin.exe" Add-ToProfile $current_profile 'grpc_php_plugin' "New-Alias grpc_php_plugin $msys_location\mingw64\bin\grpc_php_plugin.exe"
Add-Log $tick "grpc_php_plugin" "Added grpc_php_plugin $grpc_version" Add-Log $tick "grpc_php_plugin" "Added"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "grpc_php_plugin" "Click to read the grpc_php_plugin related license information" printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "grpc_php_plugin" "Click to read the grpc_php_plugin related license information"
Write-Output (Invoke-WebRequest https://raw.githubusercontent.com/grpc/grpc/master/LICENSE).Content Write-Output (Invoke-WebRequest https://raw.githubusercontent.com/grpc/grpc/master/LICENSE).Content
Write-Output "::endgroup::" Write-Output "::endgroup::"

View File

@ -1,9 +1,13 @@
add_bazel() { add_bazel() {
if ! command -v bazel; then if [ ! "$(command -v bazel)" ]; then
if [ "$(uname -s)" = "Linux" ]; then os=$(uname -s)
add_list bazel/apt https://storage.googleapis.com/bazel-apt https://bazel.build/bazel-release.pub.gpg stable jdk1.8 if [ "$os" = "Linux" ]; then
install_packages bazel ${apt_install:?} curl gnupg
else curl "${curl_opts[@]:?}" https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo "${debconf_fix:?}" apt-get update -y
${apt_install:?} bazel
elif [ "$os" = "Darwin" ]; then
brew install bazel brew install bazel
fi fi
fi fi
@ -11,48 +15,37 @@ add_bazel() {
get_grpc_tag() { get_grpc_tag() {
if [ "$grpc_tag" = "latest" ]; then if [ "$grpc_tag" = "latest" ]; then
grpc_tag=$(get -s -n "" https://github.com/grpc/grpc/releases/latest | grep -Eo -m 1 "v[0-9]+\.[0-9]+\.[0-9]+" | head -n 1) grpc_tag=$(curl "${curl_opts[@]:?}" https://grpc.io/release)
else else
if [[ ${grpc_tag:0:1} != "v" ]] ; then grpc_tag="v$grpc_tag"; fi status_code=$(sudo curl -s -w "%{http_code}" -o /tmp/grpc.tmp "${curl_opts[@]:?}" "https://github.com/grpc/grpc/releases/tag/v$grpc_tag")
status_code=$(get -v -n /tmp/grpc.tmp "https://github.com/grpc/grpc/releases/tag/$grpc_tag") if [ "$status_code" = "200" ]; then
if [ "$status_code" != "200" ]; then grpc_tag="v$grpc_tag"
grpc_tag=$(get -s -n "" https://github.com/grpc/grpc/releases/latest | grep -Eo -m 1 "v[0-9]+\.[0-9]+\.[0-9]+" | head -n 1) else
grpc_tag=$(curl "${curl_opts[@]:?}" https://grpc.io/release)
fi fi
fi fi
} }
add_grpc_php_plugin_brew() {
brew install grpc
brew link --force --overwrite grpc >/dev/null 2>&1
grpc_tag="v$(brew info grpc | grep "grpc:" | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+")"
license_path="$(brew --prefix grpc)/LICENSE"
}
add_grpc_php_plugin_compile() {
get_grpc_tag
get -s -n "" "https://github.com/grpc/grpc/archive/$grpc_tag.tar.gz" | tar -xz -C /tmp
export DISABLE_BAZEL_WRAPPER=1
(
cd "/tmp/grpc-${grpc_tag:1}" || exit
add_bazel
./tools/bazel build src/compiler:grpc_php_plugin
sudo mv ./bazel-bin/src/compiler/grpc_php_plugin /usr/local/bin/grpc_php_plugin
sudo chmod a+x /usr/local/bin/grpc_php_plugin
license_path="/tmp/grpc-${grpc_tag:1}/LICENSE"
)
}
add_grpc_php_plugin() { add_grpc_php_plugin() {
grpc_tag=$1 grpc_tag=$1
license_path="" get_grpc_tag
if [ "$grpc_tag" = "latest" ]; then (
add_grpc_php_plugin_brew >/dev/null 2>&1 curl "${curl_opts[@]:?}" "https://github.com/grpc/grpc/archive/$grpc_tag.tar.gz" | tar -xz -C /tmp
else cd "/tmp/grpc-${grpc_tag:1}" || exit
add_grpc_php_plugin_compile >/dev/null 2>&1 add_bazel
fi echo "os: $os"
echo "::set-output name=grpc_php_plugin_path::$(command -v grpc_php_plugin)" echo "release: $DISTRIB_RELEASE"
add_log "${tick:?}" "grpc_php_plugin" "Added grpc_php_plugin ${grpc_tag:1}" if [ "$DISTRIB_RELEASE" = "16.04" ]; then
CC="$(command -v gcc)" CXX="$(command -v g++)" ./tools/bazel build src/compiler:grpc_php_plugin
else
./tools/bazel build src/compiler:grpc_php_plugin
fi
sudo mv ./bazel-bin/src/compiler/grpc_php_plugin /usr/local/bin/grpc_php_plugin
sudo chmod a+x /usr/local/bin/grpc_php_plugin
) >/dev/null 2>&1
echo "::set-output name=grpc_php_plugin_path::/usr/local/bin/grpc_php_plugin"
add_log "${tick:?}" "grpc_php_plugin" "Added"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "grpc_php_plugin" "Click to read the grpc_php_plugin related license information" printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "grpc_php_plugin" "Click to read the grpc_php_plugin related license information"
cat "$license_path" cat "/tmp/grpc-${grpc_tag:1}/LICENSE"
echo "::endgroup::" echo "::endgroup::"
} }

View File

@ -1,169 +0,0 @@
# Function to try to set ubuntu or debian version.
set_base_version_id() {
[[ "$ID" =~ ubuntu|debian ]] && return;
if ! [ -d "$dist_info_dir" ]; then
sudo mkdir -p "$dist_info_dir"
get -q -n "$dist_info_dir"/os_releases.csv https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/os_releases.csv
fi
for base in ubuntu debian; do
[[ "$ID_LIKE" =~ $base ]] && ID="$base" && VERSION_ID="$(grep -hr -m 1 "$VERSION_CODENAME" /usr/share/distro-info | cut -d ',' -f 1 | cut -d ' ' -f 1)" && break
done
}
# Function to try to set ubuntu or debian codename.
set_base_version_codename() {
[[ "$ID" =~ ubuntu|debian ]] && return;
if [[ "$ID_LIKE" =~ ubuntu ]]; then
[[ -n "$UBUNTU_CODENAME" ]] && VERSION_CODENAME="$UBUNTU_CODENAME" && return;
[ -e "$upstream_lsb" ] && VERSION_CODENAME=$(grep 'CODENAME' "$upstream_lsb" | cut -d '=' -f 2) && return;
VERSION_CODENAME=$(grep -E -m1 'deb .*ubuntu.com' "$list_file" | cut -d ' ' -f 3) && VERSION_CODENAME=${VERSION_CODENAME%-*}
elif [[ "$ID_LIKE" =~ debian ]] || command -v dpkg >/dev/null; then
ID_LIKE=debian
[[ -n "$DEBIAN_CODENAME" ]] && VERSION_CODENAME="$DEBIAN_CODENAME" && return;
update_lists && VERSION_CODENAME=$(apt-cache show tzdata | grep -m 1 Provides | cut -d '-' -f 2)
fi
}
# Function to set base os details
set_base_version() {
if [ -e /tmp/os-release ]; then
. /tmp/os-release
else
set_base_version_codename
set_base_version_id
printf "ID=%s\nVERSION_ID=%s\nVERSION_CODENAME=%s\n" "$ID" "$VERSION_ID" "$VERSION_CODENAME" | tee /tmp/os-release >/dev/null 2>&1
fi
}
# Helper function to update package lists.
update_lists_helper() {
list=$1
command -v sudo >/dev/null && SUDO=sudo
if [[ -n "$list" ]]; then
${SUDO} apt-get update -o Dir::Etc::sourcelist="$list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
else
${SUDO} apt-get update
fi
}
# Function to update the package lists.
update_lists() {
local ppa=${1:-}
local ppa_search=${2:-}
if [ ! -e /tmp/setup_php ] || [[ -n $ppa && -n $ppa_search ]]; then
if [[ -n "$ppa" && -n "$ppa_search" ]]; then
list="$list_dir"/"$(basename "$(grep -lr "$ppa_search" "$list_dir")")"
elif grep -Eq '^deb ' "$list_file"; then
list="$list_file"
fi
update_lists_helper "$list" >/dev/null 2>&1
echo '' | tee /tmp/setup_php >/dev/null 2>&1
fi
}
# Function to get fingerprint from an Ubuntu PPA.
ubuntu_fingerprint() {
ppa=$1
get -s -n "" "$lp_api"/~"${ppa%/*}"/+archive/"${ppa##*/}" | jq -r '.signing_key_fingerprint'
}
# Function to get fingerprint from a Debian PPA.
debian_fingerprint() {
ppa=$1
ppa_url=$2
package_dist=$3
release_pub=/tmp/"${ppa/\//-}".gpg
get -q -n "$release_pub" "$ppa_url"/dists/"$package_dist"/Release.gpg
gpg --list-packets "$release_pub" | grep -Eo 'fpr\sv4\s.*[a-zA-Z0-9]+' | head -n 1 | cut -d ' ' -f 3
}
# Function to add a GPG key.
add_key() {
ppa=${1:-ondrej/php}
ppa_url=$2
package_dist=$3
key_source=$4
key_file=$5
key_urls=("$key_source")
if [[ "$key_source" =~ launchpad.net|debian.org|setup-php.com ]]; then
fingerprint="$("${ID}"_fingerprint "$ppa" "$ppa_url" "$package_dist")"
sks_params="op=get&options=mr&exact=on&search=0x$fingerprint"
key_urls=("${sks[@]/%/\/pks\/lookup\?"$sks_params"}")
fi
[ ! -e "$key_source" ] && get -q -n "$key_file" "${key_urls[@]}"
if [[ "$(file "$key_file")" =~ .*('Public-Key (old)'|'Secret-Key') ]]; then
sudo gpg --batch --yes --dearmor "$key_file" >/dev/null 2>&1 && sudo mv "$key_file".gpg "$key_file"
fi
}
# Function to check if a PPA and its lists exist
check_lists() {
ppa=$1
ppa_search=$2
if grep -Eqr "$ppa_search" "$list_dir"; then
list_count="$(find /var/lib/apt/lists -name "*${ppa/\//_}*" | wc -l)"
if [ "$list_count" = "0" ]; then
update_lists "$ppa" "$ppa_search"
fi
return 0;
else
return 1;
fi
}
# Function to add a sources list.
add_list() {
ppa=${1-ondrej/php}
ppa_url=${2:-"$lp_ppa/$ppa/ubuntu"}
key_source=${3:-"$ppa_url"}
package_dist=${4:-"$VERSION_CODENAME"}
branches=${5:-main}
ppa_search="deb .*$ppa_url $package_dist .*$branches"
if check_lists "$ppa" "$ppa_search"; then
echo "Repository $ppa already exists";
else
arch=$(dpkg --print-architecture)
[ -e "$key_source" ] && key_file=$key_source || key_file="$key_dir"/"${ppa/\//-}"-keyring.gpg
add_key "$ppa" "$ppa_url" "$package_dist" "$key_source" "$key_file"
echo "deb [arch=$arch signed-by=$key_file] $ppa_url $package_dist $branches" | sudo tee -a "$list_dir"/"${ppa/\//-}".list >/dev/null 2>&1
update_lists "$ppa" "$ppa_search"
. /etc/os-release
fi
}
# Function to remove a PPA.
remove_list() {
ppa=${1-ondrej/php}
ppa_url=${2:-"$lp_ppa/$ppa/ubuntu"}
grep -lr "$ppa_url" "$list_dir" | xargs -n1 sudo rm -f
sudo rm -f "$key_dir"/"${ppa/\//-}"-keyring || true
}
# Function to add a PPA.
add_ppa() {
set_base_version
ppa=${1:-ondrej/php}
if [[ "$ID" = "ubuntu" || "$ID_LIKE" =~ ubuntu ]] && [[ "$ppa" =~ "ondrej/" ]]; then
add_list "$ppa"
elif [[ "$ID" = "debian" || "$ID_LIKE" =~ debian ]] && [[ "$ppa" =~ "ondrej/" ]]; then
add_list "$ppa" "$sury"/"${ppa##*/}"/ "$sury"/"${ppa##*/}"/apt.gpg
else
add_list "$ppa"
fi
. /etc/os-release
}
# Variables
list_file='/etc/apt/sources.list'
list_dir="$list_file.d"
upstream_lsb='/etc/upstream-release/lsb-release'
lp_api='https://api.launchpad.net/1.0'
lp_ppa='http://ppa.launchpad.net'
key_dir='/usr/share/keyrings'
dist_info_dir='/usr/share/distro-info'
sury='https://packages.sury.org'
sks=(
'https://keyserver.ubuntu.com'
'https://pgp.mit.edu'
'https://keys.openpgp.org'
)

View File

@ -27,11 +27,11 @@ Function Add-Protoc() {
$arch_num = '32' $arch_num = '32'
} }
$url = "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-$($protobuf_tag -replace 'v', '')-win$arch_num.zip" $url = "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-$($protobuf_tag -replace 'v', '')-win$arch_num.zip"
Invoke-WebRequest -Uri $url -OutFile $bin_dir\protoc.zip >$null 2>&1 Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $bin_dir\protoc.zip >$null 2>&1
Expand-Archive -Path $bin_dir\protoc.zip -DestinationPath $bin_dir\protoc -Force >$null 2>&1 Expand-Archive -Path $bin_dir\protoc.zip -DestinationPath $bin_dir\protoc -Force >$null 2>&1
Move-Item -Path $bin_dir\protoc\bin\protoc.exe -Destination $bin_dir\protoc.exe Move-Item -Path $bin_dir\protoc\bin\protoc.exe -Destination $bin_dir\protoc.exe
Add-ToProfile $current_profile 'protoc' "New-Alias protoc $bin_dir\protoc.exe" Add-ToProfile $current_profile 'protoc' "New-Alias protoc $bin_dir\protoc.exe"
Add-Log $tick "protoc" "Added protoc $($protobuf_tag -replace 'v', '')" Add-Log $tick "protoc" "Added"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information" printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information"
Write-Output (Invoke-WebRequest https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE).Content Write-Output (Invoke-WebRequest https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE).Content
Write-Output "::endgroup::" Write-Output "::endgroup::"

View File

@ -1,12 +1,12 @@
get_protobuf_tag() { get_protobuf_tag() {
if [ "$protobuf_tag" = "latest" ]; then if [ "$protobuf_tag" = "latest" ]; then
protobuf_tag=$(get -s -n "" https://github.com/protocolbuffers/protobuf/releases/latest 2<&1 | grep -m 1 -Eo "(v[0-9]+\.[0-9]+\.[0-9]+)" | head -n 1) protobuf_tag=$(curl "${curl_opts[@]:?}" https://github.com/protocolbuffers/protobuf/releases/latest 2<&1 | grep -m 1 -Eo "(v[0-9]+.[0-9]+.[0-9]+)" | head -n 1)
else else
status_code=$(get -v -n /tmp/protobuf.tmp "https://github.com/protocolbuffers/protobuf/releases/tag/v$protobuf_tag") status_code=$(sudo curl -s -w "%{http_code}" -o /tmp/protobuf.tmp "${curl_opts[@]:?}" "https://github.com/protocolbuffers/protobuf/releases/tag/v$protobuf_tag")
if [ "$status_code" = "200" ]; then if [ "$status_code" = "200" ]; then
protobuf_tag="v$protobuf_tag" protobuf_tag="v$protobuf_tag"
else else
protobuf_tag=$(get -s -n "" https://github.com/protocolbuffers/protobuf/releases/latest 2<&1 | grep -m 1 -Eo "(v[0-9]+\.[0-9]+\.[0-9]+)" | head -n 1) protobuf_tag=$(curl "${curl_opts[@]:?}" https://github.com/protocolbuffers/protobuf/releases/latest 2<&1 | grep -m 1 -Eo "(v[0-9]+.[0-9]+.[0-9]+)" | head -n 1)
fi fi
fi fi
} }
@ -17,11 +17,11 @@ add_protoc() {
( (
platform='linux' platform='linux'
[ "$(uname -s)" = "Darwin" ] && platform='osx' [ "$(uname -s)" = "Darwin" ] && platform='osx'
get -q -n /tmp/protobuf.zip "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-${protobuf_tag:1}-$platform-x86_64.zip" curl -o /tmp/protobuf.zip "${curl_opts[@]:?}" "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-${protobuf_tag:1}-$platform-x86_64.zip"
sudo unzip /tmp/protobuf.zip -d /usr/local/ sudo unzip /tmp/protobuf.zip -d /usr/local/
sudo chmod -R 777 /usr/local/bin/protoc /usr/local/include/google sudo chmod 777 /usr/local/bin/protoc -R /usr/local/include/google
) >/dev/null 2>&1 ) >/dev/null 2>&1
add_log "${tick:?}" "protoc" "Added protoc ${protobuf_tag:1}" add_log "${tick:?}" "protoc" "Added"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information" printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information"
curl "${curl_opts[@]:?}" https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE curl "${curl_opts[@]:?}" https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE
echo "::endgroup::" echo "::endgroup::"

View File

@ -3,12 +3,12 @@ param (
[ValidateNotNull()] [ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)] [ValidateLength(1, [int]::MaxValue)]
[string] [string]
$version = '8.0', $version = '7.4',
[Parameter(Position = 1, Mandatory = $true)] [Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)] [ValidateLength(1, [int]::MaxValue)]
[string] [string]
$dist $dir
) )
# Function to log start of a operation. # Function to log start of a operation.
@ -18,14 +18,8 @@ Function Step-Log($message) {
# Function to log result of a operation. # Function to log result of a operation.
Function Add-Log($mark, $subject, $message) { Function Add-Log($mark, $subject, $message) {
if ($mark -eq $tick) { $code = if ($mark -eq $cross) { "31" } else { "32" }
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $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
} else {
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $mark $subject $message
if($env:fail_fast -eq 'true') {
exit 1;
}
}
} }
# Function to add a line to a powershell profile safely. # Function to add a line to a powershell profile safely.
@ -70,95 +64,27 @@ Function Add-Path {
Get-PathFromRegistry Get-PathFromRegistry
} }
# Function to make sure printf is in PATH.
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 $bin_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe -Force > $null 2>&1
} else {
Invoke-WebRequest -Uri "$github/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$bin_dir\printf.zip"
Expand-Archive -Path $bin_dir\printf.zip -DestinationPath $bin_dir -Force
}
} else {
New-Item -Path $bin_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe" -Force > $null 2>&1
}
}
# Function to get a clean Powershell profile. # Function to get a clean Powershell profile.
Function Get-CleanPSProfile { Function Get-CleanPSProfile {
if(-not(Test-Path -LiteralPath $profile)) { if(-not(Test-Path -LiteralPath $profile)) {
New-Item -Path $profile -ItemType "file" -Force > $null 2>&1 New-Item -Path $profile -ItemType "file" -Force
} }
Set-Content $current_profile -Value '' Set-Content $current_profile -Value ''
Add-ToProfile $profile $current_profile.replace('\', '\\') ". $current_profile" Add-ToProfile $profile $current_profile.replace('\', '\\') ". $current_profile"
} }
# Function to install a powershell package from GitHub. # Function to install PhpManager.
Function Install-PSPackage() { Function Install-PhpManager() {
param( $repo = "mlocati/powershell-phpmanager"
[Parameter(Position = 0, Mandatory = $true)] $tag = (Invoke-RestMethod https://api.github.com/repos/$repo/tags)[0].Name
$package, $module_path = "$bin_dir\PhpManager\powershell-phpmanager-$tag\PhpManager\PhpManager.psm1"
[Parameter(Position = 1, Mandatory = $true)]
$psm1_path,
[Parameter(Position = 2, Mandatory = $true)]
$url,
[Parameter(Position = 3, Mandatory = $true)]
$cmdlet
)
$module_path = "$bin_dir\$psm1_path.psm1"
if(-not (Test-Path $module_path -PathType Leaf)) { if(-not (Test-Path $module_path -PathType Leaf)) {
$zip_file = "$bin_dir\$package.zip" $zip_file = "$bin_dir\PhpManager.zip"
Invoke-WebRequest -Uri $url -OutFile $zip_file Invoke-WebRequest -UseBasicParsing -Uri https://github.com/$repo/archive/$tag.zip -OutFile $zip_file
Expand-Archive -Path $zip_file -DestinationPath $bin_dir -Force Expand-Archive -Path $zip_file -DestinationPath $bin_dir\PhpManager -Force
} }
Import-Module $module_path Import-Module $module_path
Add-ToProfile $current_profile "$package-search" "Import-Module $module_path" Add-ToProfile $current_profile 'powershell-phpmanager' "Import-Module $module_path"
if($null -eq (Get-Command $cmdlet -ErrorAction SilentlyContinue)) {
Install-Module -Name $cmdlet -Force
}
}
# Function to link dependencies to PHP directory.
Function Set-ExtensionPrerequisites
{
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$deps_dir
)
$deps = Get-ChildItem -Recurse -Path $deps_dir
if ($deps.Count -ne 0) {
# Symlink dependencies instead of adding the directory to PATH ...
# as other actions change the PATH thus breaking extensions.
$deps | ForEach-Object {
New-Item -Itemtype SymbolicLink -Path $php_dir -Name $_.Name -Target $_.FullName -Force > $null 2>&1
}
} else {
Remove-Item $deps_dir -Recurse -Force
}
}
# Function to get extension pre-requisites.
# https://windows.php.net/downloads/pecl/deps
# Currently only imagick is supported using this Cmdlet.
Function Get-ExtensionPrerequisites{
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension
)
$deps_dir = "$ext_dir\$extension-vc$($installed.VCVersion)-$arch"
$extensions_with_dependencies = ('imagick')
New-Item $deps_dir -Type Directory -Force > $null 2>&1
if($extensions_with_dependencies.Contains($extension)) {
Install-PhpExtensionPrerequisite -Extension $extension -InstallPath $deps_dir -PhpPath $php_dir
}
return $deps_dir
} }
# Function to add PHP extensions. # Function to add PHP extensions.
@ -191,22 +117,18 @@ Function Add-Extension {
Add-Log $tick $extension "Enabled" Add-Log $tick $extension "Enabled"
} }
default { default {
$deps_dir = Get-ExtensionPrerequisites $extension
Enable-ExtensionDependencies $extension
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
Set-ExtensionPrerequisites $deps_dir
Add-Log $tick $extension "Enabled" Add-Log $tick $extension "Enabled"
} }
} }
} }
else { else {
$deps_dir = Get-ExtensionPrerequisites $extension
$params = @{ Extension = $extension; MinimumStability = $stability; MaximumStability = $stability; Path = $php_dir; AdditionalFilesPath = $deps_dir; NoDependencies = $true }
if($extension_version -ne '') { if($extension_version -ne '') {
$params["Version"] = $extension_version 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
} }
Install-PhpExtension @params
Set-ExtensionPrerequisites $deps_dir
Add-Log $tick $extension "Installed and enabled" Add-Log $tick $extension "Installed and enabled"
} }
} }
@ -215,13 +137,8 @@ Function Add-Extension {
} }
} }
# Function to get a map of extensions and their dependent shared extensions. # Function to remove PHP extensions.
Function Get-ExtensionMap { Function Remove-Extension() {
php -d'error_reporting=0' $dist\..\src\scripts\ext\extension_map.php
}
# Function to enable extension dependencies which are also extensions.
Function Enable-ExtensionDependencies {
Param ( Param (
[Parameter(Position = 0, Mandatory = $true)] [Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
@ -229,91 +146,21 @@ Function Enable-ExtensionDependencies {
[string] [string]
$extension $extension
) )
if (-not(Test-Path $env:TEMP\map.orig)) {
Get-ExtensionMap | Set-Content -Path $env:TEMP\map.orig
}
$entry = findstr /r "$extension`:.*" $env:TEMP\map.orig
if($entry) {
$entry.split(':')[1].trim().split(' ') | ForEach-Object {
if (-not(php -m | findstr -i $_)) {
Enable-PhpExtension -Extension $_ -Path $php_dir
}
}
}
}
# Function to disable dependent extensions.
Function Disable-DependentExtensions() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension
)
Get-ExtensionMap | Select-String -Pattern ".*:.*\s$extension(\s|$)" | ForEach-Object {
$dependent = $_.Matches[0].Value.split(':')[0];
Disable-ExtensionHelper -Extension $dependent -DisableDependents
Add-Log $tick ":$extension" "Disabled $dependent as it depends on $extension"
}
}
# Helper function to disable an extension.
Function Disable-ExtensionHelper() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension,
[switch] $DisableDependents
)
if($DisableDependents) {
Disable-DependentExtensions $extension
}
Disable-PhpExtension -Extension $extension -Path $php_dir
}
# Function to disable an extension.
Function Disable-Extension() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension,
[Parameter(Position = 1, Mandatory = $false)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$DisableDependents
)
if(php -m | findstr -i $extension) { if(php -m | findstr -i $extension) {
if(Test-Path $ext_dir\php_$extension.dll) { try {
try { Disable-PhpExtension $extension $php_dir
$params = @{ Extension = $extension; DisableDependents = ($DisableDependents -ne 'false') } if (Test-Path $ext_dir\php_$extension.dll) {
Disable-ExtensionHelper @params Remove-Item $ext_dir\php_$extension.dll
Add-Log $tick ":$extension" "Disabled"
} catch {
Add-Log $cross ":$extension" "Could not disable $extension on PHP $($installed.FullVersion)"
} }
} else { Add-Log $tick ":$extension" "Removed"
Add-Log $cross ":$extension" "Could not disable $extension on PHP $($installed.FullVersion) as it not a shared extension" } catch {
Add-Log $cross ":$extension" "Could not remove $extension on PHP $($installed.FullVersion)"
} }
} elseif(Test-Path $ext_dir\php_$extension.dll) {
Add-Log $tick ":$extension" "Disabled"
} else { } else {
Add-Log $tick ":$extension" "Could not find $extension on PHP $($installed.FullVersion)" Add-Log $tick ":$extension" "Could not find $extension on PHP $($installed.FullVersion)"
} }
} }
# Function to disable shared extensions.
Function Disable-AllShared() {
(Get-Content $php_dir\php.ini) | Where-Object {$_ -notmatch '^(zend_)?extension\s*='} | Set-Content $php_dir\php.ini
Add-Log $tick "none" "Disabled all shared extensions"
}
# Function to configure composer.
Function Edit-ComposerConfig() { Function Edit-ComposerConfig() {
Param( Param(
[Parameter(Position = 0, Mandatory = $true)] [Parameter(Position = 0, Mandatory = $true)]
@ -328,38 +175,13 @@ Function Edit-ComposerConfig() {
Add-Log "$cross" "composer" "Could not download composer" Add-Log "$cross" "composer" "Could not download composer"
exit 1; exit 1;
} }
if (-not(Test-Path $composer_json)) { composer -q global config process-timeout 0
Set-Content -Path $composer_json -Value "{}" Write-Output "::add-path::$env:APPDATA\Composer\vendor\bin"
}
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) { if (Test-Path env:COMPOSER_TOKEN) {
composer -q config -g github-oauth.github.com $env:COMPOSER_TOKEN composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
} }
} }
# Function to extract tool version.
Function Get-ToolVersion() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
$tool,
[Parameter(Position = 1, Mandatory = $true)]
$param
)
$alp = "[a-zA-Z0-9]"
$version_regex = "[0-9]+((\.{1}$alp+)+)(\.{0})(-$alp+){0,1}"
if($tool -eq 'composer') {
if ($param -eq 'snapshot') {
$composer_version = (Select-String -Pattern "const\sBRANCH_ALIAS_VERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }) + '+' + (Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern "[a-zA-Z0-9]+" -AllMatches | ForEach-Object { $_.matches[2].Value })
} else {
$composer_version = Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }
}
Set-Variable -Name 'composer_version' -Value $composer_version -Scope Global
return "$composer_version"
}
return . $tool $param 2> $null | ForEach-Object { $_ -replace "composer $version_regex", '' } | Select-String -Pattern $version_regex | Select-Object -First 1 | ForEach-Object { $_.matches.Value }
}
# Function to add tools. # Function to add tools.
Function Add-Tool() { Function Add-Tool() {
Param ( Param (
@ -368,42 +190,43 @@ Function Add-Tool() {
$url, $url,
[Parameter(Position = 1, Mandatory = $true)] [Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()] [ValidateNotNull()]
$tool, [ValidateLength(1, [int]::MaxValue)]
[Parameter(Position = 2, Mandatory = $true)] [string]
[ValidateNotNull()] $tool
$ver_param
) )
if (Test-Path $bin_dir\$tool) { if (Test-Path $bin_dir\$tool) {
Remove-Item $bin_dir\$tool Remove-Item $bin_dir\$tool
} }
if($url.Count -gt 1) { if($url.Count -gt 1) { $url = $url[0] }
$url = $url[0] if ($tool -eq "symfony") {
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $bin_dir\$tool.exe
Add-ToProfile $current_profile $tool "New-Alias $tool $bin_dir\$tool.exe" >$null 2>&1
} else {
try {
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $bin_dir\$tool
$bat_content = @()
$bat_content += "@ECHO off"
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool
$bat_content += "php %BIN_TARGET% %*"
Set-Content -Path $bin_dir\$tool.bat -Value $bat_content
Add-ToProfile $current_profile $tool "New-Alias $tool $bin_dir\$tool.bat" >$null 2>&1
} catch { }
} }
$tool_path = "$bin_dir\$tool" if($tool -eq "phan") {
if (($url | Split-Path -Extension) -eq ".exe") { Add-Extension fileinfo >$null 2>&1
$tool_path = "$tool_path.exe" Add-Extension ast >$null 2>&1
} } elseif($tool -eq "phive") {
try { Add-Extension xml >$null 2>&1
Invoke-WebRequest -Uri $url -OutFile $tool_path } elseif($tool -eq "cs2pr") {
} catch { (Get-Content $bin_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $bin_dir/cs2pr
if($url -match '.*github.com.*releases.*latest.*') { } elseif($tool -eq "composer") {
try { Edit-ComposerConfig $bin_dir\$tool
$url = $url.replace("releases/latest/download", "releases/download/" + ([regex]::match((Invoke-WebRequest -Uri ($url.split('/release')[0] + "/releases")).Content, "([0-9]+\.[0-9]+\.[0-9]+)/" + ($url.Substring($url.LastIndexOf("/") + 1))).Groups[0].Value).split('/')[0]) } elseif($tool -eq "wp-cli") {
Invoke-WebRequest -Uri $url -OutFile $tool_path Copy-Item $bin_dir\wp-cli.bat -Destination $bin_dir\wp.bat
} catch { }
}
} }
if (((Get-ChildItem -Path $bin_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) { if (((Get-ChildItem -Path $bin_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) {
$bat_content = @() Add-Log $tick $tool "Added"
$bat_content += "@ECHO off"
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool
$bat_content += "php %BIN_TARGET% %*"
Set-Content -Path $bin_dir\$tool.bat -Value $bat_content
Add-ToolsHelper $tool
Add-ToProfile $current_profile $tool "New-Alias $tool $bin_dir\$tool.bat" >$null 2>&1
$tool_version = Get-ToolVersion $tool $ver_param
Add-Log $tick $tool "Added $tool $tool_version"
} else { } else {
Add-Log $cross $tool "Could not add $tool" Add-Log $cross $tool "Could not add $tool"
} }
@ -428,24 +251,9 @@ Function Add-Composertool() {
[string] [string]
$prefix $prefix
) )
if($tool -match "prestissimo|composer-prefetcher" -and $composer_version.split('.')[0] -ne "1") { composer -q global require $prefix$release 2>&1 | out-null
Write-Output "::warning:: Skipping $tool, as it does not support Composer $composer_version. Specify composer:v1 in tools to use $tool" if($?) {
Add-Log $cross $tool "Skipped" Add-Log $tick $tool "Added"
Return
}
if(Test-Path $composer_lock) {
Remove-Item -Path $composer_lock -Force
}
(composer global require $prefix$release 2>&1 | Tee-Object -FilePath $env:APPDATA\Composer\composer.log) >$null 2>&1
$json = findstr $prefix$tool $env:APPDATA\Composer\composer.json
$log = findstr $prefix$tool $env:APPDATA\Composer\composer.log
if(Test-Path $composer_bin\composer) {
Copy-Item -Path "$bin_dir\composer" -Destination "$composer_bin\composer" -Force
}
Add-ToolsHelper $tool
if($json) {
$tool_version = Get-ToolVersion "Write-Output" "$log"
Add-Log $tick $tool "Added $tool $tool_version"
} else { } else {
Add-Log $cross $tool "Could not setup $tool" Add-Log $cross $tool "Could not setup $tool"
} }
@ -462,35 +270,35 @@ $cross = ([char]10007)
$php_dir = 'C:\tools\php' $php_dir = 'C:\tools\php'
$ext_dir = "$php_dir\ext" $ext_dir = "$php_dir\ext"
$bin_dir = $php_dir $bin_dir = $php_dir
$github = 'https://github.com'
$php_builder = "$github/shivammathur/php-builder-windows"
$composer_bin = "$env:APPDATA\Composer\vendor\bin"
$composer_json = "$env:APPDATA\Composer\composer.json"
$composer_lock = "$env:APPDATA\Composer\composer.lock"
$current_profile = "$env:TEMP\setup-php.ps1" $current_profile = "$env:TEMP\setup-php.ps1"
$ProgressPreference = 'SilentlyContinue' $ProgressPreference = 'SilentlyContinue'
$jit_versions = '8.[0-9]' $master_version = '8.0'
$nightly_versions = '8.[1-9]'
$cert_source='CurrentUser' $cert_source='CurrentUser'
$enable_extensions = ('openssl', 'curl', 'mbstring')
$arch = 'x64' $arch = 'x64'
$arch_name ='amd64'
if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') { if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') {
$arch = 'x86' $arch = 'x86'
$arch_name = '386'
} }
$ts = $env:PHPTS -eq 'ts' $ts = $env:PHPTS -eq 'ts'
if($env:PHPTS -ne 'ts') { if($env:PHPTS -ne 'ts') {
$env:PHPTS = 'nts' $env:PHPTS = 'nts'
} }
if($env:RUNNER -eq 'self-hosted') { if($env:RUNNER -eq 'self-hosted') {
$bin_dir = 'C:\tools\bin' $bin_dir = 'C:\tools\bin'
$php_dir = "$php_dir$version" $php_dir = "$php_dir$version"
$ext_dir = "$php_dir\ext" $ext_dir = "$php_dir\ext"
$cert_source='Curl' $cert_source='Curl'
Get-CleanPSProfile >$null 2>&1 Get-CleanPSProfile >$null 2>&1
New-Item $bin_dir -Type Directory -Force > $null 2>&1 New-Item $bin_dir -Type Directory 2>&1 | Out-Null
Add-Path -PathItem $bin_dir Add-Path -PathItem $bin_dir
if(-not(Test-Path $bin_dir\printf.exe)) {
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/shivammathur/printf/releases/latest/download/printf-$arch.zip" -OutFile "$bin_dir\printf.zip" >$null 2>&1
Expand-Archive -Path $bin_dir\printf.zip -DestinationPath $bin_dir -Force >$null 2>&1
}
if($version -lt 5.6) { if($version -lt 5.6) {
Add-Log $cross "PHP" "PHP $version is not supported on self-hosted runner" Add-Log $cross "PHP" "PHP $version is not supported on self-hosted runner"
Start-Sleep 1 Start-Sleep 1
@ -499,7 +307,7 @@ if($env:RUNNER -eq 'self-hosted') {
if ((Get-InstalledModule).Name -notcontains 'VcRedist') { if ((Get-InstalledModule).Name -notcontains 'VcRedist') {
Install-Module -Name VcRedist -Force Install-Module -Name VcRedist -Force
} }
New-Item $php_dir -Type Directory -Force > $null 2>&1 New-Item $php_dir -Type Directory 2>&1 | Out-Null
Add-Path -PathItem $php_dir Add-Path -PathItem $php_dir
setx PHPROOT $php_dir >$null 2>&1 setx PHPROOT $php_dir >$null 2>&1
} else { } else {
@ -508,12 +316,8 @@ if($env:RUNNER -eq 'self-hosted') {
New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1 New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1
} }
} }
. $dist\..\src\scripts\tools\add_tools.ps1
Add-Printf >$null 2>&1
Step-Log "Setup PhpManager" Step-Log "Setup PhpManager"
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php >$null 2>&1 Install-PhpManager >$null 2>&1
Add-Log $tick "PhpManager" "Installed" Add-Log $tick "PhpManager" "Installed"
Step-Log "Setup PHP" Step-Log "Setup PHP"
@ -524,25 +328,18 @@ if (Test-Path -LiteralPath $php_dir -PathType Container) {
} catch { } } catch { }
} }
$status = "Installed" $status = "Installed"
$extra_version = ""
if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) { if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) {
if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') { if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') {
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1 Install-Module -Name VcRedist -Force
}
if ($version -eq $master_version) {
$version = 'master'
Invoke-WebRequest -UseBasicParsing -Uri https://dl.bintray.com/shivammathur/php/Install-PhpMaster.ps1 -OutFile $php_dir\Install-PhpMaster.ps1 > $null 2>&1
& $php_dir\Install-PhpMaster.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
} }
try {
if ($version -match $nightly_versions) {
Invoke-WebRequest -UseBasicParsing -Uri $php_builder/releases/latest/download/Get-PhpNightly.ps1 -OutFile $php_dir\Get-PhpNightly.ps1 > $null 2>&1
& $php_dir\Get-PhpNightly.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir -Version $version > $null 2>&1
$extra_version = " ($(Get-Content $php_dir\COMMIT))"
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
}
} catch { }
} else { } else {
Set-PhpIniKey -Key 'extension_dir' -Value $ext_dir -Path $php_dir
if($version -match $jit_versions) {
('opcache.enable=1', 'opcache.jit_buffer_size=256M', 'opcache.jit=1235') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
}
if($env:update -eq 'true') { if($env:update -eq 'true') {
Update-Php $php_dir >$null 2>&1 Update-Php $php_dir >$null 2>&1
$status = "Updated to" $status = "Updated to"
@ -552,19 +349,15 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
} }
$installed = Get-Php -Path $php_dir $installed = Get-Php -Path $php_dir
if($installed.MajorMinorVersion -ne $version) { Set-PhpIniKey -Key 'date.timezone' -Value 'UTC' -Path $php_dir
Add-Log $cross "PHP" "Could not setup PHP $version" Set-PhpIniKey -Key 'memory_limit' -Value '-1' -Path $php_dir
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 }
if($version -lt "5.5") { if($version -lt "5.5") {
('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri "$php_builder/releases/download/openssl-1.0.2u/$_" -OutFile $php_dir\$_ >$null 2>&1 } ForEach($lib in "libeay32.dll", "ssleay32.dll") {
Invoke-WebRequest -UseBasicParsing -Uri https://dl.bintray.com/shivammathur/php/$lib -OutFile $php_dir\$lib >$null 2>&1
}
Enable-PhpExtension -Extension openssl, curl, mbstring -Path $php_dir
} else { } else {
$enable_extensions += ('opcache') Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir
} }
Enable-PhpExtension -Extension $enable_extensions -Path $php_dir
Update-PhpCAInfo -Path $php_dir -Source $cert_source Update-PhpCAInfo -Path $php_dir -Source $cert_source
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"
New-Item -ItemType Directory -Path $composer_bin -Force > $null 2>&1
Write-Output "::set-output name=php-version::$($installed.FullVersion)"
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)$extra_version"

File diff suppressed because it is too large Load Diff

View File

@ -1,28 +1,7 @@
import {IncomingMessage, OutgoingHttpHeaders} from 'http';
import * as fs from 'fs'; import * as fs from 'fs';
import * as https from 'https';
import * as path from 'path'; import * as path from 'path';
import * as url from 'url';
import * as core from '@actions/core'; import * as core from '@actions/core';
/**
* Function to read environment variable and return a string value.
*
* @param property
*/
export async function readEnv(property: string): Promise<string> {
const 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. * Function to get inputs from both with and env annotations.
* *
@ -33,84 +12,13 @@ export async function getInput(
name: string, name: string,
mandatory: boolean mandatory: boolean
): Promise<string> { ): Promise<string> {
const input = core.getInput(name); const input = process.env[name];
const env_input = await readEnv(name); switch (input) {
switch (true) { case '':
case input != '': case undefined:
return core.getInput(name, {required: mandatory});
default:
return input; return input;
case input == '' && env_input != '':
return env_input;
case input == '' && env_input == '' && mandatory:
throw new Error(`Input required and not supplied: ${name}`);
default:
return '';
}
}
/**
* Function to fetch an URL
*
* @param input_url
* @param auth_token
*/
export async function fetch(
input_url: string,
auth_token?: string
): Promise<Record<string, string>> {
const fetch_promise: Promise<Record<string, string>> = new Promise(
resolve => {
const url_object: url.UrlObject = new url.URL(input_url);
const headers: OutgoingHttpHeaders = {
'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
};
if (auth_token) {
headers.authorization = 'Bearer ' + auth_token;
}
const options: https.RequestOptions = {
hostname: url_object.hostname,
path: url_object.pathname,
headers: headers
};
const req = https.get(options, (res: IncomingMessage) => {
if (res.statusCode != 200) {
resolve({error: `${res.statusCode}: ${res.statusMessage}`});
} else {
let body = '';
res.setEncoding('utf8');
res.on('data', chunk => (body += chunk));
res.on('end', () => resolve({data: `${body}`}));
}
});
req.end();
}
);
return await fetch_promise;
}
/** Function to get manifest URL
*
*/
export async function getManifestURL(): Promise<string> {
return 'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json';
}
/**
* Function to parse PHP version.
*
* @param version
*/
export async function parseVersion(version: string): Promise<string> {
const manifest = await getManifestURL();
switch (true) {
case /^(latest|nightly|\d+\.x)$/.test(version):
return JSON.parse((await fetch(manifest))['data'])[version];
default:
switch (true) {
case version.length > 1:
return version.slice(0, 3);
default:
return version + '.0';
}
} }
} }
@ -239,14 +147,10 @@ export async function addLog(
* Read the scripts * Read the scripts
* *
* @param filename * @param filename
* @param directory
*/ */
export async function readFile( export async function readScript(filename: string): Promise<string> {
filename: string,
directory: string
): Promise<string> {
return fs.readFileSync( return fs.readFileSync(
path.join(__dirname, '../' + directory, filename), path.join(__dirname, '../src/scripts/' + filename),
'utf8' 'utf8'
); );
} }
@ -280,21 +184,16 @@ export async function extensionArray(
case ' ': case ' ':
return []; return [];
default: default:
return [ return extension_csv
extension_csv.match(/(^|,\s?)none(\s?,|$)/) ? 'none' : '', .split(',')
...extension_csv .map(function (extension: string) {
.split(',') return extension
.trim()
.map(function (extension: string) { .toLowerCase()
if (/.+-.+\/.+@.+/.test(extension)) { .replace('php-', '')
return extension; .replace('php_', '');
} })
return extension .filter(Boolean);
.trim()
.toLowerCase()
.replace(/^(:)?(php[-_]|none|zend )/, '$1');
})
].filter(Boolean);
} }
} }
@ -311,12 +210,9 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
return []; return [];
default: default:
return values_csv return values_csv
.split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/) .split(',')
.map(function (value) { .map(function (value: string) {
return value return value.trim();
.trim()
.replace(/^["']|["']$|(?<==)["']/g, '')
.replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/, "='$1'");
}) })
.filter(Boolean); .filter(Boolean);
} }
@ -328,11 +224,18 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
* @param extension * @param extension
*/ */
export async function getExtensionPrefix(extension: string): Promise<string> { export async function getExtensionPrefix(extension: string): Promise<string> {
switch (true) { const zend: Array<string> = [
'xdebug',
'xdebug3',
'opcache',
'ioncube',
'eaccelerator'
];
switch (zend.indexOf(extension)) {
default: default:
return 'extension';
case /xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(extension):
return 'zend_extension'; return 'zend_extension';
case -1:
return 'extension';
} }
} }
@ -381,31 +284,6 @@ export async function getUnsupportedLog(
); );
} }
/**
* Function to get command to setup tools
*
* @param os_version
* @param suffix
*/
export async function getCommand(
os_version: string,
suffix: string
): Promise<string> {
switch (os_version) {
case 'linux':
case 'darwin':
return 'add_' + suffix + ' ';
case 'win32':
return 'Add-' + suffix.charAt(0).toUpperCase() + suffix.slice(1) + ' ';
default:
return await log(
'Platform ' + os_version + ' is not supported',
os_version,
'error'
);
}
}
/** /**
* Function to join strings with space * Function to join strings with space
* *
@ -435,69 +313,3 @@ export async function scriptExtension(os_version: string): Promise<string> {
); );
} }
} }
/**
* Function to get script tool
*
* @param os_version
*/
export async function scriptTool(os_version: string): Promise<string> {
switch (os_version) {
case 'win32':
return 'pwsh';
case 'linux':
case 'darwin':
return 'bash';
default:
return await log(
'Platform ' + os_version + ' is not supported',
os_version,
'error'
);
}
}
/**
* Function to get script to add tools with custom support.
*
* @param pkg
* @param type
* @param version
* @param os_version
*/
export async function customPackage(
pkg: string,
type: string,
version: string,
os_version: string
): Promise<string> {
const pkg_name: string = pkg.replace(/\d+|(pdo|pecl)[_-]/, '');
const script_extension: string = await scriptExtension(os_version);
const script: string = path.join(
__dirname,
'../src/scripts/' + type + '/' + pkg_name + script_extension
);
const command: string = await getCommand(os_version, pkg_name);
return '\n. ' + script + '\n' + command + version;
}
/**
* Function to extension input for installation from source.
*
* @param extension
* @param prefix
*/
export async function parseExtensionSource(
extension: string,
prefix: string
): Promise<string> {
// Groups: extension, domain url, org, repo, release
const regex = /(\w+)-(.+:\/\/.+(?:[.:].+)+\/)?([\w.-]+)\/([\w.-]+)@(.+)/;
const matches = regex.exec(extension) as RegExpExecArray;
matches[2] = matches[2] ? matches[2].slice(0, -1) : 'https://github.com';
return await joins(
'\nadd_extension_from_source',
...matches.splice(1, matches.length),
prefix
);
}

View File

@ -1,19 +1,63 @@
{ {
"compilerOptions": { "compilerOptions": {
"declaration": true, /* Basic Options */
"esModuleInterop": true, // "incremental": true, /* Enable incremental compilation */
"lib": [ "target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"ES2020" "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
], // "allowJs": true, /* Allow javascript files to be compiled. */
"module": "commonjs", // "checkJs": true, /* Report errors in .js files. */
"moduleResolution": "node", // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
"noImplicitAny": true, // "declaration": true, /* Generates corresponding '.d.ts' file. */
"outDir": "./lib", // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
"removeComments": true, // "sourceMap": true, /* Generates corresponding '.map' file. */
"rootDir": "./src", // "outFile": "./", /* Concatenate and emit output to single file. */
"sourceMap": true, "outDir": "./lib", /* Redirect output structure to the directory. */
"strict": true, "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"target": "ES2019" // "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. */
}, },
"exclude": ["__tests__", "lib", "node_modules"] "exclude": ["node_modules", "**/*.test.ts"]
} }