Compare commits

..

93 Commits
sapi ... 2.12.0

Author SHA1 Message Date
947009a717 Sunset support for Ubuntu 16.04 2021-08-02 23:10:43 +05:30
ca910e5511 Merge pull request #481 from jrfnl/feature/update-phive-config
Update Phive configuration
2021-08-01 23:30:47 +05:30
f31d416e6e Update Phive configuration
Phive has released version `0.15.0` which ups the minimum supported PHP version to PHP 7.3.

This adds the switch statement for Phive to take this into account.

Ref: https://github.com/phar-io/phive/releases
2021-08-01 19:52:48 +02:00
36cb9fb0fc Fix composer permissions on unix 2021-07-21 19:00:00 +05:30
6a8a2abd3c Improve symfony examples 2021-07-17 11:49:03 +05:30
c88f07696b Add support for phpunit-bridge 2021-07-17 08:42:11 +05:30
0b33ef444f Revert "Add patch for PCRE2"
This reverts commit fefbd7a497.
2021-07-16 15:55:40 +05:30
604ffba8e1 Update status-page link in README 2021-07-16 15:14:15 +05:30
a3727c20a4 Bump version to 2.12.0
Update Node.js dependencies
2021-07-14 14:38:18 +05:30
6a9b0017a4 Update README 2021-07-14 14:17:38 +05:30
3b2ce6cae6 Update Ubuntu 16.04 warning in install.ts 2021-07-14 14:17:38 +05:30
c61b9256d1 Improve grpc_php_plugin support 2021-07-14 14:17:37 +05:30
09e08a3554 More fixes in fetching tool versions 2021-07-14 14:17:32 +05:30
f31bef6a30 Set firebird client version to 3.0.7 on macOS 2021-07-12 10:45:57 +05:30
1a216636c5 Use composer for composer-require-checker 2021-07-12 10:45:56 +05:30
7eec3d790d Fix repeated version_prefix 2021-07-10 02:10:33 +05:30
5afed16e5f Fix support for imagick for PHP 5.3 to 5.5 on macOS 2021-07-10 00:50:50 +05:30
14fa980966 Improve error handling in utils.fetch and its uses
Minor fixes in tests

Revert to ES2019
2021-07-09 11:26:38 +05:30
39491a0fba Add authorization header to GitHub API call when COMPOSER_TOKEN is set 2021-07-07 22:40:05 +05:30
c6b6dabbb9 Refactor tests for tools using jest.Each 2021-07-07 22:40:04 +05:30
e1a9afe11c Add support to specify major or major.minor versions for tools with GitHub repository 2021-07-07 22:40:03 +05:30
6449431df2 Move tools config to tools.json
Refactor tools functions to use Records and object literals
2021-07-07 22:40:02 +05:30
60ff774608 Fix replacing v prefix in tool version 2021-07-07 22:40:01 +05:30
dd591f1661 Use shivammathur/extensions tap for rdkafka on macOS 2021-07-07 22:39:59 +05:30
fefbd7a497 Add patch for PCRE2 2021-07-07 22:33:14 +05:30
10f1a63300 Update contributors svg in README.md 2021-06-10 13:44:58 +05:30
a06325cfba Merge pull request #464 from fortkle/fix-document-error
Update readme about composer (Fixed errors)
2021-06-10 09:01:06 +05:30
e0b7f34ba7 improve documentation 2021-06-10 12:11:47 +09:00
e02a1810e6 Fix protoc support 2021-06-04 21:34:32 +05:30
55ab748aaa Update dependencies
Update to Jest 27

Set sourceMap to true in tsconfig.json
2021-06-04 21:34:31 +05:30
bb0acc6313 Fix extension setup 2021-06-04 21:34:23 +05:30
17fd1a694b Refactor patch_brew in darwin.sh 2021-05-27 22:00:47 +05:30
454ef11759 Fix comments in darwin.sh 2021-05-27 21:05:36 +05:30
e3396c6572 Force overwrite updated dependencies on macOS 2021-05-27 21:05:25 +05:30
3beda962f3 Fix dependencies on pre-installed PHP on macOS 2021-05-15 18:27:18 +05:30
1f97ce0215 Use VCVersion and Architecture for extension dependency directory name on Windows 2021-05-12 22:54:47 +05:30
00f360b99d Symlink extension dependencies on Windows instead of adding to PATH
This is done because other actions seem to mess with PATH breaking the installed extension
2021-05-12 22:54:41 +05:30
9882bed066 Install extension dependencies in ext_dir on Windows 2021-05-11 07:24:22 +05:30
e8855efe7c Fix self-hosted setup on linux 2021-05-05 22:16:03 +05:30
4067ce8b81 Deprecate Ubuntu 16.04 2021-05-04 23:43:26 +05:30
d5790807c8 Fix to not use system PHP on macOS
Refactor add_php in darwin.sh
2021-05-04 23:15:13 +05:30
ed61605069 Fix typo in shivammathur/node tags in README 2021-05-02 05:10:25 +05:30
d0e7f46ec4 Add ppa:ondrej/php for all Ubuntu versions actions/virtual-environments#3272 2021-05-01 11:27:58 +05:30
ef477a1dd7 Use mirror for ppa:ondrej/php on Ubuntu 16.04
Remove support for Ubuntu 16.04 self-hosted runners
2021-05-01 11:07:24 +05:30
9149639a33 Fix linking when oracle's infra randomly resolves to different versions of client and sdk 2021-04-29 01:19:45 +05:30
2fdb2200a0 Fix PHP extension support section in README 2021-04-28 11:57:46 +05:30
15c43e89cd Fix mysql regex for windows in extensions.ts 2021-04-27 15:17:29 +05:30
b0559f7f8e Bump version to 2.11.0
Update dependencies

Update year in license

Cleanup tsconfig.json

Set moduleResolution to node in tsconfig.json
2021-04-26 15:12:09 +05:30
a41bc75590 Update README 2021-04-26 10:08:04 +05:30
6ebd1e5184 Fix versions of composer tools 2021-04-26 06:55:12 +05:30
9ad81048ce Use shivammathur/extensions for memcache and memcached on darwin 2021-04-21 22:37:23 +05:30
8cfcbb030f Add support for tools: none 2021-04-21 17:11:24 +05:30
254ecd5a66 Fix phalcon3 on windows 2021-04-21 07:34:30 +05:30
0461bf14b2 Fix blackfire extension version to 1.50.0 for PHP 5.3 to 5.6 2021-04-21 07:25:57 +05:30
7e5351f399 Do not lowercase source extension input
Fix warnings in parseExtensionSource in utils.ts

Fix add_lib_log in source.sh
2021-04-21 04:38:37 +05:30
fe944a16b5 Use EXTENSION_PATH to specify subdirectory in add_extension_from_source 2021-04-20 17:20:36 +05:30
909090903e Update SECURITY.md 2021-04-19 17:06:01 +05:30
75a1b03f39 Update Node version to 15.x 2021-04-19 17:06:00 +05:30
a47644812e Add fallback to Install-PSPackage in win32.ps1 2021-04-19 17:06:00 +05:30
23393c46d7 Add support for composer packages using tools input 2021-04-19 17:05:59 +05:30
3c6827c2c3 Use shivammathur/extensions for phalcon and psr 2021-04-19 17:05:53 +05:30
de8537f42a Use lcov.info for coverage 2021-04-15 16:54:35 +05:30
ada1ce86b7 Refactor and improve extension support
Add support for APCu on macOS from shivammathur/homebrew-extensions
Improve support for geos to compile on PHP 8.0 and 8.1
Fix pecl setup to avoid unnecessary callbacks
Use GitHub releases for all couchbase versions
Use add_extension_from_source for all custom supported extensions
Remove bintray and use shivammathur/intl-icu releases
Add patch for protobuf for installing from source
Move patches from custom extension scripts to patches directory
Add support to build extension from GitHub and pecl tar archives (Internal API)
Refactor regex in extension.ts
Move add_pecl_extension to common.sh
Refactor remove_extension in darwin.sh
Fix shellcheck warning in darwin.sh
Improve switch_version in linux.sh to accept parameters
2021-04-15 16:54:35 +05:30
7c13389546 Revert "Fix pcov on PHP 8.0 on Windows"
This reverts commit a83d4379b1.
2021-04-15 16:54:34 +05:30
7627a79c01 Fix sub-directory support for extension setup from source 2021-04-15 16:54:33 +05:30
39faaac1d3 Improve source extension setup logs
Refactor source extension setup code to src/scripts/ext/source.sh
2021-04-15 16:54:32 +05:30
b3152daa8d Add support for any git repository to compile extension from source
Add support for extensions in a subdirectory to compile from source
2021-04-15 16:54:32 +05:30
6db6ddbab2 Fix version log for nightly PHP on ubuntu 2021-04-15 16:54:31 +05:30
c870bc9a3a Fail-fast if input repository does not have a PHP extension 2021-04-15 16:54:30 +05:30
f5f14c3aa3 Improve logs for building extensions from source 2021-04-15 16:54:29 +05:30
e831babc61 Add support for specifying configure opts when building extensions from source 2021-04-15 16:54:28 +05:30
c7736a605a Add support for adding libraries when building extensions from source 2021-04-15 16:54:28 +05:30
a9a6d1986e Fix add_extension_log 2021-04-15 16:54:27 +05:30
c342ca379e Check if the extensions has to be built from source first 2021-04-15 16:54:26 +05:30
cc316409b0 Use GitHub releases for libcouchbase 2 on linux 2021-04-15 16:54:26 +05:30
a8dafdc2b5 Fix cubrid setup on Ubuntu 16.04 2021-04-15 16:54:25 +05:30
f8646352c6 Fix gearman setup 2021-04-15 16:54:24 +05:30
3cbec713b8 Add parameters to ppa/lists functions in linux.sh 2021-04-15 16:54:23 +05:30
4186db28f7 Use cached packages for PHP updates on GHR 2021-04-15 16:54:22 +05:30
18f02c9c99 Revert to ppa:ondrej/ppa for phalcon3 2021-04-15 16:54:22 +05:30
15b99e2a8d Fix warning in install.ts 2021-04-15 16:54:21 +05:30
e9a7adef28 Revert "Fix macOS setup"
This reverts commit 0c4c4d5441.
2021-04-15 16:48:29 +05:30
bceb2ef3d8 Remove bintray 2021-04-13 19:08:47 +05:30
86e7315da6 Replace bintray with jsdelivr for scripts 2021-04-13 19:08:46 +05:30
0741f2b23a Fix icu-intl setup 2021-04-13 19:08:45 +05:30
0c4c4d5441 Fix macOS setup 2021-04-13 19:08:40 +05:30
abfbe6a46b Remove dotdeb support 2021-04-03 15:51:47 +05:30
62aa8428dd Fix coverage 2021-03-23 06:50:05 +05:30
e6a3eb1258 Fix composer setup on self-hosted 2021-03-17 22:04:42 +05:30
0ce7328fd7 Add PHP commit hash in logs on nightly on Ubuntu 2021-03-13 19:09:09 +05:30
6e76d3f012 Fix linking old_libraries in macOS 2021-03-08 19:13:00 +05:30
ac40fdb561 Install with force in macOS 2021-03-08 18:33:43 +05:30
890ea4bca9 Fix enable extension 2021-03-07 04:18:26 +05:30
60 changed files with 7381 additions and 10397 deletions

5
.github/SECURITY.md vendored
View File

@ -6,8 +6,8 @@ The following versions of this project are supported for security updates.
| Version | Supported |
| ------- | ------------------ |
| 1.10.x | :white_check_mark: |
| 2.8.x | :white_check_mark: |
| 1.11.x | :white_check_mark: |
| 2.11.x | :white_check_mark: |
## Supported PHP Versions
@ -15,7 +15,6 @@ This security policy only applies to the latest patches of the following PHP ver
| Version | Supported |
| ------- | ------------------ |
| 7.2 | :white_check_mark: |
| 7.3 | :white_check_mark: |
| 7.4 | :white_check_mark: |
| 8.0 | :white_check_mark: |

View File

@ -10,7 +10,7 @@ jobs:
strategy:
fail-fast: false
matrix:
operating-system: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04, windows-2019, macos-10.15]
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']
steps:
- name: Setup PHP
@ -59,7 +59,7 @@ jobs:
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 ubuntu-16.04 windows-2019 macos-10.15 macos-11.0; do
for os in ubuntu-20.04 ubuntu-18.04 windows-2019 macos-10.15 macos-11.0; 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; do
if [ "$os" = "macos-11.0" ]; then

View File

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

View File

@ -24,7 +24,7 @@ jobs:
strategy:
fail-fast: false
matrix:
operating-system: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04, windows-latest, macos-latest]
operating-system: [ubuntu-20.04, ubuntu-18.04, windows-latest, macos-latest]
php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
env:
extensions: xml, opcache, xdebug, pcov

View File

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

147
README.md
View File

@ -12,10 +12,10 @@
<a href="https://github.com/shivammathur/setup-php/blob/master/LICENSE" title="license"><img alt="LICENSE" src="https://img.shields.io/badge/license-MIT-428f7e.svg?logo=open%20source%20initiative&logoColor=white&labelColor=555555"></a>
<a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-5.3%20to%208.1-777bb3.svg?logo=php&logoColor=white&labelColor=555555"></a>
</p>
<p align="center">
<p align="center">
<a href="https://reddit.com/r/setup_php" title="setup-php reddit"><img alt="setup-php reddit" src="https://img.shields.io/badge/reddit-join-FF5700?logo=reddit&logoColor=FF5700&labelColor=555555"></a>
<a href="https://twitter.com/setup_php" title="setup-php twitter"><img alt="setup-php twitter" src="https://img.shields.io/badge/twitter-follow-1DA1F2?logo=twitter&logoColor=1DA1F2&labelColor=555555"></a>
<a href="https://setup-php.statuspage.io/" title="setup-php status"><img alt="setup-php status" src="https://img.shields.io/badge/status-subscribe-28A745?logo=statuspage&logoColor=28A745&labelColor=555555"></a>
<a href="https://status.setup-php.com" title="setup-php status"><img alt="setup-php status" src="https://img.shields.io/badge/status-subscribe-28A745?logo=statuspage&logoColor=28A745&labelColor=555555"></a>
</p>
Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer in [GitHub Actions](https://github.com/features/actions "GitHub Actions"). This action gives you a cross platform interface to set up the PHP environment you need to test your application. Refer to [Usage](#memo-usage "How to use this") section and [examples](#examples "Examples of use") to see how to use this.
@ -34,6 +34,7 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
- [Disable Coverage](#disable-coverage)
- [Usage](#memo-usage)
- [Inputs](#inputs)
- [Outputs](#outputs)
- [Flags](#flags)
- [Basic Setup](#basic-setup)
- [Matrix Setup](#matrix-setup)
@ -66,18 +67,16 @@ Both `GitHub-hosted` and `self-hosted` runners are suppported by `setup-php` on
|Virtual environment|YAML workflow label|Pre-installed PHP|
|--- |--- |--- |
|Ubuntu 16.04|`ubuntu-16.04`|`PHP 5.6` to `PHP 8.0`|
|Ubuntu 18.04|`ubuntu-18.04`|`PHP 7.1` to `PHP 8.0`|
|Ubuntu 20.04|`ubuntu-latest` or `ubuntu-20.04`|`PHP 7.4` to `PHP 8.0`|
|Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 8.0`|
|macOS Catalina 10.15|`macos-latest` or `macos-10.15`|`PHP 8.0`|
|macOS Big Sur 11.0|`macos-11.0`|`PHP 8.0`|
|macOS Big Sur 11.x|`macos-11.0`|`PHP 8.0`|
### Self-Hosted Runners
|Host OS/Virtual environment|YAML workflow label|
|--- |--- |
|Ubuntu 16.04|`self-hosted` or `Linux`|
|Ubuntu 18.04|`self-hosted` or `Linux`|
|Ubuntu 20.04|`self-hosted` or `Linux`|
|Windows 7 and newer|`self-hosted` or `Windows`|
@ -117,7 +116,7 @@ On all supported OS/Platforms the following PHP versions are supported as per th
PHP extensions can be setup using the `extensions` input. It accepts a `string` in csv-format.
- On `Ubuntu`, extensions which are available as a package, available on `PECL`, or hosted on GitHub can be setup.
- On `Ubuntu`, extensions which are available as a package, available on `PECL` or a git repository can be set up.
```yaml
- name: Setup PHP with PECL extension
@ -127,9 +126,11 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
extensions: imagick, swoole
```
- On `Windows`, extensions available on `PECL` which have the `DLL` binary can be setup.
- On `Windows`, extensions available on `PECL` which have the `DLL` binary can be set up.
- On `macOS`, extensions available on `PECL` or hosted on GitHub can be installed.
- On `macOS`, extensions available on `PECL` or a git repository can be set up.
- On `Ubuntu` and `macOS` to compile and install an extension from a git repository follow this [guide](https://github.com/shivammathur/setup-php/wiki/Add-extension-from-source "Guide to compile and install PHP extensions in setup-php").
- Extensions installed along with PHP if specified are enabled.
@ -163,14 +164,14 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
extensions: :opcache
```
- Extension `intl` can be setup with specific `ICU` version for `PHP 5.6` to `PHP 8.0` in `Ubuntu` workflows by suffixing `intl` with the `ICU` version. `ICU 50.2` and newer versions are supported. Refer to [`ICU builds`](https://github.com/shivammathur/icu-intl#icu4c-builds) for the specific versions supported.
- Extension `intl` can be setup with specific `ICU` version for `PHP 5.6` and above in `Ubuntu` workflows by suffixing `intl` with the `ICU` version. `ICU 50.2` and newer versions are supported. Refer to [`ICU builds`](https://github.com/shivammathur/icu-intl#icu4c-builds) for the specific versions supported.
```yaml
- name: Setup PHP with intl
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: intl-68.2
extensions: intl-69.1
```
- Extensions loaded by default after `setup-php` runs can be found on the [wiki](https://github.com/shivammathur/setup-php/wiki).
@ -178,7 +179,7 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
- These extensions have custom support:
- `cubrid`, `pdo_cubrid` and `gearman` on `Ubuntu`.
- `geos` on `Ubuntu` and `macOS`.
- `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_oci`, `pecl_http`, `phalcon3` and `phalcon4` on all supported OS.
- `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_firebird`, `pdo_oci`, `pecl_http`, `phalcon3` and `phalcon4` on all supported OS.
- By default, extensions which cannot be added or removed gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set `fail-fast` flag to `true`.
@ -192,23 +193,11 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
fail-fast: true
```
- Extensions can be compiled from source if they are hosted on GitHub. In this case, the version specification contains the repository and branch/tag to clone:
```yaml
- name: Setup PHP and remove shared extension
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: mongodb-mongodb/mongo-php-driver@v1.9
```
The version can be a branch name or tag as supported by `git clone -b <name>`. The clone is performed recursively, i.e. submodules will be cloned as well.
## :wrench: Tools Support
These tools can be setup globally using the `tools` input. It accepts a string in csv-format.
`behat`, `blackfire`, `blackfire-player`, `codeception`, `composer`, `composer-normalize`, `composer-prefetcher`, `composer-require-checker`, `composer-unused`, `cs2pr`, `deployer`, `flex`, `grpc_php_plugin`, `infection`, `pecl`, `phan`, `phing`, `phinx`, `phive`, `php-config`, `php-cs-fixer`, `phpcbf`, `phpcpd`, `phpcs`, `phpize`, `phplint`, `phpmd`, `phpspec`, `phpstan`, `phpunit`, `prestissimo`, `protoc`, `psalm`, `symfony` or `symfony-cli`, `vapor` or `vapor-cli`, `wp` or `wp-cli`
`behat`, `blackfire`, `blackfire-player`, `codeception`, `composer`, `composer-normalize`, `composer-prefetcher`, `composer-require-checker`, `composer-unused`, `cs2pr`, `deployer`, `flex`, `grpc_php_plugin`, `infection`, `pecl`, `phan`, `phing`, `phinx`, `phive`, `php-config`, `php-cs-fixer`, `phpcbf`, `phpcpd`, `phpcs`, `phpize`, `phplint`, `phpmd`, `phpspec`, `phpstan`, `phpunit`, `phpunit-bridge`, `prestissimo`, `protoc`, `psalm`, `symfony` or `symfony-cli`, `vapor` or `vapor-cli`, `wp` or `wp-cli`
```yaml
- name: Setup PHP with tools
@ -218,7 +207,38 @@ These tools can be setup globally using the `tools` input. It accepts a string i
tools: php-cs-fixer, phpunit
```
- To set up a particular version of a tool, specify it in the form `tool:version`. The latest stable version of `composer` is set up by default. You can set up the required `composer` version by specifying `v1`, `v2`, `snapshot` or `preview` as versions, or the exact version in semver format.
- In addition to above tools any composer tool or package can also be set up globally by specifying it as `vendor/package` matching the listing on Packagist. This format accepts the same [version constraints](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints "Composer version constraints") as `composer`.
```yaml
- name: Setup PHP with tools
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: vimeo/psalm
```
- To set up a particular version of a tool, specify it in the form `tool:version`.
Version can be in the following format:
- Semver. For example `tool:1.2.3` or `tool:1.2.3-beta1`.
- Major version. For example `tool:1` or `tool:1.x`.
- Major and minor version. For example `tool:1.2` or `tool:1.2.x`.
When you specify just the major version or the version in `major.minor` format, the latest patch version matching the input will be setup.
Except for major versions of `composer`, For other tools when you specify only the `major` version or the version in `major.minor` format for any tool you can get rate limited by GitHub's API. To avoid this, it is recommended to provide a [`GitHub` OAuth token](https://github.com/shivammathur/setup-php#composer-github-oauth "Composer GitHub OAuth"). You can do that by setting `COMPOSER_TOKEN` environment variable.
```yaml
- name: Setup PHP with tools
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: php-cs-fixer:3, phpunit:8.5
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
- The latest stable version of `composer` is set up by default. You can set up the required `composer` version by specifying the major version `v1` or `v2`, or the version in `major.minor` or `semver` format, Additionally for composer `snapshot` and `preview` can also be specified to set up the respective releases.
```yaml
- name: Setup PHP with composer v2
@ -228,20 +248,22 @@ These tools can be setup globally using the `tools` input. It accepts a string i
tools: composer:v2
```
- Tools `prestissimo` and `composer-prefetcher` will be skipped unless `composer:v1` is also specified in tools input. It is recommended to drop `prestissimo` and use `composer v2`.
- The latest versions of both agent `blackfire-agent` and client `blackfire` are setup when `blackfire` is specified in tools input. Please refer to the [official documentation](https://blackfire.io/docs/integrations/ci/github-actions "Blackfire.io documentation for GitHub Actions") for using `blackfire` with GitHub Actions.
- Version for other tools should be in `semver` format and a valid release of the tool. This is useful for installing tools for older versions of PHP. For example to set up `PHPUnit` on `PHP 7.2`.
- If you do not use composer in your workflow, you can specify `tools: none` to skip it.
```yaml
- name: Setup PHP with tools
- name: Setup PHP without composer
uses: shivammathur/setup-php@v2
with:
php-version: '7.2'
tools: phpunit:8.5.8
php-version: '7.4'
tools: none
```
- Scripts `phpize` and `php-config` are set up with the same version as of the input PHP version.
- The latest versions of both agent `blackfire-agent` and client `blackfire` are set up when `blackfire` is specified in tools input. Please refer to the [official documentation](https://blackfire.io/docs/integrations/ci/github-actions "Blackfire.io documentation for GitHub Actions") for using `blackfire` with GitHub Actions.
- Tools `prestissimo` and `composer-prefetcher` will be skipped unless `composer:v1` is also specified in tools input. It is recommended to drop `prestissimo` and use `composer v2`.
- By default, tools which cannot be set up gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set `fail-fast` flag to `true`.
```yaml
@ -257,13 +279,13 @@ These tools can be setup globally using the `tools` input. It accepts a string i
**Notes**
- Input `tools` is useful to set up tools which you only use in GitHub Actions, thus keeping your `composer.json` tidy.
- If you do not want to use all your dev-dependencies in GitHub Actions workflow, you can run composer with `--no-dev` and install required tools using `tools` input to speed up your workflow.
- If you have a tool in your `composer.json`, do not setup it with `tools` input as the two instances of the tool might conflict.
- If you have a tool in your `composer.json`, do not set up it with `tools` input as the two instances of the tool might conflict.
## :signal_strength: Coverage Support
### Xdebug
Specify `coverage: xdebug` to use `Xdebug`.
Specify `coverage: xdebug` to use `Xdebug` and disable `PCOV`.
Runs on all [PHP versions supported](#tada-php-support "List of PHP versions supported on this GitHub Action").
```yaml
@ -287,10 +309,9 @@ Runs on all [PHP versions supported](#tada-php-support "List of PHP versions sup
### PCOV
Specify `coverage: pcov` to use PCOV and disable Xdebug.
Specify `coverage: pcov` to use `PCOV` and disable `Xdebug`.
Runs on PHP 7.1 and newer PHP versions.
- In most cases, tests with `PCOV` execute much faster than with `Xdebug`.
- If your source code directory is other than `src`, `lib` or, `app`, specify `pcov.directory` using the `ini-values` input.
```yaml
@ -322,6 +343,7 @@ Disable coverage for these reasons:
- It will remove `Xdebug`, which will have a positive impact on PHP performance.
- You are using `phpdbg` for running your tests.
- You are profiling your code using `blackfire`.
- You are using PHP in JIT mode. Please refer to [JIT configuration](#jit-configuration) section for more details.
```yaml
- name: Setup PHP with no coverage driver
@ -370,6 +392,25 @@ Disable coverage for these reasons:
- Accepts a `string` in csv-format. For example: `phpunit, phpcs`
- See [tools Support](#wrench-tools-support) for tools supported.
### Outputs
#### `php-version`
To use outputs, give the `setup-php` step an `id`, you can use the same to get the outputs in a later step.
- Provides the PHP version in semver format.
```yml
- name: Setup PHP
id: setup-php
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
- name: Print PHP version
run: echo ${{ steps.setup-php.outputs.php-version }}
```
### Flags
> Specify using `env` keyword
@ -527,7 +568,7 @@ To debug any issues, you can use the `verbose` tag instead of `v2`.
> Setup PHP on multiple architecture on Ubuntu GitHub Runners.
- `PHP 5.6` to `PHP 7.4` are supported by `setup-php` on multiple architecture on `Ubuntu`.
- `PHP 5.6` to `PHP 8.0` are supported by `setup-php` on multiple architecture on `Ubuntu`.
- For this, you can use `shivammathur/node` images as containers. These have compatible `Nodejs` and `spc` utility.
- Using `spc` you can run `setup-php` on both `i386` and `amd64` containers as opposed to [default syntax](#basic-setup), which only supports `amd64`.
- Currently, for `Arm` based setup, you will need [self-hosted runners](#self-hosted-setup).
@ -610,20 +651,17 @@ jobs:
Run the workflow locally with `act` using [`shivammathur/node`](https://github.com/shivammathur/node-docker "Docker image to run setup-php") docker images.
Choose the image tag which matches the `runs-on` property in your workflow:
Choose the image tag which matches the `runs-on` property in your workflow. For example, if you are using `ubuntu-20.04` in your workflow, run `act -P ubuntu-20.04=shivammathur/node:20.04`.
```bash
# For runs-on: ubuntu-latest
act -P ubuntu-latest=shivammathur/node:latest
# For runs-on: ubuntu-20.04
act -P ubuntu-20.04=shivammathur/node:focal
act -P ubuntu-20.04=shivammathur/node:2004
# For runs-on: ubuntu-18.04
act -P ubuntu-18.04=shivammathur/node:bionic
# For runs-on: ubuntu-16.04
act -P ubuntu-16.04=shivammathur/node:xenial
act -P ubuntu-18.04=shivammathur/node:1804
```
### JIT Configuration
@ -631,6 +669,7 @@ act -P ubuntu-16.04=shivammathur/node:xenial
> Enable Just-in-time(JIT) on PHP 8.0 and PHP 8.1.
- To enable JIT, enable `opcache` in cli mode by setting `opcache.enable_cli=1`.
- JIT conflicts with `Xdebug`, `PCOV`, and other extensions which override `zend_execute_ex` function, so set `coverage: none` and remove any such extension if added.
- By default, `opcache.jit=1235` and `opcache.jit_buffer_size=256M` are set which can be changed using `ini-values` input.
- For detailed information about JIT related directives refer to the [`official PHP documentation`](https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.jit "opcache.jit documentation").
@ -641,6 +680,7 @@ For example to enable JIT in `tracing` mode with buffer size of `64 MB`.
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
coverage: none
ini-values: opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M
```
@ -703,7 +743,7 @@ If your project has node.js dependencies, you can persist NPM or yarn cache dire
### Composer GitHub OAuth
If you have a number of workflows which setup multiple tools or have many composer dependencies, you might hit the GitHub's rate limit for composer. To avoid that you can add an `OAuth` token to the composer's config by setting `COMPOSER_TOKEN` environment variable. You can use [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token "GITHUB_TOKEN documentation") secret for this purpose.
If you have a number of workflows which setup multiple tools or have many composer dependencies, you might hit the GitHub's rate limit for composer. Also, if you specify only the major version or the version in `major.minor` format, you can hit the rate limit. To avoid this you can specify an `OAuth` token by setting `COMPOSER_TOKEN` environment variable. You can use [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token "GITHUB_TOKEN documentation") secret for this purpose.
```yaml
- name: Setup PHP
@ -816,9 +856,9 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
## :bookmark: Versioning
- Use the `v2` tag as `setup-php` version. It is a rolling tag and is synced with the latest minor and patch releases. With `v2` you automatically get the bug fixes, new features and support for latest PHP releases. For debugging any issues `verbose` tag can be used temporarily. It outputs all the logs and is also synced with the latest releases.
- Use the `v2` tag as `setup-php` version. It is a rolling tag and is synced with the latest minor and patch releases. With `v2` you automatically get the bug fixes, security patches, new features and support for latest PHP releases. For debugging any issues `verbose` tag can be used temporarily. It outputs all the logs and is also synced with the latest releases.
- Semantic release versions can also be used. It is recommended to [use dependabot](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot "Setup Dependabot with GitHub Actions") with semantic versioning to keep the actions in your workflows up to date.
- Commit SHA can also be used, but are not recommended. They have to be updated with every release manually, without which you will not get any bug fixes or new features.
- Commit SHA can also be used, but are not recommended. They have to be updated with every release manually, without which you will not get any bug fixes, security patches or new features.
- It is highly discouraged to use the `master` branch as version, it might break your workflow after major releases as they have breaking changes.
- If you are using the `v1` tag or a `1.x.y` version, you should [switch to v2](https://github.com/shivammathur/setup-php/wiki/Switch-to-v2 "Guide for switching from setup-php v1 to v2") as `v1` only gets critical bug fixes. Maintenance support for `v1` will be dropped with the last `PHP 8.0` release.
@ -835,24 +875,24 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
- See [Contributor's Guide](.github/CONTRIBUTING.md "shivammathur/setup-php contribution guide") before you start.
- If you face any issues or want to suggest a feature/improvement, start a discussion [here](https://github.com/shivammathur/setup-php/discussions "Setup PHP discussions").
*Join the list of setup-php contributors*
*Contributors of `setup-php` and other related projects*
<p align="center">
<a href="https://github.com/shivammathur/setup-php/graphs/contributors">
<img src="https://opencollective.com/setup-php/contributors.svg?width=1024&button=false" alt="setup-php contributors" width="100%">
<img src="https://setup-php.com/contributors/?" alt="Contributors of setup-php and related projects" width="100%">
</a>
</p>
## :sparkling_heart: Support This Project
- If setup-php saved your developer time, please consider sponsoring setup-php:
- This project is provided as Free and Open-Source software. We need funds to maintain and do future improvements. Please sponsor setup-php using the below options:
- [Open Collective](https://opencollective.com/setup-php "setup-php Open Collective")
- [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal")
- [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon")
- Please [reach out](mailto:contact@setup-php.com) if you have any questions regarding sponsoring setup-php.
- Please [reach out](mailto:contact@setup-php.com) if you have any questions about sponsoring setup-php.
- Please star the project and share it. If you blog, please share your experience of using this action.
*Huge thanks to the following companies for supporting `setup-php`*
*`setup-php` is generously supported by*
<p>
<a href="https://www.jetbrains.com/?from=setup-php">
@ -876,7 +916,6 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
- [Node.js dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Node.js dependencies")
- [aaronparker/VcRedist](https://github.com/aaronparker/VcRedist "VcRedist PowerShell package")
- [gplessis/dotdeb-php](https://github.com/gplessis/dotdeb-php "Packaging for end of life PHP versions")
- [mlocati/powershell-phpmanager](https://github.com/mlocati/powershell-phpmanager "Package to handle PHP on windows")
- [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Packaging active PHP packages")
- [shivammathur/cache-extensions](https://github.com/shivammathur/cache-extensions "GitHub action to help with caching PHP extensions")

View File

@ -154,25 +154,32 @@ describe('Extension tests', () => {
'linux'
);
expect(linux).toContain(
'add_extension_from_github mongodb mongodb mongo-php-driver master'
'add_extension_from_source mongodb https://github.com mongodb mongo-php-driver master extension'
);
});
it('checking addExtensionOnDarwin', async () => {
let darwin: string = await extensions.addExtension(
'amqp, Xdebug, pcov, grpc, igbinary, imagick, imap, msgpack, protobuf, redis, swoole, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3',
'amqp, apcu, Xdebug, pcov, grpc, igbinary, imagick, imap, memcache, memcached, msgpack, phalcon3, phalcon4, protobuf, psr, rdkafka, redis, swoole, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3',
'7.2',
'darwin'
);
expect(darwin).toContain('add_brew_extension amqp extension');
expect(darwin).toContain('add_brew_extension apcu extension');
expect(darwin).toContain('add_brew_extension xdebug zend_extension');
expect(darwin).toContain('add_brew_extension pcov extension');
expect(darwin).toContain('add_brew_extension grpc extension');
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 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 swoole extension');
expect(darwin).toContain('add_extension sqlite3');
@ -180,12 +187,6 @@ describe('Extension tests', () => {
expect(darwin).toContain('add_unstable_extension ast beta extension');
expect(darwin).toContain('add_pecl_extension grpc 1.2.3 extension');
darwin = await extensions.addExtension('phalcon3', '7.0', 'darwin');
expect(darwin).toContain('add_phalcon phalcon3');
darwin = await extensions.addExtension('phalcon4', '7.3', 'darwin');
expect(darwin).toContain('add_phalcon phalcon4');
darwin = await extensions.addExtension('couchbase', '5.6', 'darwin');
expect(darwin).toContain('add_couchbase');
@ -254,7 +255,7 @@ describe('Extension tests', () => {
'darwin'
);
expect(darwin).toContain(
'add_extension_from_github mongodb mongodb mongo-php-driver master'
'add_extension_from_source mongodb https://github.com mongodb mongo-php-driver master extension'
);
});
});

View File

@ -5,55 +5,55 @@ import * as utils from '../src/utils';
* Mock install.ts
*/
jest.mock('../src/install', () => ({
getScript: jest.fn().mockImplementation(
async (
filename: string,
version: string,
os_version: string
): Promise<string> => {
const extension_csv: string = process.env['extensions'] || '';
const ini_values_csv: string = process.env['ini-values'] || '';
const coverage_driver: string = process.env['coverage'] || '';
let tools_csv: string = process.env['tools'] || '';
const pecl: string = process.env['pecl'] || '';
if (pecl == 'true') {
tools_csv = 'pecl, ' + tools_csv;
}
getScript: jest
.fn()
.mockImplementation(
async (
filename: string,
version: string,
os_version: string
): Promise<string> => {
const extension_csv: string = process.env['extensions'] || '';
const ini_values_csv: string = process.env['ini-values'] || '';
const coverage_driver: string = process.env['coverage'] || '';
let tools_csv: string = process.env['tools'] || '';
const pecl: string = process.env['pecl'] || '';
if (pecl == 'true') {
tools_csv = 'pecl, ' + tools_csv;
}
let script = 'initial script ' + filename + version + os_version;
if (tools_csv) {
script += 'add_tool';
}
if (extension_csv) {
script += 'install extensions';
}
if (coverage_driver) {
script += 'set coverage driver';
}
if (ini_values_csv) {
script += 'edit php.ini';
}
let script = 'initial script ' + filename + version + os_version;
if (tools_csv) {
script += 'add_tool';
}
if (extension_csv) {
script += 'install extensions';
}
if (coverage_driver) {
script += 'set coverage driver';
}
if (ini_values_csv) {
script += 'edit php.ini';
}
return script;
}
),
run: jest.fn().mockImplementation(
async (): Promise<string> => {
const os_version: string = process.env['RUNNER_OS'] || '';
const version: string = await utils.parseVersion(
await utils.getInput('php-version', true)
);
const tool = await utils.scriptTool(os_version);
const filename = os_version + (await utils.scriptExtension(os_version));
return [
await install.getScript(filename, version, os_version),
tool,
filename,
version,
__dirname
].join(' ');
}
)
return script;
}
),
run: jest.fn().mockImplementation(async (): Promise<string> => {
const os_version: string = process.env['RUNNER_OS'] || '';
const version: string = await utils.parseVersion(
await utils.getInput('php-version', true)
);
const tool = await utils.scriptTool(os_version);
const filename = os_version + (await utils.scriptExtension(os_version));
return [
await install.getScript(filename, version, os_version),
tool,
filename,
version,
__dirname
].join(' ');
})
}));
/**

File diff suppressed because it is too large Load Diff

View File

@ -8,12 +8,6 @@ jest.mock('@actions/core', () => ({
})
}));
jest.spyOn(utils, 'fetch').mockImplementation(
async (url): Promise<string> => {
return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`;
}
);
async function cleanup(path: string): Promise<void> {
fs.unlink(path, error => {
if (error) {
@ -34,18 +28,38 @@ describe('Utils tests', () => {
expect(await utils.getInput('test', false)).toBe('setup-php');
expect(await utils.getInput('setup-php', false)).toBe('setup-php');
expect(await utils.getInput('DoesNotExist', false)).toBe('');
expect(async () => {
await expect(async () => {
await utils.getInput('DoesNotExist', true);
}).rejects.toThrow('Input required and not supplied: DoesNotExist');
});
it('checking fetch', async () => {
expect(await utils.fetch('test_url')).toBe(
'{ "latest": "8.0", "5.x": "5.6", "url": "test_url" }'
);
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');
@ -72,7 +86,7 @@ describe('Utils tests', () => {
expect(await utils.color('warning')).toBe('33');
});
it('checking readScripts', async () => {
it('checking readFile', async () => {
const darwin: string = fs.readFileSync(
path.join(__dirname, '../src/scripts/darwin.sh'),
'utf8'
@ -85,12 +99,12 @@ describe('Utils tests', () => {
path.join(__dirname, '../src/scripts/win32.ps1'),
'utf8'
);
expect(await utils.readScript('darwin.sh')).toBe(darwin);
expect(await utils.readScript('darwin.sh')).toBe(darwin);
expect(await utils.readScript('linux.sh')).toBe(linux);
expect(await utils.readScript('linux.sh')).toBe(linux);
expect(await utils.readScript('win32.ps1')).toBe(win32);
expect(await utils.readScript('win32.ps1')).toBe(win32);
expect(await utils.readFile('darwin.sh', 'src/scripts')).toBe(darwin);
expect(await utils.readFile('darwin.sh', 'src/scripts')).toBe(darwin);
expect(await utils.readFile('linux.sh', 'src/scripts')).toBe(linux);
expect(await utils.readFile('linux.sh', 'src/scripts')).toBe(linux);
expect(await utils.readFile('win32.ps1', 'src/scripts')).toBe(win32);
expect(await utils.readFile('win32.ps1', 'src/scripts')).toBe(win32);
});
it('checking writeScripts', async () => {
@ -107,16 +121,16 @@ describe('Utils tests', () => {
await cleanup(script_path);
});
it('checking packageArray', async () => {
expect(await utils.packageArray('a, b, php_c, php-d')).toEqual([
it('checking extensionArray', async () => {
expect(await utils.extensionArray('a, b, php_c, php-d')).toEqual([
'a',
'b',
'c',
'd'
]);
expect(await utils.packageArray('')).toEqual([]);
expect(await utils.packageArray(' ')).toEqual([]);
expect(await utils.extensionArray('')).toEqual([]);
expect(await utils.extensionArray(' ')).toEqual([]);
});
it('checking INIArray', async () => {
@ -259,4 +273,31 @@ describe('Utils tests', () => {
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

@ -18,12 +18,12 @@ inputs:
coverage:
description: 'Setup code coverage driver.'
required: false
sapi:
description: 'Setup PHP Server API.'
required: false
tools:
description: 'Setup popular tools globally.'
required: false
outputs:
php-version:
description: 'PHP version in semver format'
runs:
using: 'node12'
main: 'dist/index.js'

3190
dist/index.js vendored

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@ jobs:
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit-bridge
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql
coverage: xdebug #optional
- name: Start mysql service
@ -42,15 +43,15 @@ jobs:
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: |
composer require --dev symfony/orm-pack symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Run Migration
run: |
composer require --dev symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env:
DATABASE_URL: mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony
- name: Run Tests
run: php bin/phpunit --coverage-text
- name: Install PHPUnit
run: simple-phpunit install
- name: Run tests
run: simple-phpunit --coverage-text

View File

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

View File

@ -17,6 +17,7 @@ jobs:
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit-bridge
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite
coverage: xdebug #optional
- name: Get composer cache directory
@ -31,9 +32,8 @@ jobs:
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: |
composer require --dev symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Tests
run: php bin/phpunit --coverage-text
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Install PHPUnit
run: simple-phpunit install
- name: Run tests
run: simple-phpunit --coverage-text

10250
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,15 @@
{
"name": "setup-php",
"version": "2.10.0",
"version": "2.12.0",
"private": false,
"description": "Setup PHP for use with GitHub Actions",
"main": "dist/index.js",
"main": "lib/install.js",
"scripts": {
"build": "tsc",
"lint": "eslint **/*.ts --cache --fix",
"format": "prettier --write **/*.ts && git add .",
"format-check": "prettier --check **/*.ts",
"release": "ncc build src/install.ts -o dist && git add -f dist/",
"release": "ncc build -o dist && git add -f dist/",
"test": "jest"
},
"repository": {
@ -24,28 +24,28 @@
"author": "shivammathur",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.4",
"@actions/io": "^1.0.2",
"@actions/core": "^1.4.0",
"@actions/exec": "^1.1.0",
"@actions/io": "^1.1.1",
"fs": "0.0.1-security"
},
"devDependencies": {
"@types/jest": "^26.0.20",
"@types/node": "^14.14.31",
"@typescript-eslint/eslint-plugin": "^4.15.1",
"@typescript-eslint/parser": "^4.15.1",
"@vercel/ncc": "^0.27.0",
"eslint": "^7.20.0",
"eslint-config-prettier": "^8.0.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jest": "^24.1.5",
"eslint-plugin-prettier": "^3.3.1",
"@types/jest": "^26.0.24",
"@types/node": "^16.3.2",
"@typescript-eslint/eslint-plugin": "^4.28.3",
"@typescript-eslint/parser": "^4.28.3",
"@vercel/ncc": "^0.28.6",
"eslint": "^7.30.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.23.4",
"eslint-plugin-jest": "^24.3.6",
"eslint-plugin-prettier": "^3.4.0",
"husky": "^4.3.8",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"prettier": "^2.2.1",
"ts-jest": "^26.5.1",
"typescript": "^4.1.5"
"jest": "^27.0.6",
"jest-circus": "^27.0.6",
"prettier": "^2.3.2",
"ts-jest": "^27.0.3",
"typescript": "^4.3.5"
},
"husky": {
"skipCI": true,

View File

@ -1,3 +0,0 @@
LoadModule phpPHP_MAJOR_module PHP_DIR\PHP_APACHE_DLL
AddHandler application/x-httpd-php .php
PHPIniDir PHP_DIR

View File

@ -1,8 +0,0 @@
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9000/"
</If>
</FilesMatch>

View File

@ -1,36 +0,0 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}

235
src/configs/tools.json Normal file
View File

@ -0,0 +1,235 @@
{
"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",
"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

@ -0,0 +1,104 @@
{
"$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",
"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"
]
},
"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

@ -1,5 +0,0 @@
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "/var/www/html"
ServerName localhost
</VirtualHost>

View File

@ -1,7 +0,0 @@
<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

View File

@ -1,22 +0,0 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.php;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/phpPHP_VERSION-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}

View File

@ -16,16 +16,19 @@ export async function addCoverageXdebug(
os_version: string,
pipe: string
): Promise<string> {
const xdebug =
let script = '\n';
script +=
(await extensions.addExtension(':pcov', version, os_version, true)) + pipe;
script +=
(await extensions.addExtension(extension, version, os_version, true)) +
pipe;
const log = await utils.addLog(
script += await utils.addLog(
'$tick',
extension,
'Xdebug enabled as coverage driver',
os_version
);
return xdebug + '\n' + log;
return script;
}
/**
@ -43,24 +46,15 @@ export async function addCoveragePCOV(
let script = '\n';
switch (true) {
default:
script +=
(await extensions.addExtension(':xdebug', version, os_version, true)) +
pipe;
script +=
(await extensions.addExtension('pcov', version, os_version, true)) +
pipe +
'\n';
pipe;
script +=
(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
script += await utils.addLog(
'$tick',
@ -97,17 +91,11 @@ export async function disableCoverage(
pipe: string
): Promise<string> {
let script = '\n';
switch (os_version) {
case 'linux':
case 'darwin':
script += 'remove_extension xdebug' + pipe + '\n';
script += 'remove_extension pcov' + pipe + '\n';
break;
case 'win32':
script += 'Remove-Extension xdebug' + pipe + '\n';
script += 'Remove-Extension pcov' + pipe + '\n';
break;
}
script +=
(await extensions.addExtension(':pcov', version, os_version, true)) + pipe;
script +=
(await extensions.addExtension(':xdebug', version, os_version, true)) +
pipe;
script += await utils.addLog(
'$tick',
'none',
@ -133,7 +121,7 @@ export async function addCoverage(
coverage_driver = coverage_driver.toLowerCase();
const script: string =
'\n' + (await utils.stepLog('Setup Coverage', os_version));
const pipe: string = await utils.suppressOutput(os_version);
const pipe: string = (await utils.suppressOutput(os_version)) + '\n';
switch (coverage_driver) {
case 'pcov':
return script + (await addCoveragePCOV(version, os_version, pipe));

View File

@ -10,33 +10,35 @@ export async function addExtensionDarwin(
extension_csv: string,
version: string
): Promise<string> {
const extensions: Array<string> = await utils.packageArray(extension_csv);
const extensions: Array<string> = await utils.extensionArray(extension_csv);
let add_script = '\n';
let remove_script = '';
await utils.asyncForEach(extensions, async function (extension: string) {
const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches: RegExpExecArray;
switch (true) {
// match :extension
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
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, pdo_oci, oci8, http, pecl_http
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// 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
):
case /^couchbase$|^pdo_oci$|^oci8$|^http|^pecl_http|^pdo_firebird$/.test(
case /^couchbase$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(
extension
):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
add_script += await utils.customPackage(
ext_name,
'ext',
@ -53,19 +55,6 @@ export async function addExtensionDarwin(
ext_prefix
);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.+-.+\/.+@.+/.test(extension):
matches = /.+-(.+)\/(.+)@(.+)/.exec(extension) as RegExpExecArray;
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
matches[1],
matches[2],
matches[3],
ext_prefix
);
return;
// match semver
case /.+-\d+\.\d+\.\d+.*/.test(extension):
add_script += await utils.joins(
@ -79,14 +68,15 @@ export async function addExtensionDarwin(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
return;
// match 5.6 to 8.9 for amqp, grpc, igbinary, imagick, imap, msgpack, protobuf, raphf, redis, swoole, xdebug, xdebug2, zmq
// match 7.1 to 8.9 for pcov
// match 5.6 to 7.4 for propro
case /(5\.6|7\.[0-4]|8\.[0-9])(amqp|grpc|igbinary|imagick|imap|msgpack|protobuf|raphf|redis|swoole|xdebug|xdebug2|zmq)/.test(
// match 5.6 and newer - amqp, apcu, grpc, igbinary, imagick, imap, msgpack, protobuf, raphf, rdkafka, redis, swoole, xdebug, xdebug2, zmq
// match 7.1 and newer - pcov
// match 5.6 to 7.4 - propro
case /(?<!5\.[3-5])(amqp|apcu|grpc|igbinary|imagick|imap|memcache|memcached|msgpack|protobuf|psr|raphf|rdkafka|redis|swoole|xdebug|xdebug2|zmq)/.test(
version_extension
):
case /(5\.6|7\.[0-4])propro/.test(version_extension):
case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension):
case /(?<!5\.[3-6]|7\.0)pcov/.test(version_extension):
case /(5\.6|7\.[0-3])phalcon3|7\.[2-4]phalcon4/.test(version_extension):
add_script += await utils.joins(
'\nadd_brew_extension',
ext_name,
@ -115,7 +105,7 @@ export async function addExtensionWindows(
extension_csv: string,
version: string
): Promise<string> {
const extensions: Array<string> = await utils.packageArray(extension_csv);
const extensions: Array<string> = await utils.extensionArray(extension_csv);
let add_script = '\n';
let remove_script = '';
await utils.asyncForEach(extensions, async function (extension: string) {
@ -137,9 +127,9 @@ export async function addExtensionWindows(
version_extension
):
case /^pdo_oci$|^oci8$|^pdo_firebird$/.test(extension):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.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):
case /^(7\.[1-4]|8\.0)(http|pecl_http)$/.test(version_extension):
case /^(7\.[1-4]|8\.0)(pecl_)?http/.test(version_extension):
add_script += await utils.customPackage(
ext_name,
'ext',
@ -155,8 +145,7 @@ export async function addExtensionWindows(
ext_version.replace('stable', '')
);
break;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
// match extensions for compiling from source
case /.+-.+\/.+@.+/.test(extension):
add_script += await utils.getUnsupportedLog(
extension,
@ -193,17 +182,15 @@ export async function addExtensionWindows(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'win32');
break;
// match 5.3mysql..5.6mysql
// match 5.3mysqli..5.6mysqli
// match 5.3mysqlnd..5.6mysqlnd
case /^5\.\d(mysql|mysqli|mysqlnd)$/.test(version_extension):
// match 5.3 to 5.6 - mysql, mysqli, mysqlnd
case /^5\.[3-6](?<!pdo_)(mysql|mysqli|mysqlnd)$/.test(version_extension):
add_script +=
'\nAdd-Extension mysql\nAdd-Extension mysqli\nAdd-Extension mysqlnd';
break;
// match 7.0mysql..8.9mysql
// match 7.0mysqli..8.9mysqli
// match 7.0mysqlnd..8.9mysqlnd
case /[7-8]\.\d+(mysql|mysqli|mysqlnd)$/.test(version_extension):
// match 7.0 and newer mysql, mysqli and mysqlnd
case /(?<!5\.[3-6])(?<!pdo_)(mysql|mysqli|mysqlnd)$/.test(
version_extension
):
add_script += '\nAdd-Extension mysqli\nAdd-Extension mysqlnd';
break;
// match sqlite
@ -229,40 +216,41 @@ export async function addExtensionLinux(
extension_csv: string,
version: string
): Promise<string> {
const extensions: Array<string> = await utils.packageArray(extension_csv);
const extensions: Array<string> = await utils.extensionArray(extension_csv);
let add_script = '\n';
let remove_script = '';
await utils.asyncForEach(extensions, async function (extension: string) {
const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches: RegExpExecArray;
switch (true) {
// Match :extension
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
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, pdo_oci, oci8, http, pecl_http
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// match couchbase, geos, pdo_oci, oci8, http, pecl_http
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 5.6gearman...8.1gearman
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension
):
case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test(
version_extension
):
case /^couchbase$|^pdo_oci$|^oci8$|^http|^pecl_http|^pdo_firebird$/.test(
case /^couchbase$|^gearman$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(
extension
):
case /^(5\.6|7\.[0-4]|8\.0)intl-[\d]+\.[\d]+$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_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):
case /^(5\.[3-6]|7\.[0-4]|8\.[0-9])gearman$/.test(version_extension):
add_script += await utils.customPackage(
ext_name,
'ext',
@ -279,19 +267,6 @@ export async function addExtensionLinux(
ext_prefix
);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.+-.+\/.+@.+/.test(extension):
matches = /.+-(.+)\/(.+)@(.+)/.exec(extension) as RegExpExecArray;
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
matches[1],
matches[2],
matches[3],
ext_prefix
);
return;
// match semver versions
case /.+-\d+\.\d+\.\d+.*/.test(extension):
add_script += await utils.joins(

View File

@ -3,7 +3,6 @@ import * as core from '@actions/core';
import * as config from './config';
import * as coverage from './coverage';
import * as extensions from './extensions';
import * as sapi from './sapi';
import * as tools from './tools';
import * as utils from './utils';
@ -27,13 +26,10 @@ export async function getScript(
const ini_values_csv: string = await utils.getInput('ini-values', false);
const coverage_driver: string = await utils.getInput('coverage', false);
const tools_csv: string = await utils.getInput('tools', false);
const sapi_csv: string = await utils.getInput('sapi', false);
let script: string = await utils.readScript(filename);
if (sapi_csv) {
script += await sapi.addSAPI(sapi_csv, os_version);
}
let script: string = await utils.readFile(filename, 'src/scripts');
script += await tools.addTools(tools_csv, version, os_version);
if (extension_csv) {
script += await extensions.addExtension(extension_csv, version, os_version);
}
@ -55,6 +51,12 @@ export async function getScript(
*/
export async function run(): Promise<void> {
try {
if ((await utils.readEnv('ImageOS')) == 'ubuntu16') {
core.setFailed(
'setup-php is not supported on Ubuntu 16.04. Please upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452'
);
return;
}
const version: string = await utils.parseVersion(
await utils.getInput('php-version', true)
);

View File

@ -1,51 +0,0 @@
import * as utils from './utils';
export async function getSapiList(sapi_csv: string): Promise<Array<string>> {
const sapi_list: Array<string> = await utils.packageArray(sapi_csv);
const servers: Array<string> = sapi_list.filter(sapi => /.*:.*/.test(sapi));
return [servers[servers.length - 1]].concat(
sapi_list.filter(sapi => /.*[^:].*/.test(sapi))
);
}
/**
* Function to set sapi
*
* @param sapi_csv
* @param os_version
*/
export async function addSAPI(
sapi_csv: string,
os_version: string
): Promise<string> {
let script: string = '\n' + (await utils.stepLog('Setup SAPI', os_version));
let sapi_list: Array<string>;
switch (true) {
case sapi_csv.split(':').length - 1 > 1:
sapi_list = await getSapiList(sapi_csv);
script +=
'\n' +
utils.log(
'Multiple SAPI with web servers specified, choosing the last one ' +
sapi_list[0],
os_version,
'warning'
);
break;
default:
sapi_list = await utils.packageArray(sapi_csv);
}
await utils.asyncForEach(sapi_list, async function (sapi: string) {
sapi = sapi.toLowerCase();
switch (os_version) {
case 'linux':
case 'darwin':
script += '\nadd_sapi ' + sapi;
break;
case 'win32':
script += '\nAdd-Sapi ' + sapi;
break;
}
});
return script;
}

View File

@ -7,12 +7,13 @@ 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_bin="$HOME/.composer/vendor/bin"
export composer_json="$HOME/.composer/composer.json"
export composer_lock="$HOME/.composer/composer.lock"
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 bintray="https://dl.bintray/shivammathur"
export jsdeliver="https://cdn.jsdelivr.net/gh/shivammathur"
# Function to log start of a operation.
step_log() {
@ -29,18 +30,15 @@ add_log() {
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;
[ "$fail_fast" = "true" ] && exit 1
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:?}"
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.
@ -73,12 +71,12 @@ get() {
fi
}
# Function to download and run scripts from GitHub releases with bintray fallback.
# 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" "$bintray/php/$repo.sh"
get -q -e /tmp/install.sh "$github/$repo/$latest/install.sh" "$jsdeliver/$1@main/scripts/install.sh"
bash /tmp/install.sh "${args[@]}"
}
@ -104,12 +102,33 @@ check_extension() {
fi
}
# 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() {
if [ -e /tmp/setup_php_dismod ] && grep -q "$1" /tmp/setup_php_dismod; then
sudo phpenmod -v "$version" "$1" >/dev/null 2>&1
fi
if ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
modules_dir="/var/lib/php/modules/$version"
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
if [ -d /tmp/extcache/"$1" ]; then
enable_cache_extension "$1" "$2"
elif ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
echo "$2=${ext_dir:?}/$1.so" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
fi
}
@ -126,9 +145,6 @@ configure_php() {
# Function to configure PECL.
configure_pecl() {
if ! [ -e /tmp/pecl_config ]; then
if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then
add_pecl >/dev/null 2>&1
fi
for script in pear pecl; do
sudo "$script" config-set php_ini "${pecl_file:-${ini_file[@]}}"
sudo "$script" channel-update "$script".php.net
@ -153,10 +169,30 @@ get_pecl_version() {
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1
configure_pecl >/dev/null 2>&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 "$extension" >/dev/null 2>&1
delete_extension "$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
@ -170,7 +206,8 @@ add_unstable_extension() {
get_tool_version() {
tool=$1
param=$2
version_regex="[0-9]+((\.{1}[0-9]+)+)(\.{0})(-[a-zA-Z0-9]+){0,1}"
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")"
@ -192,12 +229,17 @@ configure_composer() {
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 2>&1
sudo chmod 644 "$composer_json"
echo '{}' | tee "$composer_json" >/dev/null
chmod 644 "$composer_json"
fi
composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH"
echo "$composer_bin" >>"$GITHUB_PATH"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
fi
@ -209,14 +251,14 @@ add_tool() {
tool=$2
ver_param=$3
tool_path="$tool_path_dir/$tool"
if ! [[ "$PATH" =~ $tool_path_dir ]] ; then
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"
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)}"
@ -246,10 +288,10 @@ add_composertool() {
fi
(
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
composer global require "$prefix$release" >/dev/null 2>&1
json=$(grep "$prefix$tool" "$composer_json") &&
tool_version=$(get_tool_version 'echo' "$json") &&
add_log "$tick" "$tool" "Added $tool $tool_version"
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
@ -257,11 +299,9 @@ add_composertool() {
fi
}
# Function to get versions of PHP binaries in semver format.
# Function to get PHP version in semver format.
php_semver() {
binary=${1:-"php$version"}
arg=${2:-'-v'}
"$binary" "$arg" | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1
php -v | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+([0-9]+)?)?" | head -n 1
}
# Function to get the tag for a php version.
@ -272,23 +312,3 @@ php_src_tag() {
fi
echo "$php_src_tag"
}
# Function to install extension from a GitHub repository
add_extension_from_github() {
extension=$1
org=$2
repo=$3
release=$4
prefix=$5
(
add_devtools phpize
delete_extension "$extension"
git clone -n https://github.com/"$org"/"$repo" /tmp/"$repo-$release" || exit 1
cd /tmp/"$repo-$release" || exit 1
git checkout "$release" || exit 1
git submodule update --init --recursive || exit 1
phpize && ./configure && make -j"$(nproc)" && sudo make install
enable_extension "$extension" "$prefix"
) >/dev/null 2>&1
add_extension_log "$extension-$org/$repo@$release" "Installed and enabled"
}

View File

@ -7,12 +7,24 @@ self_hosted_helper() {
fi
}
# Function to delete extension.
delete_extension() {
extension=$1
sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
}
# Function to disable extension.
disable_extension() {
extension=$1
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
}
# Function to remove extensions.
remove_extension() {
extension=$1
if check_extension "$extension"; then
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
disable_extension "$extension"
delete_extension "$extension"
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
add_log "${cross:?}" ":$extension" "Could not remove $extension on PHP ${semver:?}"
else
@ -20,26 +32,7 @@ remove_extension() {
fi
}
# 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
remove_extension "$extension" >/dev/null 2>&1
pecl_install "$extension-$pecl_version"
add_extension_log "$extension-$pecl_version" "Installed and enabled"
fi
}
# Function to fetch a brew tap
# Function to fetch a brew tap.
fetch_brew_tap() {
tap=$1
tap_user=$(dirname "$tap")
@ -78,13 +71,14 @@ add_brew_extension() {
add_brew_tap shivammathur/homebrew-php
add_brew_tap shivammathur/homebrew-extensions
sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
brew install "$formula@$version" >/dev/null 2>&1
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
}
# Function to setup extensions
# Function to setup extensions.
add_extension() {
extension=$1
prefix=$2
@ -92,9 +86,12 @@ add_extension() {
if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled"
else
[[ "$version" =~ 5.[4-5] ]] && [ "$extension" = "imagick" ] && brew install pkg-config imagemagick >/dev/null 2>&1
pecl_install "$extension" >/dev/null 2>&1 &&
if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
else
pecl_install "$extension" >/dev/null 2>&1 &&
if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
fi
add_extension_log "$extension" "Installed and enabled"
fi
}
@ -107,63 +104,109 @@ add_devtools() {
# Function to handle request to add PECL.
add_pecl() {
configure_pecl >/dev/null 2>&1
pecl_version=$(get_tool_version "pecl" "version")
add_log "${tick:?}" "PECL" "Found PECL $pecl_version"
}
# Function to link all libraries of a formula
# Function to link all libraries of a formula.
link_libraries() {
formula=$1
formula_prefix="$(brew --prefix "$formula")"
sudo mkdir -p "$formula_prefix"/lib
sudo cp -a "$formula_prefix"/lib/*.dylib "$brew_prefix/lib" 2>/dev/null || true
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() {
formula=$1
get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$formula.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$formula.rb"
link_libraries "$formula"
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 [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
while read -r formula; do
update_dependencies_helper "$formula" &
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 ! [[ "$(find "$(brew --cellar)"/php/ -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]] && [ "$action" != "upgrade" ]; then
brew unlink shivammathur/php/php@"$version"
if [ "$existing_version" != "false" ]; then
([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula"
else
brew upgrade "shivammathur/php/php@$version" 2>/dev/null || brew install "shivammathur/php/php@$version"
brew install -f "$php_formula"
fi
brew link --force --overwrite shivammathur/php/php@"$version"
brew link --force --overwrite "$php_formula"
}
# Function to Setup PHP
# Function to get extra version.
php_extra_version() {
if [[ ${version:?} =~ ${nightly_versions:?} ]]; then
echo " ($(brew cat "$php_formula" | grep -Eo "commit=[0-9a-zA-Z]+" | cut -d'=' -f 2))"
fi
}
# Function to Setup PHP.
setup_php() {
step_log "Setup PHP"
existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
existing_version=$(get_brewed_php)
if [[ "$version" =~ ${old_versions:?} ]]; then
run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
status="Installed"
elif [ "$existing_version" != "$version" ]; then
add_php "install" >/dev/null 2>&1
add_php "install" "$existing_version" >/dev/null 2>&1
status="Installed"
elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
add_php "upgrade" >/dev/null 2>&1
add_php "upgrade" "$existing_version" >/dev/null 2>&1
status="Updated to"
else
status="Found"
fix_dependencies >/dev/null 2>&1
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:?}"
@ -171,18 +214,22 @@ setup_php() {
ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
semver=$(php -v | head -n 1 | cut -f 2 -d ' ')
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/"
add_log "$tick" "PHP" "$status PHP $semver"
echo "::set-output name=php-version::$semver"
add_log "$tick" "PHP" "$status PHP $semver$extra_version"
}
# Variables
version=$1
dist=$2
php_formula=shivammathur/php/php@"$version"
brew_prefix="$(brew --prefix)"
brew_repo="$(brew --repository)"
tap_dir="$brew_repo"/Library/Taps
@ -193,6 +240,7 @@ 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

View File

@ -10,7 +10,11 @@ Function Add-Blackfire() {
$no_dot_version = $version.replace('.', '')
$extension_version = $extension.split('-')[1]
if ($extension_version -notmatch "\S") {
$extension_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).probe.php
if($version -lt '7.0') {
$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) {
Enable-PhpExtension -Extension blackfire -Path $php_dir

View File

@ -8,7 +8,11 @@ add_blackfire() {
blackfire_ini_file="${pecl_file:-${ini_file[@]}}"
if [ ! -e "${ext_dir:?}/blackfire.so" ]; then
if [ "$extension_version" = "blackfire" ]; then
extension_version=$(get -s -n "" https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)
if [[ ${version:?} =~ 5.[3-6] ]]; then
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
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
fi

View File

@ -1,22 +1,17 @@
# 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"
trunk="https://github.com/couchbase/libcouchbase/releases/download"
package="libcouchbase-${release}_ubuntu${DISTRIB_RELEASE/./}_${DISTRIB_CODENAME}_amd64.tar"
get -q -n /tmp/libcouchbase.tar "$trunk/$release/$package"
sudo tar -xf /tmp/libcouchbase.tar -C /tmp
install_packages libev4
sudo dpkg -i /tmp/libcouchbase-*/*.deb
else
trunk="http://packages.couchbase.com/clients/c/repos/deb"
list="deb $trunk/ubuntu${DISTRIB_RELEASE/./} ${DISTRIB_CODENAME:?} ${DISTRIB_CODENAME:?}/main"
get -s -n "" "$trunk/couchbase.key" | sudo apt-key add
echo "$list" | sudo tee /etc/apt/sources.list.d/couchbase.list
sudo apt-get update
release="$(curl -sL $trunk/latest | grep -Eo "libcouchbase-[0-9]+\.[0-9]+\.[0-9]+" | head -n 1 | cut -d'-' -f 2)"
fi
${apt_install:?} libcouchbase-dev
deb_url="$trunk/download/$release/libcouchbase-${release}_ubuntu${DISTRIB_RELEASE/./}_${DISTRIB_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

View File

@ -39,17 +39,11 @@ add_cubrid_helper() {
status='Installed and enabled'
set_cubrid_repo
set_cubrid_branch
[ "$DISTRIB_RELEASE" = "16.04" ] && setup_compiler
(
git clone -b "$cubrid_branch" --recursive "https://github.com/CUBRID/$cubrid_repo" "/tmp/$cubrid_repo"
cd "/tmp/$cubrid_repo" || exit
! [[ "$version" =~ ${old_versions:?} ]] && add_devtools
phpize
sudo ./configure --with-php-config="$(command -v php-config)" --with-"${ext/_/-}"=shared
make -j"$(nproc)"
sudo make install
)
echo "extension=$ext.so" | sudo tee "${scan_dir:?}/$ext.ini"
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
}
@ -60,4 +54,7 @@ add_cubrid() {
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,6 +1,7 @@
add_firebird_client_darwin() {
pkg_name=$(get -s -n "" https://github.com/FirebirdSQL/firebird/releases/latest | grep -Eo "Firebird-.*.pkg" | head -n 1)
get -q -e "/tmp/firebird.pkg" https://github.com/FirebirdSQL/firebird/releases/latest/download/"$pkg_name"
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 \;
@ -10,18 +11,10 @@ add_firebird_client_darwin() {
add_firebird_helper() {
firebird_dir=$1
tag="$(php_src_tag)"
get -s -n "" https://github.com/php/php-src/archive/"$tag".tar.gz | tar -xzf - -C /tmp
(
cd /tmp/php-src-"$tag"/ext/pdo_firebird || exit
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
sudo phpize
sudo ./configure --with-pdo-firebird="$firebird_dir"
sudo make -j"$(nproc 2>/dev/null || sysctl -n hw.ncpu)"
sudo make install
enable_extension pdo_firebird extension
)
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() {
@ -29,10 +22,6 @@ add_firebird() {
if ! check_extension pdo_firebird; then
if [ "$(uname -s)" = "Linux" ]; then
if [[ "${version:?}" =~ 5.3|${nightly_versions:?} ]]; then
lib_arch=$(gcc -dumpmachine)
install_packages firebird-dev >/dev/null 2>&1
sudo ln -sf /usr/lib/"$lib_arch"/libfbclient.so.2 /usr/lib/libfbclient.so >/dev/null 2>&1
sudo ln -sf /usr/lib/"$lib_arch"/libib_util.so /usr/lib/ >/dev/null 2>&1
add_firebird_helper /usr >/dev/null 2>&1
else
add_pdo_extension firebird >/dev/null 2>&1

View File

@ -1,46 +1,12 @@
# Helper function install geos library and headers
add_geos_libs() {
if [ "$(uname -s)" = "Darwin" ]; then
brew install geos
else
sudo apt-get install libgeos-dev
if [ "${runner:?}" = "self-hosted" ]; then
${apt_install:?} --no-upgrade --no-install-recommends autoconf automake gcc g++
fi
fi
}
# Patch geos for PHP 7
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 /" /tmp/php-geos-"$geos_tag"/geos.c
fi
}
# Get geos source
get_geos() {
curl -o /tmp/geos.tar.gz -sL https://github.com/libgeos/php-geos/archive/"$geos_tag".tar.gz
tar -xzf /tmp/geos.tar.gz -C /tmp
patch_geos
}
# Helper function to compile and install geos
add_geos_helper() {
get_geos
(
cd /tmp/php-geos-"$geos_tag" || exit
phpize
./configure --enable-geos --with-geos-config="$(command -v geos-config)"
sudo make -j"$(nproc)"
sudo make install
enable_extension geos extension
)
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() {
geos_tag='1.0.0'
add_geos_libs >/dev/null 2>&1
enable_extension "geos" "extension"
if check_extension "geos"; then
add_log "${tick:?}" "geos" "Enabled"

View File

@ -19,48 +19,30 @@ enable_http() {
fi
}
# Function to install linux dependencies.
add_http_dependencies_linux() {
! [[ ${version:?} =~ ${nightly_versions:?} ]] && add_devtools phpize
install_packages zlib1g libbrotli-dev libcurl4-openssl-dev libevent-dev libicu-dev libidn2-dev
# 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 propro extension
add_extension raphf extension
elif [[ ${version:?} =~ 5.6|7.[0-4] ]]; then
add_extension_helper propro
add_extension_helper raphf
else
add_extension raphf extension
fi
}
# Function to install darwin dependencies.
add_http_dependencies_darwin() {
brew install brotli curl icu4c libevent libidn2
if ! [[ ${version:?} =~ ${old_versions:?} ]]; then
if [[ ${version:?} =~ 5.6|7.[0-4] ]]; then
add_brew_extension propro extension
fi
add_brew_extension raphf extension
else
add_pecl_extension raphf 1.1.2 extension
add_pecl_extension propro 1.0.2 extension
fi
}
# Function to install the dependencies.
add_http_dependencies() {
os=$1
if [ "$os" = 'Linux' ]; then
add_http_dependencies_linux
else
add_http_dependencies_darwin
add_extension_helper raphf
fi
}
# Function to get configure options for http.
get_http_configure_opts() {
os=$1
if [ "$os" = 'Linux' ]; then
for lib in zlib libbrotli libcurl libevent libicu libidn2 libidn libidnkit2 libidnkit; do
http_opts+=( "--with-http-$lib-dir=/usr" )
@ -75,59 +57,31 @@ get_http_configure_opts() {
fi
}
patch_http_source() {
ext=$1
os=$2
if [ "$os" = '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:?}|" "/tmp/pecl_http-${ext##*-}/src/php_http_api.h"
fi
sed -i '' -e "s|ext/raphf|$(brew --prefix raphf@"${version:?}")/include/php/ext/raphf@${version:?}|" "/tmp/pecl_http-${ext##*-}/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|" "/tmp/pecl_http-${ext##*-}/config9.m4"
fi
fi
}
# Helper function to compile and install http.
build_http() {
ext=$1
os=$2
(
http_opts=() && get_http_configure_opts "$os"
c_opts="CFLAGS=-Wno-implicit-function-declaration"
cd /tmp/pecl_http-"${ext##*-}" || exit
sudo phpize
sudo "$c_opts" ./configure --with-http --with-php-config="$(command -v php-config)" "${http_opts[@]}"
sudo make -j"$(nproc 2>/dev/null || sysctl -n hw.ncpu)"
sudo make install
)
}
# Compile and install http explicitly.
# This is done as pecl compiles raphf and propro as well.
add_http_helper() {
ext=$1
os=$2
add_http_dependencies "$os"
get -q -n /tmp/http.tgz https://pecl.php.net/get/pecl_http-"${ext##*-}".tgz
tar -xzf /tmp/http.tgz -C /tmp
patch_http_source "$ext" "$os"
build_http "$ext" "$os"
enable_extension http extension
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() {
os=$1
enable_http
if ! check_extension http; then
add_http_dependencies
if [ "$os" = "Linux" ]; then
if ! [[ "${version:?}" =~ ${old_versions:?}|${nightly_versions:?} ]]; then
if [[ ${version:?} =~ 5.6|7.[0-4] ]]; then
install_packages "php$version-propro"
fi
install_packages "php$version-raphf" "php$version-http"
install_packages "php$version-http"
else
add_http_helper "$(get_http_version)" "$os"
fi
@ -143,7 +97,6 @@ add_http_latest() {
# Function to setup http extension given a version.
add_http_version() {
ext=$1
os=$2
enable_http
if [ "x$(php -r "echo phpversion('http');")" != "x${ext##*-}" ]; then
remove_extension http >/dev/null
@ -155,12 +108,13 @@ add_http_version() {
# Function to setup http extension
add_http() {
ext=$1
os="$(uname -s)"
status="Enabled"
if [[ "$ext" =~ ^(pecl_http|http)$ ]]; then
add_http_latest "$os" >/dev/null 2>&1
add_http_latest >/dev/null 2>&1
else
add_http_version "$ext" "$os" >/dev/null 2>&1
add_http_version "$ext" >/dev/null 2>&1
fi
add_extension_log "http" "$status"
}
os="$(uname -s)"

View File

@ -2,7 +2,7 @@
install_icu() {
icu=$1
if [ "$(php -i | grep "ICU version =>" | sed -e "s|.*=> s*||")" != "$icu" ]; then
get -q -n /tmp/icu.tar.zst "https://dl.bintray.com/shivammathur/icu4c/icu4c-$icu.tar.zst"
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
@ -11,12 +11,12 @@ install_icu() {
# 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.bintray.com/packages/shivammathur/icu4c/icu4c | grep -Po "$icu" | head -n 1)
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://dl.bintray.com/shivammathur/icu4c/php${version:?}-intl-$icu.so"
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

@ -9,8 +9,8 @@ add_license_log() {
# Function to install instantclient and SDK.
add_client() {
sudo mkdir -p -m 777 "$oracle_home"
if [ ! -e "$oracle_client" ]; then
sudo mkdir -p -m 777 "$oracle_home" "$oracle_client"
for package in basiclite sdk; do
if [ "$os" = 'Linux' ]; then
libs='/usr/lib/'
@ -24,57 +24,12 @@ add_client() {
lib_ext='dylib'
fi
get -q -n "/opt/oracle/$package.zip" "https://download.oracle.com/otn_software/$os_name/instantclient/instantclient-$package-$arch.zip"
unzip "/opt/oracle/$package.zip" -d "$oracle_home"
unzip -o "/opt/oracle/$package.zip" -d "$oracle_home"
done
sudo ln -sf /opt/oracle/instantclient*/*.$lib_ext* $libs
sudo ln -sf /opt/oracle/instantclient* "$oracle_client"
fi
}
# Function to get PHP source.
get_php() {
[ ! -d "/opt/oracle/php-src-$tag" ] && get -s -n "" "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() {
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
}
# Function to install the dependencies.
add_dependencies() {
if [ "$os" = 'Linux' ]; then
if [ "${runner:?}" = "self-hosted" ]; then
${apt_install:?} --no-upgrade --no-install-recommends libaio-dev
fi
! [[ ${version:?} =~ $nightly_versions ]] && add_devtools phpize
for icdir in /opt/oracle/instantclient_*; do
sudo mv "$icdir"/* "$oracle_client"/
done
sudo ln -sf /opt/oracle/instantclient/*.$lib_ext* $libs
fi
}
@ -82,20 +37,13 @@ add_dependencies() {
add_oci_helper() {
if ! [ -e "${ext_dir:?}/$ext.so" ]; then
status='Installed and enabled'
phpize_orig=$(get_phpize)
tag=$(php_src_tag)
get_php
read -r "${ext}_LINUX_LIBS" <<< "libaio-dev"
read -r "${ext}_CONFIGURE_OPTS" <<< "--with-php-config=$(command -v php-config) --with-${ext/_/-}=instantclient,$oracle_client"
read -r "${ext}_PATH" <<< "ext/$ext"
patch_phpize
(
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 2>/dev/null || sysctl -n hw.ncpu)"
sudo cp ./modules/* "$ext_dir/"
)
add_extension_from_source "$ext" https://github.com php php-src "$(php_src_tag)" extension get
restore_phpize
fi
echo "extension=$ext.so" | sudo tee "${scan_dir:?}/99-$ext.ini"
}
# Function to add oci extension oci8 and pdo_oci.
@ -106,8 +54,10 @@ add_oci() {
oracle_client=$oracle_home/instantclient
os=$(uname -s)
add_client >/dev/null 2>&1
add_dependencies >/dev/null 2>&1
add_oci_helper >/dev/null 2>&1
add_extension_log "$ext" "$status"
check_extension "$ext" && add_license_log
}
# shellcheck source=.
. "${scripts:?}"/ext/patches/phpize.sh

View File

@ -0,0 +1,11 @@
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

@ -0,0 +1,7 @@
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

@ -0,0 +1,11 @@
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

@ -0,0 +1,6 @@
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

@ -0,0 +1,26 @@
# 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

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

View File

@ -5,7 +5,7 @@ Function Add-PhalconHelper() {
} else {
$domain = 'https://github.com'
$nts = if (!$installed.ThreadSafe) { "_nts" } else { "" }
$match = Invoke-WebRequest -Uri $domain/phalcon/cphalcon/releases | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`""
$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)`""
$zip_file = $match.Matches[0].Groups[1].Value
Invoke-WebRequest -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

View File

@ -1,19 +1,11 @@
# Helper function to add phalcon.
add_phalcon_helper() {
status='Installed and enabled'
if [ "$os_name" = "Linux" ]; then
update_lists
if [ "$extension" = "phalcon4" ]; then
${apt_install:?} "php${version:?}-psr" "php${version:?}-$extension"
else
${apt_install:?} "php${version:?}-$extension"
fi
update_lists
if [ "$extension" = "phalcon4" ]; then
${apt_install:?} "php${version:?}-psr" "php${version:?}-$extension"
else
sed -i '' '/extension.*psr/d' "${ini_file:?}"
add_brew_tap shivammathur/homebrew-phalcon
brew install phalcon@"${version:?}"_"$extension_major_version"
sudo cp "${brew_prefix:?}"/opt/psr@"${version:?}"/psr.so "${ext_dir:?}"
sudo cp "${brew_prefix:?}"/opt/phalcon@"${version:?}"_"$extension_major_version"/phalcon.so "${ext_dir:?}"
${apt_install:?} "php${version:?}-$extension"
fi
}
@ -56,7 +48,6 @@ add_phalcon4() {
add_phalcon() {
extension=$1
status='Enabled'
os_name=$(uname -s)
phalcon_ini_file="${pecl_file:-${ini_file[@]}}"
extension_major_version=${extension: -1}
if [ "$extension_major_version" = "4" ]; then

144
src/scripts/ext/source.sh Normal file
View File

@ -0,0 +1,144 @@
# 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
delete_extension "$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

@ -3,8 +3,8 @@ self_hosted_helper() {
if ! command -v apt-fast >/dev/null; then
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
fi
install_packages curl make software-properties-common unzip autoconf automake gcc g++
add_ppa ondrej/ppa
install_packages apt-transport-https curl make software-properties-common unzip autoconf automake gcc g++
add_ppa ondrej/php
}
# Function to backup and cleanup package lists.
@ -14,7 +14,6 @@ cleanup_lists() {
sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
sudo mkdir /etc/apt/sources.list.d
sudo mv /etc/apt/sources.list.d.save/*"${ppa_prefix}"*.list /etc/apt/sources.list.d/
sudo mv /etc/apt/sources.list.d.save/*dotdeb*.list /etc/apt/sources.list.d/ 2>/dev/null || true
trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/ 2>/dev/null" exit
fi
}
@ -25,33 +24,13 @@ add_ppa() {
if ! apt-cache policy | grep -q "$ppa"; then
cleanup_lists "$(dirname "$ppa")"
LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
sudo "$debconf_fix" apt-get update
fi
fi
}
# Function to add SAPI
add_sapi() {
sapi=$1
status='true'
if [ "$sapi" != "cli" ]; then
# shellcheck source=.
. "${dist}"/../src/scripts/sapi.sh
setup_sapi "$sapi" >/dev/null 2>&1
fi
check_sapi "$sapi"
if check_sapi "$sapi"; then
add_log "${tick:?}" "$sapi" "Added $sapi"
else
add_log "${cross:?}" "$sapi" "Could not setup $sapi"
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
[ "${runner:?}" != "self-hosted" ] && 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
@ -77,9 +56,7 @@ delete_extension() {
extension=$1
disable_extension "$extension"
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
if [ "${runner:?}" = "self-hosted" ]; then
$apt_remove "php-$extension" "php$version-$extension" >/dev/null 2>&1 || true
fi
sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status
}
# Function to disable and delete extensions.
@ -88,7 +65,6 @@ remove_extension() {
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
echo "$extension" | sudo tee -a /tmp/setup_php_dismod >/dev/null 2>&1
fi
delete_extension "$extension"
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
@ -107,8 +83,10 @@ add_pdo_extension() {
else
ext=$1
ext_name=$1
disable_extension pdo
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1
if [ -e "$ext_dir"/pdo.so ]; then
disable_extension 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
enable_extension "mysqlnd" "extension"
ext_name='mysqli'
@ -136,9 +114,7 @@ add_extension() {
if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled"
else
if [[ "$version" =~ 5.[4-5] ]]; then
install_packages "php5-$extension=$release_version"
elif [[ "$version" =~ ${nightly_versions:?} ]]; then
if [[ "$version" =~ ${nightly_versions:?} ]]; then
pecl_install "$extension"
else
install_packages "php$version-$extension" || pecl_install "$extension"
@ -148,34 +124,13 @@ add_extension() {
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|preview).* ]]; then
pecl_version=$(get_pecl_version "$extension" "$pecl_version")
fi
enable_extension "$extension" "$prefix"
ext_version=$(php -r "echo phpversion('$extension');")
if [ "$ext_version" = "$pecl_version" ]; then
add_log "${tick:?}" "$extension" "Enabled"
else
delete_extension "$extension"
pecl_install "$extension-$pecl_version"
add_extension_log "$extension-$pecl_version" "Installed and enabled"
fi
}
# Function to setup phpize and php-config.
add_devtools() {
tool=$1
if ! command -v "$tool$version" >/dev/null; then
install_packages "php$version-dev" "php$version-xml"
fi
sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
configure_pecl >/dev/null 2>&1
switch_version "phpize" "php-config"
add_log "${tick:?}" "$tool" "Added $tool $semver"
}
@ -187,7 +142,6 @@ setup_nightly() {
# Function to setup PHP 5.3, PHP 5.4 and PHP 5.5.
setup_old_versions() {
run_script "php5-ubuntu" "$version"
release_version=$(php -v | head -n 1 | cut -d' ' -f 2)
}
# Function to add PECL.
@ -203,9 +157,11 @@ add_pecl() {
# Function to switch versions of PHP binaries.
switch_version() {
for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
tools=("$@") && ! (( ${#tools[@]} )) && tools+=(pear pecl php phar phar.phar php-cgi php-config phpize phpdbg)
to_wait=()
for tool in "${tools[@]}"; do
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
done
@ -219,7 +175,7 @@ add_packaged_php() {
IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
$apt_install "${packages[@]}"
else
run_script "test-setup-php" "$version"
run_script "php-ubuntu" "$version"
fi
}
@ -256,6 +212,13 @@ link_pecl_file() {
done
}
# Function to get extra version.
php_extra_version() {
if [[ ${version:?} =~ ${nightly_versions:?} ]]; then
echo " ($(cat "/etc/php/$version/COMMIT"))"
fi
}
# Function to Setup PHP
setup_php() {
step_log "Setup PHP"
@ -285,6 +248,7 @@ setup_php() {
exit 1
fi
semver=$(php_semver)
extra_version=$(php_extra_version)
ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
ini_dir=$(php --ini | grep "(php.ini)" | sed -e "s|.*: s*||")
@ -295,7 +259,8 @@ setup_php() {
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}"
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "${tick:?}" "PHP" "$status PHP $semver"
echo "::set-output name=php-version::$semver"
add_log "${tick:?}" "PHP" "$status PHP $semver$extra_version"
}
# Variables
@ -303,10 +268,10 @@ version=$1
dist=$2
debconf_fix="DEBIAN_FRONTEND=noninteractive"
apt_install="sudo $debconf_fix apt-fast install -y"
apt_remove="sudo $debconf_fix apt-fast remove -y"
scripts="${dist}"/../src/scripts
# shellcheck source=.
. "${scripts:?}"/ext/source.sh
. "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/common.sh
. /etc/lsb-release

View File

@ -1,116 +0,0 @@
#!/bin/bash
install_httpd() {
sudo mkdir -p /var/www/html
sudo chown -R _www:_www /var/www
brew services stop nginx 2>/dev/null || true
if ! command -v httpd >/dev/null; then
brew install httpd
fi
sudo sed -Ei '' 's/Listen.*/Listen 80/' "$httpd_conf"
sudo sed -Ei '' 's/DirectoryIndex.*/DirectoryIndex index.php index.html/' "$httpd_conf"
}
install_nginx() {
sudo mkdir -p /var/www/html
sudo chown -R "$(id -un)":"$(id -gn)" /var/www
brew services stop httpd 2>/dev/null || true
if ! command -v nginx >/dev/null; then
brew install nginx
fi
sudo sed -Ei '' 's/listen.*/listen 80;/' "$nginx_conf"
}
setup_sapi() {
sapi=$1
conf_dir="${dist:?}"/../src/configs
case $sapi in
apache*:apache*)
install_httpd
(
echo "LoadModule proxy_module lib/httpd/modules/mod_proxy.so"
echo "LoadModule proxy_module lib/httpd/modules/mod_proxy_fcgi.so"
) | sudo tee -a "$httpd_conf"
echo "Include $httpd_extra/httpd-php.conf" | sudo tee -a "$httpd_conf"
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
sudo a2dismod mpm_event 2>/dev/null || true
sudo a2enmod mpm_prefork php"${version:?}"
sudo service apache2 restart
;;
fpm:apache*)
install_httpd
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
sudo a2dismod php"${version:?}" 2>/dev/null || true
sudo a2enmod proxy_fcgi
sudo a2enconf php"${version:?}"-fpm
sudo service apache2 restart
;;
cgi:apache*)
install_httpd
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
echo "Action application/x-httpd-php /cgi-bin/php${version:?}" | sudo tee -a /etc/apache2/conf-available/php"${version:?}"-cgi.conf
sudo a2dismod php"${version:?}" mpm_event 2>/dev/null || true
sudo a2enmod mpm_prefork actions cgi
sudo a2disconf php"${version:?}"-fpm 2>/dev/null || true
sudo a2enconf php"${version:?}"-cgi
sudo service apache2 restart
;;
fpm:nginx)
install_nginx
sudo cp "$conf_dir"/default_nginx /etc/nginx/sites-available/default
sudo sed -i "s/PHP_VERSION/${version:?}/" /etc/nginx/sites-available/default
sudo service nginx restart
;;
apache* | fpm | cgi | phpdbg) ;;
esac
}
check_service() {
service=$1
if ! pidof "$service"; then
return 1
fi
(
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "$service" "Click to check $service status"
sudo service "$service" status
echo "::endgroup::"
) | sudo tee -a /tmp/sapi.log >/dev/null 2>&1
return 0
}
check_version() {
sapi=$1
sapi_version=$(php_semver "$sapi")
if [ ${sapi_version%.*} != "${version:?}" ]; then
return 1
fi
add_log "${tick:?}" "$sapi" "Added $sapi $sapi_version" | sudo tee -a /tmp/sapi.log >/dev/null 2>&1
return 0
}
check_sapi() {
sapi=$1
sudo rm /tmp/sapi.log
if [[ "$sapi" =~ fpm|cgi ]]; then status=$(check_version php-"$sapi"); fi
if [[ "$sapi" =~ ^phpdbg$ ]]; then status=$(check_version phpdbg); fi
if [[ "$sapi" =~ .*fpm.* ]]; then status=$(check_service php"${version:?}"-fpm); fi
if [[ "$sapi" =~ .*:apache.* ]]; then status=$(check_service apache2); fi
if [[ "$sapi" =~ .*:nginx.* ]]; then status=$(check_service nginx); fi
if [ "$status" = "0" ]; then
if [[ "$sapi" =~ .*:.* ]]; then
add_log "${tick:?}" "$sapi" "Added $sapi"
fi
cat /tmp/sapi.log && sudo rm /tmp/sapi.log
else
add_log "${cross:?}" "$sapi" "Could not setup $sapi"
fi
}
httpd_conf=${brew_prefix:?}/etc/httpd/httpd.conf
httpd_extra=${brew_prefix:?}/etc/httpd/extra
nginx_conf=${brew_prefix:?}/etc/nginx/nginx.conf

View File

@ -1,117 +0,0 @@
#!/bin/bash
install_apache2() {
sudo mkdir -p /var/www/html
sudo service nginx stop 2>/dev/null || true
if ! command -v apache2 >/dev/null; then
install_packages apache2-bin apache2 -y;
else
if ! [[ "$(apache2 -v 2>/dev/null | grep -Eo "([0-9]+\.[0-9]+)")" =~ 2.[4-9] ]]; then
sudo "${debconf_fix:?}" apt-get purge apache* apache-* >/dev/null
install_packages apache2-bin apache2 -y;
fi
fi
}
install_nginx() {
sudo mkdir -p /var/www/html
sudo service apache2 stop 2>/dev/null || true
if ! command -v nginx >/dev/null; then
install_packages nginx -y
fi
}
setup_sapi() {
sapi=$1
conf_dir="${dist:?}"/../src/configs
if [[ "${version:?}" =~ ${old_versions:?}|${nightly_versions:?} ]]; then
switch_sapi "$sapi"
else
case $sapi in
apache*:apache*)
install_apache2
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
install_packages libapache2-mod-php"${version:?}" -y
sudo a2dismod mpm_event 2>/dev/null || true
sudo a2enmod mpm_prefork php"${version:?}"
sudo service apache2 restart
;;
fpm:apache*)
install_apache2
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
install_packages libapache2-mod-fcgid php"${version:?}"-fpm -y
sudo a2dismod php"${version:?}" 2>/dev/null || true
sudo a2enmod proxy_fcgi
sudo a2enconf php"${version:?}"-fpm
sudo service apache2 restart
;;
cgi:apache*)
install_apache2
install_packages php"${version:?}"-cgi -y
sudo cp "$conf_dir"/default_apache /etc/apache2/sites-available/000-default.conf
echo "Action application/x-httpd-php /cgi-bin/php${version:?}" | sudo tee -a /etc/apache2/conf-available/php"${version:?}"-cgi.conf
sudo a2dismod php"${version:?}" mpm_event 2>/dev/null || true
sudo a2enmod mpm_prefork actions cgi
sudo a2disconf php"${version:?}"-fpm 2>/dev/null || true
sudo a2enconf php"${version:?}"-cgi
sudo service apache2 restart
;;
fpm:nginx)
install_nginx
install_packages php"${version:?}"-fpm -y
sudo cp "$conf_dir"/default_nginx /etc/nginx/sites-available/default
sudo sed -i "s/PHP_VERSION/${version:?}/" /etc/nginx/sites-available/default
sudo service nginx restart
;;
apache*)
install_packages libapache2-mod-php"${version:?}" -y
;;
fpm|embed|cgi|phpdbg)
install_packages php"${version:?}"-"$sapi" -y
;;
esac
fi
}
check_service() {
service=$1
if ! pidof "$service"; then
return 1
fi
(
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "$service" "Click to check $service status"
sudo service "$service" status
echo "::endgroup::"
) | sudo tee -a /tmp/sapi.log >/dev/null 2>&1
return 0
}
check_version() {
sapi=$1
sapi_version=$(php_semver "$sapi")
if [ "${sapi_version%.*}" != "${version:?}" ]; then
return 1;
fi
add_log "${tick:?}" "$sapi" "Added $sapi $sapi_version" | sudo tee -a /tmp/sapi.log >/dev/null 2>&1
return 0
}
check_sapi() {
sapi=$1
sudo rm /tmp/sapi.log
if [[ "$sapi" =~ fpm|cgi ]]; then status=$(check_version php-"$sapi"); fi
if [[ "$sapi" =~ ^phpdbg$ ]]; then status=$(check_version phpdbg); fi
if [[ "$sapi" =~ .*fpm.* ]]; then status=$(check_service php"${version:?}"-fpm); fi
if [[ "$sapi" =~ .*:apache.* ]]; then status=$(check_service apache2); fi
if [[ "$sapi" =~ .*:nginx.* ]]; then status=$(check_service nginx); fi
if [ "$status" = "0" ]; then
if [[ "$sapi" =~ .*:.* ]]; then
add_log "${tick:?}" "$sapi" "Added $sapi"
fi
cat /tmp/sapi.log && sudo rm /tmp/sapi.log
else
add_log "${cross:?}" "$sapi" "Could not setup $sapi"
fi
}

View File

@ -15,10 +15,10 @@ Function Add-ToolsHelper() {
Add-Extension ast >$null 2>&1
} elseif($tool -eq "phive") {
Add-Extension xml >$null 2>&1
} elseif($tool -eq "symfony") {
Add-ToProfile $current_profile "symfony" "New-Alias symfony $bin_dir\$tool.exe"
Add-ToProfile $current_profile "symfony-cli" "New-Alias symfony-cli $bin_dir\$tool.exe"
} elseif($tool -eq "vapor-cli") {
} 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

@ -14,11 +14,7 @@ add_tools_helper() {
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" ]; then
sudo ln -s "${tool_path:?}" "${tool_path_dir:?}"/symfony-cli
elif [ "$tool" = "vapor-cli" ]; then
sudo ln -s "${tool_path:?}" "${tool_path_dir:?}"/vapor-cli
elif [ "$tool" = "wp-cli" ]; then
sudo ln -s "${tool_path:?}" "${tool_path_dir:?}"/wp
elif [[ "$tool" =~ (symfony|vapor|wp)-cli ]]; then
sudo ln -s "${tool_path:?}" "${tool_path_dir:?}"/${tool%-*}
fi
}

View File

@ -24,35 +24,34 @@ get_grpc_tag() {
fi
}
add_grpc_php_plugin_macos() {
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_linux() {
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
cd "/tmp/grpc-${grpc_tag:1}" || exit
add_bazel
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
CC="$(command -v gcc)" CXX="$(command -v g++)" ./tools/bazel build src/compiler:grpc_php_plugin
else
export DISABLE_BAZEL_WRAPPER=1
(
cd "/tmp/grpc-${grpc_tag:1}" || exit
add_bazel
./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
license_path="/tmp/grpc-${grpc_tag:1}/LICENSE"
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() {
grpc_tag=$1
license_path=""
if [ "$(uname -s)" = "Darwin" ]; then
add_grpc_php_plugin_macos >/dev/null 2>&1
if [ "$grpc_tag" = "latest" ]; then
add_grpc_php_plugin_brew >/dev/null 2>&1
else
add_grpc_php_plugin_linux >/dev/null 2>&1
add_grpc_php_plugin_compile >/dev/null 2>&1
fi
echo "::set-output name=grpc_php_plugin_path::$(command -v grpc_php_plugin)"
add_log "${tick:?}" "grpc_php_plugin" "Added grpc_php_plugin ${grpc_tag:1}"

View File

@ -19,7 +19,7 @@ add_protoc() {
[ "$(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"
sudo unzip /tmp/protobuf.zip -d /usr/local/
sudo chmod 777 /usr/local/bin/protoc -R /usr/local/include/google
sudo chmod -R 777 /usr/local/bin/protoc /usr/local/include/google
) >/dev/null 2>&1
add_log "${tick:?}" "protoc" "Added protoc ${protobuf_tag:1}"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information"

View File

@ -101,7 +101,9 @@ Function Install-PSPackage() {
[Parameter(Position = 1, Mandatory = $true)]
$psm1_path,
[Parameter(Position = 2, Mandatory = $true)]
$url
$url,
[Parameter(Position = 3, Mandatory = $true)]
$cmdlet
)
$module_path = "$bin_dir\$psm1_path.psm1"
if(-not (Test-Path $module_path -PathType Leaf)) {
@ -111,6 +113,31 @@ Function Install-PSPackage() {
}
Import-Module $module_path
Add-ToProfile $current_profile "$package-search" "Import-Module $module_path"
if($null -eq (Get-Command $cmdlet -ErrorAction SilentlyContinue)) {
Install-Module -Name $cmdlet -Force
}
}
Function Add-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')
if($extensions_with_dependencies.Contains($extension)) {
if(-not(Test-Path $deps_dir)) {
New-Item $deps_dir -Type Directory 2>&1 | Out-Null
Install-PhpExtensionPrerequisite -Extension $extension -InstallPath $deps_dir -PhpPath $php_dir
}
Get-ChildItem -Recurse -Path $deps_dir | ForEach-Object {
New-Item -Itemtype SymbolicLink -Path $php_dir -Name $_.Name -Target $_.FullName -Force >$null 2>&1
}
}
}
# Function to add PHP extensions.
@ -143,16 +170,18 @@ Function Add-Extension {
Add-Log $tick $extension "Enabled"
}
default {
Add-ExtensionPrerequisites $extension
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
Add-Log $tick $extension "Enabled"
}
}
}
else {
Add-ExtensionPrerequisites $extension
if($extension_version -ne '') {
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir -NoDependencies
} else {
Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir
Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir -NoDependencies
}
Add-Log $tick $extension "Installed and enabled"
@ -219,7 +248,8 @@ Function Get-ToolVersion() {
[Parameter(Position = 1, Mandatory = $true)]
$param
)
$version_regex = "[0-9]+((\.{1}[0-9]+)+)(\.{0})(-[a-z0-9]+){0,1}"
$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 })
@ -272,8 +302,8 @@ Function Add-Tool() {
$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
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 {
@ -308,14 +338,15 @@ Function Add-Composertool() {
if(Test-Path $composer_lock) {
Remove-Item -Path $composer_lock -Force
}
composer global require $prefix$release >$null 2>&1
(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" "$json"
$tool_version = Get-ToolVersion "Write-Output" "$log"
Add-Log $tick $tool "Added $tool $tool_version"
} else {
Add-Log $cross $tool "Could not setup $tool"
@ -333,8 +364,8 @@ $cross = ([char]10007)
$php_dir = 'C:\tools\php'
$ext_dir = "$php_dir\ext"
$bin_dir = $php_dir
$bintray = 'https://dl.bintray.com/shivammathur/php'
$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"
@ -384,7 +415,7 @@ if($env:RUNNER -eq 'self-hosted') {
Add-Printf >$null 2>&1
Step-Log "Setup PhpManager"
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" >$null 2>&1
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php >$null 2>&1
Add-Log $tick "PhpManager" "Installed"
Step-Log "Setup PHP"
@ -395,14 +426,16 @@ if (Test-Path -LiteralPath $php_dir -PathType Container) {
} catch { }
}
$status = "Installed"
$extra_version = ""
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') {
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" >$null 2>&1
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1
}
try {
if ($version -match $nightly_versions) {
Invoke-WebRequest -UseBasicParsing -Uri https://github.com/shivammathur/php-builder-windows/releases/latest/download/Get-PhpNightly.ps1 -OutFile $php_dir\Get-PhpNightly.ps1 > $null 2>&1
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 > $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
}
@ -426,16 +459,13 @@ if($installed.MajorMinorVersion -ne $version) {
}
('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") {
('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri $bintray/$_ -OutFile $php_dir\$_ >$null 2>&1 }
('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri "$php_builder/releases/download/openssl-1.0.2u/$_" -OutFile $php_dir\$_ >$null 2>&1 }
} else {
$enable_extensions += ('opcache')
}
# Patch till there is a pcov DLL for PHP 8.0 on pecl
if ($version -eq '8.0') {
Invoke-WebRequest -Uri "https://github.com/shivammathur/php-extensions-windows/releases/latest/download/php$version`_$env:PHPTS`_$arch`_pcov.dll" -OutFile $php_dir"\ext\php`_pcov.dll"
}
Enable-PhpExtension -Extension $enable_extensions -Path $php_dir
Update-PhpCAInfo -Path $php_dir -Source $cert_source
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE
New-Item -ItemType Directory -Path $composer_bin -Force 2>&1 | Out-Null
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"
Write-Output "::set-output name=php-version::$($installed.FullVersion)"
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)$extra_version"

View File

@ -1,241 +1,76 @@
import * as utils from './utils';
type RS = Record<string, string>;
type RSRS = Record<string, RS>;
interface IRef {
ref: string;
node_id: string;
url: string;
object: RS;
}
/**
* Function to get version in semver format.
*
* @param data
*/
export async function getSemverVersion(data: RS): Promise<string> {
const search: string = data['version_prefix'] + data['version'];
const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`;
const token: string = await utils.readEnv('COMPOSER_TOKEN');
const response: RS = await utils.fetch(url, token);
if (response.error || response.data === '[]') {
data['error'] = response.error ?? `No version found with prefix ${search}.`;
return data['version'];
} else {
const refs = JSON.parse(response['data']).reverse();
const ref = refs.find((i: IRef) => /.*\d+.\d+.\d+$/.test(i['ref']));
const tag: string = (ref || refs[0])['ref'].split('/').pop();
return tag.replace(/^v(\d)/, '$1');
}
}
/**
* Function to get tool version
*
* @param version
* @param data
*/
export async function getToolVersion(version: string): Promise<string> {
export async function getVersion(version: string, data: RS): Promise<string> {
// semver_regex - https://semver.org/
const semver_regex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/;
version = version.replace(/[><=^]*/, '');
const semver_regex =
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
const composer_regex = /^composer:(stable|preview|snapshot|[1|2])$/;
const constraint_regex = /[><=^~]+.*/;
const major_minor_regex = /^\d+(\.\d+)?$/;
data['version'] = version.replace(/v?(\d)/, '$1').replace(/\.x/, '');
switch (true) {
case version.charAt(0) == 'v':
return version.replace('v', '');
case composer_regex.test(version):
case semver_regex.test(version):
return version;
case composer_regex.test(data['release']):
case semver_regex.test(data['version']):
case constraint_regex.test(data['version']) && data['type'] === 'composer':
return data['version'];
case major_minor_regex.test(data['version']) && data['type'] === 'composer':
data['release'] = `${data['tool']}:${data['version']}.*`;
return `${data['version']}.*`;
case data['repository'] && major_minor_regex.test(data['version']):
return await getSemverVersion(data);
default:
return 'latest';
return data['version'].replace(/[><=^~]*/, '');
}
}
/**
* Function to parse tool:version
* Function to parse the release tool:version
*
* @param release
* @param data
*/
export async function parseTool(
release: string
): Promise<{name: string; version: string}> {
const parts: string[] = release.split(':');
const tool: string = parts[0];
const version: string | undefined = parts[1];
switch (version) {
case undefined:
return {
name: tool,
version: 'latest'
};
default:
return {
name: tool,
version: await getToolVersion(parts[1])
};
}
}
/**
* Function to get the url of tool with the given version
*
* @param tool
* @param extension
* @param version
* @param prefix
* @param version_prefix
* @param verb
*/
export async function getUri(
tool: string,
extension: string,
version: string,
prefix: string,
version_prefix: string,
verb: string
): Promise<string> {
switch (version) {
case 'latest':
return [prefix, version, verb, tool + extension]
.filter(Boolean)
.join('/');
default:
return [prefix, verb, version_prefix + version, tool + extension]
.filter(Boolean)
.join('/');
}
}
/**
* Helper function to get script to setup phive
*
* @param version
* @param php_version
* @param os_version
*/
export async function addPhive(
version: string,
php_version: string,
os_version: string
): Promise<string> {
switch (true) {
case /5\.[3-5]/.test(php_version):
return await utils.addLog(
'$cross',
'phive',
'Phive is not supported on PHP ' + php_version,
os_version
);
case /5\.6|7\.0/.test(php_version):
version = version.replace('latest', '0.12.1');
break;
case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5');
break;
}
switch (version) {
case 'latest':
return (
(await utils.getCommand(os_version, 'tool')) +
'https://phar.io/releases/phive.phar phive status'
);
default:
return (
(await utils.getCommand(os_version, 'tool')) +
'https://github.com/phar-io/phive/releases/download/' +
version +
'/phive-' +
version +
'.phar phive status'
);
}
}
/**
* Function to get the phar url in domain/tool-version.phar format
*
* @param domain
* @param tool
* @param prefix
* @param version
*/
export async function getPharUrl(
domain: string,
tool: string,
prefix: string,
version: string
): Promise<string> {
switch (version) {
case 'latest':
return domain + '/' + tool + '.phar';
default:
return domain + '/' + tool + '-' + prefix + version + '.phar';
}
}
/**
* Function to get blackfire player url for a PHP version.
*
* @param version
* @param php_version
*/
export async function getBlackfirePlayerUrl(
version: string,
php_version: string
): Promise<string> {
switch (true) {
case /5\.[5-6]|7\.0/.test(php_version) && version == 'latest':
version = '1.9.3';
break;
default:
break;
}
return await getPharUrl(
'https://get.blackfire.io',
'blackfire-player',
'v',
version
);
}
/**
* Function to get the Deployer url
*
* @param version
*/
export async function getDeployerUrl(version: string): Promise<string> {
const deployer = 'https://deployer.org';
switch (version) {
case 'latest':
return deployer + '/deployer.phar';
default:
return deployer + '/releases/v' + version + '/deployer.phar';
}
}
/**
* Function to get the Deployer url
*
* @param version
* @param os_version
*/
export async function getSymfonyUri(
version: string,
os_version: string
): Promise<string> {
let filename = '';
switch (os_version) {
case 'linux':
case 'darwin':
filename = 'symfony_' + os_version + '_amd64';
break;
case 'win32':
filename = 'symfony_windows_amd64.exe';
break;
default:
return await utils.log(
'Platform ' + os_version + ' is not supported',
os_version,
'error'
);
}
switch (version) {
case 'latest':
return 'releases/latest/download/' + filename;
default:
return 'releases/download/v' + version + '/' + filename;
}
}
/**
* Function to get the WP-CLI url
*
* @param version
*/
export async function getWpCliUrl(version: string): Promise<string> {
switch (version) {
case 'latest':
return 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
default:
return await getUri(
'wp-cli',
'-' + version + '.phar',
version,
'wp-cli/wp-cli/releases',
'v',
'download'
);
}
export async function getRelease(release: string, data: RS): Promise<string> {
release = release.includes('/') ? release.split('/')[1] : release;
return release.includes(':')
? [data['tool'], release.split(':')[1]].join(':')
: data['tool'];
}
/**
@ -243,9 +78,10 @@ export async function getWpCliUrl(version: string): Promise<string> {
*
* @param tools_list
*/
export async function addComposer(tools_list: string[]): Promise<string[]> {
export async function filterList(tools_list: string[]): Promise<string[]> {
const regex_any = /^composer($|:.*)/;
const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
const regex_valid =
/^composer:?($|preview$|snapshot$|v?\d+(\.\d+)?$|v?\d+\.\d+\.\d+[\w-]*$)/;
const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
let composer = 'composer';
tools_list = tools_list.filter(tool => !regex_any.test(tool));
@ -261,119 +97,352 @@ export async function addComposer(tools_list: string[]): Promise<string[]> {
}
/**
* Function to get composer URL for a given version
* Function to get the url of tool with the given version
*
* @param version
* @param data
*/
export async function getComposerUrl(version: string): Promise<string> {
let cache_url = `https://github.com/shivammathur/composer-cache/releases/latest/download/composer-${version.replace(
'latest',
'stable'
)}.phar`;
switch (true) {
case /^snapshot$/.test(version):
return `${cache_url},https://getcomposer.org/composer.phar`;
case /^preview$|^[1-2]$/.test(version):
return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
case /^\d+\.\d+\.\d+[\w-]*$/.test(version):
cache_url = `https://github.com/composer/composer/releases/download/${version}/composer.phar`;
return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
default:
return `${cache_url},https://getcomposer.org/composer-stable.phar`;
export async function getUrl(data: RS): Promise<string> {
if (data['version'] === 'latest') {
return [
data['domain'],
data['repository'],
data['prefix'],
data['version'],
data['verb'],
data['tool'] + data['extension']
]
.filter(Boolean)
.join('/');
} else {
return [
data['domain'],
data['repository'],
data['prefix'],
data['verb'],
data['version_prefix'] + data['version'],
data['tool'] + data['extension']
]
.filter(Boolean)
.join('/');
}
}
/**
* Function to get Tools list after cleanup
* Function to get the phar url in domain/tool-version.phar format
*
* @param tools_csv
* @param data
*/
export async function getCleanedToolsList(
tools_csv: string
): Promise<string[]> {
let tools_list: string[] = await utils.CSVArray(tools_csv);
tools_list = await addComposer(tools_list);
tools_list = tools_list
.map(function (extension: string) {
return extension
.trim()
.replace(
/-agent|behat\/|codeception\/|hirak\/|icanhazstring\/|laravel\/|narrowspark\/automatic-|overtrue\/|phpspec\/|robmorgan\/|symfony\//,
''
);
})
.filter(Boolean);
return [...new Set(tools_list)];
export async function getPharUrl(data: RS): Promise<string> {
if (data['version'] === 'latest') {
return data['domain'] + '/' + data['tool'] + '.phar';
} else {
return (
data['domain'] +
'/' +
data['tool'] +
'-' +
data['version_prefix'] +
data['version'] +
'.phar'
);
}
}
/**
* Helper function to get script to setup a tool using a phar url
*
* @param tool
* @param url
* @param os_version
* @param ver_param
* @param data
*/
export async function addArchive(
tool: string,
url: string,
os_version: string,
ver_param: string
): Promise<string> {
export async function addArchive(data: RS): Promise<string> {
return (
(await utils.getCommand(os_version, 'tool')) +
(await utils.joins(url, tool, ver_param))
(await utils.getCommand(data['os_version'], 'tool')) +
(await utils.joins(data['url'], data['tool'], data['version_parameter']))
);
}
/**
* Function to get the script to setup php-config and phpize
* Helper function to get script to setup a tool using composer
*
* @param tool
* @param os_version
* @param data
*/
export async function addDevTools(
tool: string,
os_version: string
): Promise<string> {
switch (os_version) {
export async function addPackage(data: RS): Promise<string> {
const command = await utils.getCommand(data['os_version'], 'composertool');
const parts: string[] = data['repository'].split('/');
return command + parts[1] + ' ' + data['release'] + ' ' + parts[0] + '/';
}
/**
* Function to add blackfire-player
*
* @param data
*/
export async function addBlackfirePlayer(data: RS): Promise<string> {
if (
/5\.[5-6]|7\.0/.test(data['php_version']) &&
data['version'] == 'latest'
) {
data['version'] = '1.9.3';
}
data['url'] = await getPharUrl(data);
return addArchive(data);
}
/**
* Function to add composer
*
* @param data
*/
export async function addComposer(data: RS): Promise<string> {
const github = data['github'];
const getcomposer = data['domain'];
let cache_url = `${github}/shivammathur/composer-cache/releases/latest/download/composer-${data[
'version'
].replace('latest', 'stable')}.phar`;
let source_url = `${getcomposer}/composer.phar`;
switch (true) {
case /^snapshot$/.test(data['version']):
break;
case /^preview$|^[1-2]$/.test(data['version']):
source_url = `${getcomposer}/composer-${data['version']}.phar`;
break;
case /^\d+\.\d+\.\d+[\w-]*$/.test(data['version']):
cache_url = `${github}/${data['repository']}/releases/download/${data['version']}/composer.phar`;
source_url = `${getcomposer}/composer-${data['version']}.phar`;
break;
default:
source_url = `${getcomposer}/composer-stable.phar`;
}
data['url'] = `${cache_url},${source_url}`;
data['version_parameter'] = data['version'];
return await addArchive(data);
}
/**
* Function to add Deployer
*
* @param data
*/
export async function addDeployer(data: RS): Promise<string> {
if (data['version'] === 'latest') {
data['url'] = data['domain'] + '/deployer.phar';
} else {
data['url'] =
data['domain'] + '/releases/v' + data['version'] + '/deployer.phar';
}
return await addArchive(data);
}
/**
* Function to add php-config and phpize
*
* @param data
*/
export async function addDevTools(data: RS): Promise<string> {
switch (data['os_version']) {
case 'linux':
case 'darwin':
return 'add_devtools ' + tool;
return 'add_devtools ' + data['tool'];
case 'win32':
return await utils.addLog(
'$tick',
tool,
tool + ' is not a windows tool',
data['tool'],
data['tool'] + ' is not a windows tool',
'win32'
);
default:
return await utils.log(
'Platform ' + os_version + ' is not supported',
os_version,
'Platform ' + data['os_version'] + ' is not supported',
data['os_version'],
'error'
);
}
}
/**
* Helper function to get script to setup a tool using composer
* Function to add PECL
*
* @param data
*/
export async function addPECL(data: RS): Promise<string> {
return await utils.getCommand(data['os_version'], 'pecl');
}
/**
* Function to add Phing
*
* @param data
*/
export async function addPhing(data: RS): Promise<string> {
data['url'] =
data['domain'] + '/get/phing-' + data['version'] + data['extension'];
return await addArchive(data);
}
/**
* Helper function to add Phive
*
* @param data
*/
export async function addPhive(data: RS): Promise<string> {
switch (true) {
case /5\.[3-5]/.test(data['php_version']):
return await utils.addLog(
'$cross',
'phive',
'Phive is not supported on PHP ' + data['php_version'],
data['os_version']
);
case /5\.6|7\.0/.test(data['php_version']):
data['version'] = data['version'].replace('latest', '0.12.1');
break;
case /7\.1/.test(data['php_version']):
data['version'] = data['version'].replace('latest', '0.13.5');
break;
case /7\.2/.test(data['php_version']):
data['version'] = data['version'].replace('latest', '0.14.5');
break;
}
if (data['version'] === 'latest') {
data['domain'] = data['domain'] + '/releases';
} else {
data['domain'] = [
data['github'],
data['repository'],
'releases/download',
data['version']
].join('/');
}
data['url'] = await getPharUrl(data);
return await addArchive(data);
}
/**
* Function to add PHPUnit and related tools
*
* @param data
*/
export async function addPHPUnitTools(data: RS): Promise<string> {
data['url'] = await getPharUrl(data);
return await addArchive(data);
}
/**
* Function to add Symfony
*
* @param data
*/
export async function addSymfony(data: RS): Promise<string> {
let filename: string;
switch (data['os_version']) {
case 'linux':
case 'darwin':
filename = 'symfony_' + data['os_version'] + '_amd64';
break;
case 'win32':
filename = 'symfony_windows_amd64.exe';
break;
default:
return await utils.log(
'Platform ' + data['os_version'] + ' is not supported',
data['os_version'],
'error'
);
}
if (data['version'] === 'latest') {
data['uri'] = ['releases/latest/download', filename].join('/');
} else {
data['uri'] = ['releases/download', 'v' + data['version'], filename].join(
'/'
);
}
data['url'] = [data['domain'], data['repository'], data['uri']].join('/');
return await addArchive(data);
}
/**
* Function to add WP-CLI
*
* @param data
*/
export async function addWPCLI(data: RS): Promise<string> {
if (data['version'] === 'latest') {
data['uri'] = 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
data['url'] = [data['domain'], data['uri']].join('/');
} else {
data['extension'] = '-' + data['version'] + data['extension'];
data['url'] = await getUrl(data);
}
return await addArchive(data);
}
/**
* Function to get information about a tool
*
* @param tool
* @param release
* @param prefix
* @param php_version
* @param os_version
*/
export async function addPackage(
tool: string,
export async function getData(
release: string,
prefix: string,
php_version: string,
os_version: string
): Promise<string> {
const tool_command = await utils.getCommand(os_version, 'composertool');
return tool_command + tool + ' ' + release + ' ' + prefix;
): Promise<RS> {
const json_file: string = await utils.readFile('tools.json', 'src/configs');
const json_objects: RSRS = JSON.parse(json_file);
release = release.replace(/\s+/g, '');
const parts: string[] = release.split(':');
const tool = parts[0];
const version = parts[1];
let data: RS;
if (Object.keys(json_objects).includes(tool)) {
data = json_objects[tool];
data['tool'] = tool;
} else {
const key: string | undefined = Object.keys(json_objects).find(
(key: string) => {
return json_objects[key]['alias'] == tool;
}
);
if (key) {
data = json_objects[key];
data['tool'] = key;
} else {
data = {
tool: tool.split('/')[1],
repository: tool,
type: 'composer'
};
data = !tool.includes('/') ? {tool: tool} : data;
}
}
data['github'] = 'https://github.com';
data['domain'] ??= data['github'];
data['extension'] ??= '.phar';
data['os_version'] = os_version;
data['php_version'] = php_version;
data['prefix'] = data['github'] === data['domain'] ? 'releases' : '';
data['verb'] = data['github'] === data['domain'] ? 'download' : '';
data['version_parameter'] = JSON.stringify(data['version_parameter']) || '';
data['version_prefix'] ??= '';
data['release'] = await getRelease(release, data);
data['version'] = version ? await getVersion(version, data) : 'latest';
return data;
}
export const functionRecord: Record<string, (data: RS) => Promise<string>> = {
composer: addComposer,
deployer: addDeployer,
dev_tools: addDevTools,
phive: addPhive,
blackfire_player: addBlackfirePlayer,
pecl: addPECL,
phing: addPhing,
phpunit: addPHPUnitTools,
phpcpd: addPHPUnitTools,
symfony: addSymfony,
wp_cli: addWPCLI
};
/**
* Setup tools
*
@ -386,159 +455,51 @@ export async function addTools(
php_version: string,
os_version: string
): Promise<string> {
let script = '\n' + (await utils.stepLog('Setup Tools', os_version));
const tools_list: Array<string> = await getCleanedToolsList(tools_csv);
let script = '\n';
if (tools_csv === 'none') {
return '';
} else {
script += await utils.stepLog('Setup Tools', os_version);
}
const tools_list = await filterList(await utils.CSVArray(tools_csv));
await utils.asyncForEach(tools_list, async function (release: string) {
const tool_data: {name: string; version: string} = await parseTool(release);
const tool: string = tool_data.name;
const version: string = tool_data.version;
const github = 'https://github.com/';
let uri: string = await getUri(
tool,
'.phar',
version,
'releases',
'',
'download'
);
const data: RS = await getData(release, php_version, os_version);
script += '\n';
let url = '';
switch (tool) {
case 'blackfire':
case 'grpc_php_plugin':
case 'protoc':
script += await utils.customPackage(tool, 'tools', version, os_version);
break;
case 'behat':
case 'codeception':
case 'phpspec':
script += await addPackage(tool, release, tool + '/', os_version);
break;
case 'blackfire-player':
url = await getBlackfirePlayerUrl(version, php_version);
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'composer':
url = await getComposerUrl(version);
script += await addArchive('composer', url, os_version, version);
break;
case 'composer-normalize':
uri = await getUri(tool, '.phar', version, 'releases', '', 'download');
url = github + 'ergebnis/composer-normalize/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'composer-prefetcher':
script += await addPackage(
tool,
release,
'narrowspark/automatic-',
os_version
switch (true) {
case data['error'] !== undefined:
script += await utils.addLog(
'$cross',
data['tool'],
data['error'],
data['os_version']
);
break;
case 'composer-require-checker':
uri = await getUri(tool, '.phar', version, 'releases', '', 'download');
url = github + 'maglnet/ComposerRequireChecker/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
case 'phar' === data['type']:
data['url'] = await getUrl(data);
script += await addArchive(data);
break;
case 'composer-unused':
script += await addPackage(tool, release, 'icanhazstring/', os_version);
case 'composer' === data['type']:
script += await addPackage(data);
break;
case 'cs2pr':
uri = await getUri(tool, '', version, 'releases', '', 'download');
url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'deployer':
url = await getDeployerUrl(version);
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'flex':
script += await addPackage(tool, release, 'symfony/', os_version);
break;
case 'infection':
url = github + 'infection/infection/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'pecl':
script += await utils.getCommand(os_version, 'pecl');
break;
case 'phan':
url = github + 'phan/phan/' + uri;
script += await addArchive(tool, url, os_version, '"-v"');
break;
case 'phing':
url = 'https://www.phing.info/get/phing-' + version + '.phar';
script += await addArchive(tool, url, os_version, '"-v"');
break;
case 'phinx':
script += await addPackage(tool, release, 'robmorgan/', os_version);
break;
case 'phive':
script += await addPhive(version, php_version, os_version);
break;
case 'php-config':
case 'phpize':
script += await addDevTools(tool, os_version);
break;
case 'php-cs-fixer':
uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download');
url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'phpcbf':
case 'phpcs':
url = github + 'squizlabs/PHP_CodeSniffer/' + uri;
script += await addArchive(tool, url, os_version, '"--version"');
break;
case 'phpcpd':
case 'phpunit':
url = await getPharUrl('https://phar.phpunit.de', tool, '', version);
script += await addArchive(tool, url, os_version, '"--version"');
break;
case 'phplint':
script += await addPackage(tool, release, 'overtrue/', os_version);
break;
case 'phpmd':
url = github + 'phpmd/phpmd/' + uri;
script += await addArchive(tool, url, os_version, '"--version"');
break;
case 'phpstan':
url = github + 'phpstan/phpstan/' + uri;
script += await addArchive(tool, url, os_version, '"-V"');
break;
case 'prestissimo':
script += await addPackage(tool, release, 'hirak/', os_version);
break;
case 'psalm':
url = github + 'vimeo/psalm/' + uri;
script += await addArchive(tool, url, os_version, '"-v"');
break;
case 'symfony':
case 'symfony-cli':
uri = await getSymfonyUri(version, os_version);
url = github + 'symfony/cli/' + uri;
script += await addArchive('symfony', url, os_version, 'version');
break;
case 'vapor-cli':
case 'vapor':
script += await addPackage(
'vapor-cli',
release,
'laravel/',
os_version
case 'custom-package' === data['type']:
script += await utils.customPackage(
data['tool'].split('-')[0],
'tools',
data['version'],
data['os_version']
);
break;
case 'wp':
case 'wp-cli':
url = github + (await getWpCliUrl(version));
script += await addArchive('wp-cli', url, os_version, '"--version"');
case 'custom-function' === data['type']:
script += await functionRecord[data['function']](data);
break;
case /^none$/.test(data['tool']):
break;
default:
script += await utils.addLog(
'$cross',
tool,
'Tool ' + tool + ' is not supported',
os_version
data['tool'],
'Tool ' + data['tool'] + ' is not supported',
data['os_version']
);
break;
}

View File

@ -1,7 +1,8 @@
import {IncomingMessage} from 'http';
import {IncomingMessage, OutgoingHttpHeaders} from 'http';
import * as fs from 'fs';
import * as https from 'https';
import * as path from 'path';
import * as url from 'url';
import * as core from '@actions/core';
/**
@ -46,32 +47,60 @@ export async function getInput(
/**
* Function to fetch an URL
*
* @param url
* @param input_url
* @param auth_token
*/
export async function fetch(url: string): Promise<string> {
const fetch_promise: Promise<string> = new Promise(resolve => {
const req = https.get(url, (res: IncomingMessage) => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => (body += chunk));
res.on('end', () => resolve(body));
});
req.end();
});
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 =
'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json';
const manifest = await getManifestURL();
switch (true) {
case /^(latest|\d+\.x)$/.test(version):
return JSON.parse(await fetch(manifest))[version];
return JSON.parse((await fetch(manifest))['data'])[version];
default:
switch (true) {
case version.length > 1:
@ -207,10 +236,14 @@ export async function addLog(
* Read the scripts
*
* @param filename
* @param directory
*/
export async function readScript(filename: string): Promise<string> {
export async function readFile(
filename: string,
directory: string
): Promise<string> {
return fs.readFileSync(
path.join(__dirname, '../src/scripts/' + filename),
path.join(__dirname, '../' + directory, filename),
'utf8'
);
}
@ -234,20 +267,23 @@ export async function writeScript(
/**
* Function to break extension csv into an array
*
* @param package_csv
* @param extension_csv
*/
export async function packageArray(
package_csv: string
export async function extensionArray(
extension_csv: string
): Promise<Array<string>> {
switch (package_csv) {
switch (extension_csv) {
case '':
case ' ':
return [];
default:
return package_csv
return extension_csv
.split(',')
.map(function (package_name: string) {
return package_name
.map(function (extension: string) {
if (/.+-.+\/.+@.+/.test(extension)) {
return extension;
}
return extension
.trim()
.toLowerCase()
.replace(/^php[-_]/, '');
@ -438,3 +474,24 @@ export async function customPackage(
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,63 +1,18 @@
{
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./lib", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
"esModuleInterop": true,
"lib": [
"ES2019"
],
"module": "commonjs",
"moduleResolution": "node",
"noImplicitAny": true,
"outDir": "./lib",
"removeComments": true,
"rootDir": "./src",
"sourceMap": true,
"strict": true,
"target": "ES2019"
},
"exclude": ["node_modules", "**/*.test.ts"]
"exclude": ["__tests__", "lib", "node_modules"]
}