Compare commits

..

9 Commits
2.11.0 ... sapi

50 changed files with 9016 additions and 5464 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 | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| 1.11.x | :white_check_mark: | | 1.10.x | :white_check_mark: |
| 2.11.x | :white_check_mark: | | 2.8.x | :white_check_mark: |
## Supported PHP Versions ## Supported PHP Versions
@ -15,6 +15,7 @@ This security policy only applies to the latest patches of the following PHP ver
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| 7.2 | :white_check_mark: |
| 7.3 | :white_check_mark: | | 7.3 | :white_check_mark: |
| 7.4 | :white_check_mark: | | 7.4 | :white_check_mark: |
| 8.0 | :white_check_mark: | | 8.0 | :white_check_mark: |

View File

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

View File

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

View File

@ -66,17 +66,18 @@ Both `GitHub-hosted` and `self-hosted` runners are suppported by `setup-php` on
|Virtual environment|YAML workflow label|Pre-installed PHP| |Virtual environment|YAML workflow label|Pre-installed PHP|
|--- |--- |--- | |--- |--- |--- |
|Ubuntu 16.04 [(deprecated)](https://setup-php.com/i/452)|`ubuntu-16.04`|`PHP 5.6` to `PHP 8.0`| |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 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`| |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`| |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 Catalina 10.15|`macos-latest` or `macos-10.15`|`PHP 8.0`|
|macOS Big Sur 11.x|`macos-11.0`|`PHP 8.0`| |macOS Big Sur 11.0|`macos-11.0`|`PHP 8.0`|
### Self-Hosted Runners ### Self-Hosted Runners
|Host OS/Virtual environment|YAML workflow label| |Host OS/Virtual environment|YAML workflow label|
|--- |--- | |--- |--- |
|Ubuntu 16.04|`self-hosted` or `Linux`|
|Ubuntu 18.04|`self-hosted` or `Linux`| |Ubuntu 18.04|`self-hosted` or `Linux`|
|Ubuntu 20.04|`self-hosted` or `Linux`| |Ubuntu 20.04|`self-hosted` or `Linux`|
|Windows 7 and newer|`self-hosted` or `Windows`| |Windows 7 and newer|`self-hosted` or `Windows`|
@ -116,7 +117,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. 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 a git repository can be set up. - On `Ubuntu`, extensions which are available as a package, available on `PECL`, or hosted on GitHub can be setup.
```yaml ```yaml
- name: Setup PHP with PECL extension - name: Setup PHP with PECL extension
@ -126,11 +127,9 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
extensions: imagick, swoole extensions: imagick, swoole
``` ```
- On `Windows`, extensions available on `PECL` which have the `DLL` binary can be set up. - On `Windows`, extensions available on `PECL` which have the `DLL` binary can be setup.
- On `macOS`, extensions available on `PECL` or a git repository can be set up. - On `macOS`, extensions available on `PECL` or hosted on GitHub can be installed.
- 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. - Extensions installed along with PHP if specified are enabled.
@ -164,14 +163,14 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
extensions: :opcache extensions: :opcache
``` ```
- 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. - 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.
```yaml ```yaml
- name: Setup PHP with intl - name: Setup PHP with intl
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '7.4' php-version: '7.4'
extensions: intl-69.1 extensions: intl-68.2
``` ```
- Extensions loaded by default after `setup-php` runs can be found on the [wiki](https://github.com/shivammathur/setup-php/wiki). - Extensions loaded by default after `setup-php` runs can be found on the [wiki](https://github.com/shivammathur/setup-php/wiki).
@ -179,7 +178,7 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
- These extensions have custom support: - These extensions have custom support:
- `cubrid`, `pdo_cubrid` and `gearman` on `Ubuntu`. - `cubrid`, `pdo_cubrid` and `gearman` on `Ubuntu`.
- `geos` on `Ubuntu` and `macOS`. - `geos` on `Ubuntu` and `macOS`.
- `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_firebird`, `pdo_oci`, `pecl_http`, `phalcon3` and `phalcon4` on all supported OS. - `blackfire`, `couchbase`, `ioncube`, `oci8`, `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`. - 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`.
@ -193,6 +192,18 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
fail-fast: true 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 ## :wrench: Tools Support
These tools can be setup globally using the `tools` input. It accepts a string in csv-format. These tools can be setup globally using the `tools` input. It accepts a string in csv-format.
@ -217,16 +228,6 @@ These tools can be setup globally using the `tools` input. It accepts a string i
tools: composer:v2 tools: composer:v2
``` ```
- If you do not use composer in your workflow, you can specify `tools: none` to skip it.
```yaml
- name: Setup PHP without composer
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: none
```
- 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`. - 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. - 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.
@ -241,16 +242,6 @@ These tools can be setup globally using the `tools` input. It accepts a string i
tools: phpunit:8.5.8 tools: phpunit:8.5.8
``` ```
- Any composer tool or package can also be set up globally by specifying it as `vendor/package`. For example to set up `psalm`.
```yaml
- name: Setup PHP with tools
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: vimeo/psalm
```
- 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`. - 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 ```yaml
@ -266,13 +257,13 @@ These tools can be setup globally using the `tools` input. It accepts a string i
**Notes** **Notes**
- Input `tools` is useful to set up tools which you only use in GitHub Actions, thus keeping your `composer.json` tidy. - 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 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 set up it with `tools` input as the two instances of the tool might conflict. - 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.
## :signal_strength: Coverage Support ## :signal_strength: Coverage Support
### Xdebug ### Xdebug
Specify `coverage: xdebug` to use `Xdebug` and disable `PCOV`. Specify `coverage: xdebug` to use `Xdebug`.
Runs on all [PHP versions supported](#tada-php-support "List of PHP versions supported on this GitHub Action"). Runs on all [PHP versions supported](#tada-php-support "List of PHP versions supported on this GitHub Action").
```yaml ```yaml
@ -296,9 +287,10 @@ Runs on all [PHP versions supported](#tada-php-support "List of PHP versions sup
### PCOV ### 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. 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. - If your source code directory is other than `src`, `lib` or, `app`, specify `pcov.directory` using the `ini-values` input.
```yaml ```yaml
@ -330,7 +322,6 @@ Disable coverage for these reasons:
- It will remove `Xdebug`, which will have a positive impact on PHP performance. - It will remove `Xdebug`, which will have a positive impact on PHP performance.
- You are using `phpdbg` for running your tests. - You are using `phpdbg` for running your tests.
- You are profiling your code using `blackfire`. - 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 ```yaml
- name: Setup PHP with no coverage driver - name: Setup PHP with no coverage driver
@ -619,20 +610,20 @@ jobs:
Run the workflow locally with `act` using [`shivammathur/node`](https://github.com/shivammathur/node-docker "Docker image to run setup-php") docker images. 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. For example, if you are using `ubuntu-20.04` in your workflow, run `act -P ubuntu-20.04=shivammathur/node:20.04`. Choose the image tag which matches the `runs-on` property in your workflow:
```bash ```bash
# For runs-on: ubuntu-latest # For runs-on: ubuntu-latest
act -P ubuntu-latest=shivammathur/node:latest act -P ubuntu-latest=shivammathur/node:latest
# For runs-on: ubuntu-20.04 # For runs-on: ubuntu-20.04
act -P ubuntu-20.04=shivammathur/node:2004 act -P ubuntu-20.04=shivammathur/node:focal
# For runs-on: ubuntu-18.04 # For runs-on: ubuntu-18.04
act -P ubuntu-18.04=shivammathur/node:1804 act -P ubuntu-18.04=shivammathur/node:bionic
# For runs-on: ubuntu-16.04 (deprecated) # For runs-on: ubuntu-16.04
act -P ubuntu-16.04=shivammathur/node:1604 act -P ubuntu-16.04=shivammathur/node:xenial
``` ```
### JIT Configuration ### JIT Configuration
@ -640,7 +631,6 @@ act -P ubuntu-16.04=shivammathur/node:1604
> Enable Just-in-time(JIT) on PHP 8.0 and PHP 8.1. > 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`. - To enable JIT, enable `opcache` in cli mode by setting `opcache.enable_cli=1`.
- JIT conflicts with `Xdebug`, `PCOV`, and any other extension which overrides `zend_execute_ex` function, so set `coverage: none` and remove those extensions if added.
- By default, `opcache.jit=1235` and `opcache.jit_buffer_size=256M` are set which can be changed using `ini-values` input. - 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"). - 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").
@ -651,7 +641,6 @@ For example to enable JIT in `tracing` mode with buffer size of `64 MB`.
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '8.0' php-version: '8.0'
coverage: none
ini-values: opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M ini-values: opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M
``` ```
@ -827,9 +816,9 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
## :bookmark: Versioning ## :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, 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. - 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.
- 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. - 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, security patches 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 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. - 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. - 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.
@ -846,24 +835,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. - 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"). - 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").
*Contributors of `setup-php` and other related projects* *Join the list of setup-php contributors*
<p align="center"> <p align="center">
<a href="https://github.com/shivammathur/setup-php/graphs/contributors"> <a href="https://github.com/shivammathur/setup-php/graphs/contributors">
<img src="https://setup-php.com/contributors/?" alt="Contributors of setup-php and related projects" width="100%"> <img src="https://opencollective.com/setup-php/contributors.svg?width=1024&button=false" alt="setup-php contributors" width="100%">
</a> </a>
</p> </p>
## :sparkling_heart: Support This Project ## :sparkling_heart: Support This Project
- 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: - If setup-php saved your developer time, please consider sponsoring setup-php:
- [Open Collective](https://opencollective.com/setup-php "setup-php Open Collective") - [Open Collective](https://opencollective.com/setup-php "setup-php Open Collective")
- [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal") - [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal")
- [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon") - [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon")
- Please [reach out](mailto:contact@setup-php.com) if you have any questions about sponsoring setup-php. - Please [reach out](mailto:contact@setup-php.com) if you have any questions regarding sponsoring setup-php.
- Please star the project and share it. If you blog, please share your experience of using this action. - Please star the project and share it. If you blog, please share your experience of using this action.
*`setup-php` is generously supported by* *Huge thanks to the following companies for supporting `setup-php`*
<p> <p>
<a href="https://www.jetbrains.com/?from=setup-php"> <a href="https://www.jetbrains.com/?from=setup-php">
@ -887,6 +876,7 @@ 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") - [Node.js dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Node.js dependencies")
- [aaronparker/VcRedist](https://github.com/aaronparker/VcRedist "VcRedist PowerShell package") - [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") - [mlocati/powershell-phpmanager](https://github.com/mlocati/powershell-phpmanager "Package to handle PHP on windows")
- [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Packaging active PHP packages") - [ppa:ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php "Packaging active PHP packages")
- [shivammathur/cache-extensions](https://github.com/shivammathur/cache-extensions "GitHub action to help with caching PHP extensions") - [shivammathur/cache-extensions](https://github.com/shivammathur/cache-extensions "GitHub action to help with caching PHP extensions")

View File

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

View File

@ -5,9 +5,7 @@ import * as utils from '../src/utils';
* Mock install.ts * Mock install.ts
*/ */
jest.mock('../src/install', () => ({ jest.mock('../src/install', () => ({
getScript: jest getScript: jest.fn().mockImplementation(
.fn()
.mockImplementation(
async ( async (
filename: string, filename: string,
version: string, version: string,
@ -39,7 +37,8 @@ jest.mock('../src/install', () => ({
return script; return script;
} }
), ),
run: jest.fn().mockImplementation(async (): Promise<string> => { run: jest.fn().mockImplementation(
async (): Promise<string> => {
const os_version: string = process.env['RUNNER_OS'] || ''; const os_version: string = process.env['RUNNER_OS'] || '';
const version: string = await utils.parseVersion( const version: string = await utils.parseVersion(
await utils.getInput('php-version', true) await utils.getInput('php-version', true)
@ -53,7 +52,8 @@ jest.mock('../src/install', () => ({
version, version,
__dirname __dirname
].join(' '); ].join(' ');
}) }
)
})); }));
/** /**

View File

@ -16,7 +16,7 @@ describe('Tools tests', () => {
expect(await tools.getToolVersion('1.2.3-alpha.1')).toBe('1.2.3-alpha.1'); expect(await tools.getToolVersion('1.2.3-alpha.1')).toBe('1.2.3-alpha.1');
}); });
it('checking parseTool', async () => { it('checking parseToolVersion', async () => {
expect(await tools.parseTool('phpunit')).toStrictEqual({ expect(await tools.parseTool('phpunit')).toStrictEqual({
name: 'phpunit', name: 'phpunit',
version: 'latest' version: 'latest'
@ -65,10 +65,6 @@ describe('Tools tests', () => {
name: 'phpunit', name: 'phpunit',
version: '1.2.3-alpha.1' version: '1.2.3-alpha.1'
}); });
expect(await tools.parseTool('phpunit/phpunit:^1.2.3')).toStrictEqual({
name: 'phpunit/phpunit',
version: '^1.2.3'
});
}); });
it('checking getUri', async () => { it('checking getUri', async () => {
@ -152,9 +148,9 @@ describe('Tools tests', () => {
'a', 'a',
'b' 'b'
]); ]);
expect(await tools.addComposer(['a', 'b', 'composer:1.2.3'])).toStrictEqual( expect(
['composer:1.2.3', 'a', 'b'] await tools.addComposer(['a', 'b', 'composer:1.2.3'])
); ).toStrictEqual(['composer:1.2.3', 'a', 'b']);
expect( expect(
await tools.addComposer(['a', 'b', 'composer:v1.2.3']) await tools.addComposer(['a', 'b', 'composer:v1.2.3'])
).toStrictEqual(['composer:1.2.3', 'a', 'b']); ).toStrictEqual(['composer:1.2.3', 'a', 'b']);
@ -238,6 +234,22 @@ describe('Tools tests', () => {
); );
}); });
it('checking getCleanedToolsList', async () => {
const tools_list: string[] = await tools.getCleanedToolsList(
'tool, composer:1.2, behat/behat, icanhazstring/composer-unused, laravel/vapor-cli, robmorgan/phinx, phpspec/phpspec, symfony/flex'
);
expect(tools_list).toStrictEqual([
'composer',
'tool',
'behat',
'composer-unused',
'vapor-cli',
'phinx',
'phpspec',
'flex'
]);
});
it('checking getWpCliUri', async () => { it('checking getWpCliUri', async () => {
expect(await tools.getWpCliUrl('latest')).toBe( expect(await tools.getWpCliUrl('latest')).toBe(
'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true' 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true'
@ -536,11 +548,9 @@ describe('Tools tests', () => {
const listOfTools = [ const listOfTools = [
'composer:v1', 'composer:v1',
'codeception/codeception', 'codeception/codeception',
'prestissimo',
'hirak/prestissimo', 'hirak/prestissimo',
'composer-prefetcher',
'narrowspark/automatic-composer-prefetcher', 'narrowspark/automatic-composer-prefetcher',
'robmorgan/phinx: ^1.2' 'robmorgan/phinx'
]; ];
const script: string = await tools.addTools( const script: string = await tools.addTools(
@ -553,9 +563,9 @@ describe('Tools tests', () => {
'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-1.phar,https://getcomposer.org/composer-1.phar composer' 'Add-Tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-1.phar,https://getcomposer.org/composer-1.phar composer'
); );
expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/'); expect(script).toContain('Add-Composertool prestissimo prestissimo hirak/');
expect(script).toContain('Add-Composertool phinx phinx:^1.2 robmorgan/'); expect(script).toContain('Add-Composertool phinx phinx robmorgan/');
expect(script).toContain( expect(script).toContain(
'Add-Composertool automatic-composer-prefetcher automatic-composer-prefetcher narrowspark/' 'Add-Composertool composer-prefetcher composer-prefetcher narrowspark/automatic-'
); );
}); });
it('checking composer setup', async () => { it('checking composer setup', async () => {
@ -583,15 +593,5 @@ describe('Tools tests', () => {
expect(script).toContain( expect(script).toContain(
'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-snapshot.phar,https://getcomposer.org/composer.phar composer snapshot' 'add_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-snapshot.phar,https://getcomposer.org/composer.phar composer snapshot'
); );
script = await tools.addTools('none', '7.4', 'linux');
expect(script).toStrictEqual('');
script = await tools.addTools('none, phpunit', '7.4', 'linux');
expect(script).toStrictEqual(
'\nstep_log "Setup Tools"' +
'\nadd_tool https://github.com/shivammathur/composer-cache/releases/latest/download/composer-stable.phar,https://getcomposer.org/composer-stable.phar composer latest\n' +
'\nadd_tool https://phar.phpunit.de/phpunit.phar phpunit "--version"'
);
}); });
}); });

View File

@ -8,9 +8,11 @@ jest.mock('@actions/core', () => ({
}) })
})); }));
jest.spyOn(utils, 'fetch').mockImplementation(async (url): Promise<string> => { jest.spyOn(utils, 'fetch').mockImplementation(
async (url): Promise<string> => {
return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`; return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`;
}); }
);
async function cleanup(path: string): Promise<void> { async function cleanup(path: string): Promise<void> {
fs.unlink(path, error => { fs.unlink(path, error => {
@ -105,16 +107,16 @@ describe('Utils tests', () => {
await cleanup(script_path); await cleanup(script_path);
}); });
it('checking extensionArray', async () => { it('checking packageArray', async () => {
expect(await utils.extensionArray('a, b, php_c, php-d')).toEqual([ expect(await utils.packageArray('a, b, php_c, php-d')).toEqual([
'a', 'a',
'b', 'b',
'c', 'c',
'd' 'd'
]); ]);
expect(await utils.extensionArray('')).toEqual([]); expect(await utils.packageArray('')).toEqual([]);
expect(await utils.extensionArray(' ')).toEqual([]); expect(await utils.packageArray(' ')).toEqual([]);
}); });
it('checking INIArray', async () => { it('checking INIArray', async () => {
@ -257,31 +259,4 @@ describe('Utils tests', () => {
await utils.customPackage('pkg8', 'ext', '1.2.3', 'linux') await utils.customPackage('pkg8', 'ext', '1.2.3', 'linux')
).toContain(script_path + '\nadd_pkg 1.2.3'); ).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,6 +18,9 @@ inputs:
coverage: coverage:
description: 'Setup code coverage driver.' description: 'Setup code coverage driver.'
required: false required: false
sapi:
description: 'Setup PHP Server API.'
required: false
tools: tools:
description: 'Setup popular tools globally.' description: 'Setup popular tools globally.'
required: false required: false

2829
dist/index.js vendored

File diff suppressed because it is too large Load Diff

9651
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

36
src/configs/nginx.conf Normal file
View File

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

View File

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

View File

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

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

View File

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

View File

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

51
src/sapi.ts Normal file
View File

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

@ -12,7 +12,7 @@ export composer_json="$HOME/.composer/composer.json"
export composer_lock="$HOME/.composer/composer.lock" export composer_lock="$HOME/.composer/composer.lock"
export latest="releases/latest/download" export latest="releases/latest/download"
export github="https://github.com/shivammathur" export github="https://github.com/shivammathur"
export jsdeliver="https://cdn.jsdelivr.net/gh/shivammathur" export bintray="https://dl.bintray/shivammathur"
# Function to log start of a operation. # Function to log start of a operation.
step_log() { step_log() {
@ -29,15 +29,18 @@ 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" printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
else else
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message" 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 fi
} }
# Function to log result of installing extension. # Function to log result of installing extension.
add_extension_log() { add_extension_log() {
extension=$1
status=$2
extension_name=$(echo "$extension" | cut -d '-' -f 1)
( (
check_extension "$(echo "$1" | cut -d '-' -f 1)" && add_log "$tick" "$1" "$2" check_extension "$extension_name" && add_log "$tick" "$extension_name" "$status"
) || add_log "$cross" "$1" "Could not install $1 on PHP ${semver:?}" ) || add_log "$cross" "$extension_name" "Could not install $extension on PHP ${semver:?}"
} }
# Function to read env inputs. # Function to read env inputs.
@ -70,22 +73,18 @@ get() {
fi fi
} }
# Function to download and run scripts from GitHub releases with jsdeliver fallback. # Function to download and run scripts from GitHub releases with bintray fallback.
run_script() { run_script() {
repo=$1 repo=$1
shift shift
args=("$@") args=("$@")
get -q -e /tmp/install.sh "$github/$repo/$latest/install.sh" "$jsdeliver/$1@main/scripts/install.sh" get -q -e /tmp/install.sh "$github/$repo/$latest/install.sh" "$bintray/php/$repo.sh"
bash /tmp/install.sh "${args[@]}" bash /tmp/install.sh "${args[@]}"
} }
# Function to install required packages on self-hosted runners. # Function to install required packages on self-hosted runners.
self_hosted_setup() { self_hosted_setup() {
if [ "$runner" = "self-hosted" ]; then if [ "$runner" = "self-hosted" ]; then
if [ "$DISTRIB_RELEASE" = "16.04" ] && [ "$CONTAINER" != "shivammathur/node" ]; then
add_log "$cross" "Ubuntu" "Ubuntu 16.04 (Xenial Xerus) is no longer supported on self-hosted runner"
exit 1
fi
if [[ "${version:?}" =~ $old_versions ]]; then if [[ "${version:?}" =~ $old_versions ]]; then
add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner" add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner"
exit 1 exit 1
@ -105,33 +104,12 @@ check_extension() {
fi 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. # Function to enable existing extensions.
enable_extension() { enable_extension() {
modules_dir="/var/lib/php/modules/$version" if [ -e /tmp/setup_php_dismod ] && grep -q "$1" /tmp/setup_php_dismod; then
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete sudo phpenmod -v "$version" "$1" >/dev/null 2>&1
if [ -d /tmp/extcache/"$1" ]; then fi
enable_cache_extension "$1" "$2" if ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
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 echo "$2=${ext_dir:?}/$1.so" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
fi fi
} }
@ -148,6 +126,9 @@ configure_php() {
# Function to configure PECL. # Function to configure PECL.
configure_pecl() { configure_pecl() {
if ! [ -e /tmp/pecl_config ]; then 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 for script in pear pecl; do
sudo "$script" config-set php_ini "${pecl_file:-${ini_file[@]}}" sudo "$script" config-set php_ini "${pecl_file:-${ini_file[@]}}"
sudo "$script" channel-update "$script".php.net sudo "$script" channel-update "$script".php.net
@ -172,30 +153,10 @@ get_pecl_version() {
# Function to install PECL extensions and accept default options # Function to install PECL extensions and accept default options
pecl_install() { pecl_install() {
local extension=$1 local extension=$1
add_pecl >/dev/null 2>&1 configure_pecl >/dev/null 2>&1
yes '' 2>/dev/null | sudo pecl install -f "$extension" >/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. # Function to setup pre-release extensions using PECL.
add_unstable_extension() { add_unstable_extension() {
extension=$1 extension=$1
@ -209,8 +170,7 @@ add_unstable_extension() {
get_tool_version() { get_tool_version() {
tool=$1 tool=$1
param=$2 param=$2
alp="[a-zA-Z0-9]" version_regex="[0-9]+((\.{1}[0-9]+)+)(\.{0})(-[a-zA-Z0-9]+){0,1}"
version_regex="[0-9]+((\.{1}$alp+)+)(\.{0})(-$alp+){0,1}"
if [ "$tool" = "composer" ]; then if [ "$tool" = "composer" ]; then
if [ "$param" != "snapshot" ]; then if [ "$param" != "snapshot" ]; then
composer_version="$(grep -Ea "const\sVERSION" "$tool_path_dir/composer" | grep -Eo "$version_regex")" composer_version="$(grep -Ea "const\sVERSION" "$tool_path_dir/composer" | grep -Eo "$version_regex")"
@ -233,12 +193,11 @@ configure_composer() {
exit 1 exit 1
fi fi
if ! [ -e "$composer_json" ]; then if ! [ -e "$composer_json" ]; then
sudo mkdir -p "$(dirname "$composer_json")" echo '{}' | tee "$composer_json" >/dev/null 2>&1
echo '{}' | tee "$composer_json" >/dev/null
sudo chmod 644 "$composer_json" sudo chmod 644 "$composer_json"
fi fi
composer -q config -g process-timeout 0 composer -q config -g process-timeout 0
echo "$composer_bin" >>"$GITHUB_PATH" echo "$composer_bin" >> "$GITHUB_PATH"
if [ -n "$COMPOSER_TOKEN" ]; then if [ -n "$COMPOSER_TOKEN" ]; then
composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN" composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
fi fi
@ -250,14 +209,14 @@ add_tool() {
tool=$2 tool=$2
ver_param=$3 ver_param=$3
tool_path="$tool_path_dir/$tool" tool_path="$tool_path_dir/$tool"
if ! [[ "$PATH" =~ $tool_path_dir ]]; then if ! [[ "$PATH" =~ $tool_path_dir ]] ; then
export PATH=$PATH:"$tool_path_dir" export PATH=$PATH:"$tool_path_dir"
echo "export PATH=\$PATH:$tool_path_dir" | sudo tee -a "$GITHUB_ENV" >/dev/null echo "export PATH=\$PATH:$tool_path_dir" | sudo tee -a "$GITHUB_ENV" >/dev/null
fi fi
if [ ! -e "$tool_path" ]; then if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path" rm -rf "$tool_path"
fi fi
IFS="," read -r -a url <<<"$url" IFS="," read -r -a url <<< "$url"
status_code=$(get -v -e "$tool_path" "${url[@]}") status_code=$(get -v -e "$tool_path" "${url[@]}")
if [ "$status_code" != "200" ] && [[ "${url[0]}" =~ .*github.com.*releases.*latest.* ]]; then 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)}" 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)}"
@ -287,9 +246,9 @@ add_composertool() {
fi fi
( (
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
composer global require "$prefix$release" 2>&1 | tee /tmp/composer.log >/dev/null 2>&1 composer global require "$prefix$release" >/dev/null 2>&1
log=$(grep "$prefix$tool" /tmp/composer.log) && json=$(grep "$prefix$tool" "$composer_json") &&
tool_version=$(get_tool_version 'echo' "$log") && tool_version=$(get_tool_version 'echo' "$json") &&
add_log "$tick" "$tool" "Added $tool $tool_version" add_log "$tick" "$tool" "Added $tool $tool_version"
) || add_log "$cross" "$tool" "Could not setup $tool" ) || add_log "$cross" "$tool" "Could not setup $tool"
add_tools_helper "$tool" add_tools_helper "$tool"
@ -298,9 +257,11 @@ add_composertool() {
fi fi
} }
# Function to get PHP version in semver format. # Function to get versions of PHP binaries in semver format.
php_semver() { php_semver() {
php"$version" -v | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1 binary=${1:-"php$version"}
arg=${2:-'-v'}
"$binary" "$arg" | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1
} }
# Function to get the tag for a php version. # Function to get the tag for a php version.
@ -311,3 +272,23 @@ php_src_tag() {
fi fi
echo "$php_src_tag" 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,24 +7,12 @@ self_hosted_helper() {
fi 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. # Function to remove extensions.
remove_extension() { remove_extension() {
extension=$1 extension=$1
if check_extension "$extension"; then if check_extension "$extension"; then
disable_extension "$extension" sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
delete_extension "$extension" sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") || (! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
add_log "${cross:?}" ":$extension" "Could not remove $extension on PHP ${semver:?}" add_log "${cross:?}" ":$extension" "Could not remove $extension on PHP ${semver:?}"
else else
@ -32,7 +20,26 @@ remove_extension() {
fi fi
} }
# Function to fetch a brew tap. # 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
fetch_brew_tap() { fetch_brew_tap() {
tap=$1 tap=$1
tap_user=$(dirname "$tap") tap_user=$(dirname "$tap")
@ -71,14 +78,13 @@ add_brew_extension() {
add_brew_tap shivammathur/homebrew-php add_brew_tap shivammathur/homebrew-php
add_brew_tap shivammathur/homebrew-extensions 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 sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
update_dependencies >/dev/null 2>&1 brew install "$formula@$version" >/dev/null 2>&1
brew install -f "$formula@$version" >/dev/null 2>&1
sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir" sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
add_extension_log "$extension" "Installed and enabled" add_extension_log "$extension" "Installed and enabled"
fi fi
} }
# Function to setup extensions. # Function to setup extensions
add_extension() { add_extension() {
extension=$1 extension=$1
prefix=$2 prefix=$2
@ -86,7 +92,7 @@ add_extension() {
if check_extension "$extension"; then if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled" add_log "${tick:?}" "$extension" "Enabled"
else else
[[ "$version" =~ 5.[4-5] ]] && [ "$extension" = "imagick" ] && brew install -f pkg-config imagemagick >/dev/null 2>&1 [[ "$version" =~ 5.[4-5] ]] && [ "$extension" = "imagick" ] && brew install pkg-config imagemagick >/dev/null 2>&1
pecl_install "$extension" >/dev/null 2>&1 && pecl_install "$extension" >/dev/null 2>&1 &&
if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
add_extension_log "$extension" "Installed and enabled" add_extension_log "$extension" "Installed and enabled"
@ -101,106 +107,63 @@ add_devtools() {
# Function to handle request to add PECL. # Function to handle request to add PECL.
add_pecl() { add_pecl() {
configure_pecl >/dev/null 2>&1
pecl_version=$(get_tool_version "pecl" "version") pecl_version=$(get_tool_version "pecl" "version")
add_log "${tick:?}" "PECL" "Found PECL $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() { link_libraries() {
formula=$1 formula=$1
formula_prefix="$(brew --prefix "$formula")" formula_prefix="$(brew --prefix "$formula")"
sudo mkdir -p "$formula_prefix"/lib sudo mkdir -p "$formula_prefix"/lib
for lib in "$formula_prefix"/lib/*.dylib; do sudo cp -a "$formula_prefix"/lib/*.dylib "$brew_prefix/lib" 2>/dev/null || true
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() { update_dependencies_helper() {
dependency=$1 formula=$1
get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$dependency.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$dependency.rb" get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$formula.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$formula.rb"
link_libraries "$dependency" link_libraries "$formula"
} }
# Function to update dependencies. # Function to update dependencies.
update_dependencies() { update_dependencies() {
if ! [ -e /tmp/update_dependencies ] && [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then if [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
patch_brew while read -r formula; do
while read -r dependency; do update_dependencies_helper "$formula" &
update_dependencies_helper "$dependency" &
to_wait+=($!) to_wait+=($!)
done <"$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}" done <"$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}"
wait "${to_wait[@]}" wait "${to_wait[@]}"
# Remove when PCRE2 on macOS images is updated to PCRE2 10.37
brew reinstall pcre2 >/dev/null 2>&1
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 fi
} }
# Function to setup PHP 5.6 and newer using Homebrew. # Function to setup PHP 5.6 and newer using Homebrew.
add_php() { add_php() {
action=$1 action=$1
existing_version=$2
add_brew_tap shivammathur/homebrew-php add_brew_tap shivammathur/homebrew-php
update_dependencies update_dependencies
if [ "$existing_version" != "false" ]; then if ! [[ "$(find "$(brew --cellar)"/php/ -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]] && [ "$action" != "upgrade" ]; then
([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula" brew unlink shivammathur/php/php@"$version"
else else
brew install -f "$php_formula" brew upgrade "shivammathur/php/php@$version" 2>/dev/null || brew install "shivammathur/php/php@$version"
fi fi
brew link --force --overwrite "$php_formula" brew link --force --overwrite shivammathur/php/php@"$version"
} }
# Function to Setup PHP. # Function to Setup PHP
setup_php() { setup_php() {
step_log "Setup PHP" step_log "Setup PHP"
existing_version=$(get_brewed_php) existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
if [[ "$version" =~ ${old_versions:?} ]]; then if [[ "$version" =~ ${old_versions:?} ]]; then
run_script "php5-darwin" "${version/./}" >/dev/null 2>&1 run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
status="Installed" status="Installed"
elif [ "$existing_version" != "$version" ]; then elif [ "$existing_version" != "$version" ]; then
add_php "install" "$existing_version" >/dev/null 2>&1 add_php "install" >/dev/null 2>&1
status="Installed" status="Installed"
elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
add_php "upgrade" "$existing_version" >/dev/null 2>&1 add_php "upgrade" >/dev/null 2>&1
status="Updated to" status="Updated to"
else else
status="Found" status="Found"
fix_dependencies >/dev/null 2>&1
fi fi
ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g") ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
sudo chmod 777 "$ini_file" "${tool_path_dir:?}" sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
@ -220,7 +183,6 @@ setup_php() {
# Variables # Variables
version=$1 version=$1
dist=$2 dist=$2
php_formula=shivammathur/php/php@"$version"
brew_prefix="$(brew --prefix)" brew_prefix="$(brew --prefix)"
brew_repo="$(brew --repository)" brew_repo="$(brew --repository)"
tap_dir="$brew_repo"/Library/Taps tap_dir="$brew_repo"/Library/Taps
@ -231,7 +193,6 @@ export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
# shellcheck source=. # shellcheck source=.
. "${scripts:?}"/ext/source.sh
. "${scripts:?}"/tools/add_tools.sh . "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/common.sh . "${scripts:?}"/common.sh
read_env read_env

View File

@ -10,12 +10,8 @@ Function Add-Blackfire() {
$no_dot_version = $version.replace('.', '') $no_dot_version = $version.replace('.', '')
$extension_version = $extension.split('-')[1] $extension_version = $extension.split('-')[1]
if ($extension_version -notmatch "\S") { if ($extension_version -notmatch "\S") {
if($version -lt '7.0') {
$extension_version = '1.50.0'
} else {
$extension_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).probe.php $extension_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).probe.php
} }
}
if (Test-Path $ext_dir\blackfire.dll) { if (Test-Path $ext_dir\blackfire.dll) {
Enable-PhpExtension -Extension blackfire -Path $php_dir Enable-PhpExtension -Extension blackfire -Path $php_dir
$status="Enabled" $status="Enabled"

View File

@ -8,12 +8,8 @@ add_blackfire() {
blackfire_ini_file="${pecl_file:-${ini_file[@]}}" blackfire_ini_file="${pecl_file:-${ini_file[@]}}"
if [ ! -e "${ext_dir:?}/blackfire.so" ]; then if [ ! -e "${ext_dir:?}/blackfire.so" ]; then
if [ "$extension_version" = "blackfire" ]; then if [ "$extension_version" = "blackfire" ]; then
if [[ ${version:?} =~ 5.[3-6] ]]; then
extension_version='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) extension_version=$(get -s -n "" https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)
fi fi
fi
get -q -n "${ext_dir:?}/blackfire.so" https://packages.blackfire.io/binaries/blackfire-php/"$extension_version"/blackfire-php-"$platform"_amd64-php-"$no_dot_version".so >/dev/null 2>&1 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 fi
echo "extension=blackfire.so" | sudo tee -a "$blackfire_ini_file" >/dev/null 2>&1 echo "extension=blackfire.so" | sudo tee -a "$blackfire_ini_file" >/dev/null 2>&1

View File

@ -1,17 +1,22 @@
# Function to install libraries required by couchbase # Function to install libraries required by couchbase
add_couchbase_libs() { add_couchbase_libs() {
if [ "$(uname -s)" = "Linux" ]; then if [ "$(uname -s)" = "Linux" ]; then
trunk="https://github.com/couchbase/libcouchbase/releases"
if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then
release="2.10.9" release="2.10.9"
else trunk="https://github.com/couchbase/libcouchbase/releases/download"
release="$(curl -sL $trunk/latest | grep -Eo "libcouchbase-[0-9]+\.[0-9]+\.[0-9]+" | head -n 1 | cut -d'-' -f 2)" package="libcouchbase-${release}_ubuntu${DISTRIB_RELEASE/./}_${DISTRIB_CODENAME}_amd64.tar"
fi get -q -n /tmp/libcouchbase.tar "$trunk/$release/$package"
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 sudo tar -xf /tmp/libcouchbase.tar -C /tmp
install_packages libev4 libevent-dev install_packages libev4
sudo dpkg -i /tmp/libcouchbase-*/*.deb 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
fi
${apt_install:?} libcouchbase-dev
else else
if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then if [[ ${version:?} =~ 5.[3-6]|7.[0-1] ]]; then
brew install libcouchbase@2 brew install libcouchbase@2

View File

@ -40,11 +40,16 @@ add_cubrid_helper() {
set_cubrid_repo set_cubrid_repo
set_cubrid_branch set_cubrid_branch
[ "$DISTRIB_RELEASE" = "16.04" ] && setup_compiler [ "$DISTRIB_RELEASE" = "16.04" ] && setup_compiler
patch_phpize (
read -r "${ext}_PREFIX_CONFIGURE_OPTS" <<< "CFLAGS=-Wno-implicit-function-declaration" git clone -b "$cubrid_branch" --recursive "https://github.com/CUBRID/$cubrid_repo" "/tmp/$cubrid_repo"
read -r "${ext}_CONFIGURE_OPTS" <<< "--with-php-config=$(command -v php-config)" cd "/tmp/$cubrid_repo" || exit
add_extension_from_source "$ext" https://github.com CUBRID "$cubrid_repo" "$cubrid_branch" extension ! [[ "$version" =~ ${old_versions:?} ]] && add_devtools
restore_phpize 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"
fi fi
} }
@ -56,6 +61,3 @@ add_cubrid() {
add_extension_log "$ext" "$status" add_extension_log "$ext" "$status"
check_extension "$ext" && add_license_log check_extension "$ext" && add_license_log
} }
# shellcheck source=.
. "${scripts:?}"/ext/patches/phpize.sh

View File

@ -10,10 +10,18 @@ add_firebird_client_darwin() {
add_firebird_helper() { add_firebird_helper() {
firebird_dir=$1 firebird_dir=$1
tag="$(php_src_tag)" tag="$(php_src_tag)"
export PDO_FIREBIRD_CONFIGURE_OPTS="--with-pdo-firebird=$firebird_dir" get -s -n "" https://github.com/php/php-src/archive/"$tag".tar.gz | tar -xzf - -C /tmp
export PDO_FIREBIRD_LINUX_LIBS="firebird-dev" (
export PDO_FIREBIRD_PATH="ext/pdo_firebird" cd /tmp/php-src-"$tag"/ext/pdo_firebird || exit
add_extension_from_source pdo_firebird https://github.com php php-src "$tag" extension get 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
)
} }
add_firebird() { add_firebird() {
@ -21,6 +29,10 @@ add_firebird() {
if ! check_extension pdo_firebird; then if ! check_extension pdo_firebird; then
if [ "$(uname -s)" = "Linux" ]; then if [ "$(uname -s)" = "Linux" ]; then
if [[ "${version:?}" =~ 5.3|${nightly_versions:?} ]]; 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 add_firebird_helper /usr >/dev/null 2>&1
else else
add_pdo_extension firebird >/dev/null 2>&1 add_pdo_extension firebird >/dev/null 2>&1

View File

@ -1,12 +1,46 @@
# 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 # Helper function to compile and install geos
add_geos_helper() { add_geos_helper() {
export GEOS_LINUX_LIBS='libgeos-dev' get_geos
export GEOS_DARWIN_LIBS='geos' (
add_extension_from_source geos https://github.com libgeos php-geos 1.0.0 extension get 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
)
} }
# Function to add geos # Function to add geos
add_geos() { add_geos() {
geos_tag='1.0.0'
add_geos_libs >/dev/null 2>&1
enable_extension "geos" "extension" enable_extension "geos" "extension"
if check_extension "geos"; then if check_extension "geos"; then
add_log "${tick:?}" "geos" "Enabled" add_log "${tick:?}" "geos" "Enabled"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -5,7 +5,7 @@ Function Add-PhalconHelper() {
} else { } else {
$domain = 'https://github.com' $domain = 'https://github.com'
$nts = if (!$installed.ThreadSafe) { "_nts" } else { "" } $nts = if (!$installed.ThreadSafe) { "_nts" } else { "" }
$match = Invoke-WebRequest -Uri "$domain/phalcon/cphalcon/releases/v3.4.5" | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`"" $match = Invoke-WebRequest -Uri $domain/phalcon/cphalcon/releases | Select-String -Pattern "href=`"(.*phalcon_x64_.*_php${version}_${extension_version}.*[0-9]${nts}.zip)`""
$zip_file = $match.Matches[0].Groups[1].Value $zip_file = $match.Matches[0].Groups[1].Value
Invoke-WebRequest -Uri $domain/$zip_file -OutFile $ENV:RUNNER_TOOL_CACHE\phalcon.zip > $null 2>&1 Invoke-WebRequest -Uri $domain/$zip_file -OutFile $ENV:RUNNER_TOOL_CACHE\phalcon.zip > $null 2>&1
Expand-Archive -Path $ENV:RUNNER_TOOL_CACHE\phalcon.zip -DestinationPath $ENV:RUNNER_TOOL_CACHE\phalcon -Force > $null 2>&1 Expand-Archive -Path $ENV:RUNNER_TOOL_CACHE\phalcon.zip -DestinationPath $ENV:RUNNER_TOOL_CACHE\phalcon -Force > $null 2>&1

View File

@ -1,12 +1,20 @@
# Helper function to add phalcon. # Helper function to add phalcon.
add_phalcon_helper() { add_phalcon_helper() {
status='Installed and enabled' status='Installed and enabled'
if [ "$os_name" = "Linux" ]; then
update_lists update_lists
if [ "$extension" = "phalcon4" ]; then if [ "$extension" = "phalcon4" ]; then
${apt_install:?} "php${version:?}-psr" "php${version:?}-$extension" ${apt_install:?} "php${version:?}-psr" "php${version:?}-$extension"
else else
${apt_install:?} "php${version:?}-$extension" ${apt_install:?} "php${version:?}-$extension"
fi fi
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:?}"
fi
} }
# Function to add phalcon3. # Function to add phalcon3.
@ -48,6 +56,7 @@ add_phalcon4() {
add_phalcon() { add_phalcon() {
extension=$1 extension=$1
status='Enabled' status='Enabled'
os_name=$(uname -s)
phalcon_ini_file="${pecl_file:-${ini_file[@]}}" phalcon_ini_file="${pecl_file:-${ini_file[@]}}"
extension_major_version=${extension: -1} extension_major_version=${extension: -1}
if [ "$extension_major_version" = "4" ]; then if [ "$extension_major_version" = "4" ]; then

View File

@ -1,144 +0,0 @@
# Function to parse extension environment variables
parse_args() {
extension=$1
suffix=$(echo "$2" | tr '[:lower:]' '[:upper:]')
up_ext_name=$(echo "$extension" | tr '[:lower:]' '[:upper:]')
var="${extension}_${suffix}"
up_var="${up_ext_name}_${suffix}"
! [[ "$suffix" =~ .*PREFIX|LIBS|PATH.* ]] && hyp='-'
output=$(echo "${!var} ${!up_var}" | sed "s/, *$hyp/ $hyp/g" | sed -E "s/^,|,$//g")
echo "$output" | xargs -n 1 | sort | uniq | xargs
}
# Function to log if a library is installed
add_lib_log() {
lib=$1
if check_lib "$lib"; then
add_log "${tick:?}" "$lib" "Installed"
else
add_log "${cross:?}" "$lib" "Could not install $lib"
fi
}
# Function to check if a library is installed
check_lib() {
lib=$1
if [ "$(uname -s)" = "Linux" ]; then
[ "x$(dpkg -s "$lib" 2>/dev/null | grep Status)" != "x" ]
else
[ "x$(find "${brew_prefix:?}"/Cellar -maxdepth 1 -name "$lib")" != "x" ]
fi
}
# Function to add a library on linux
add_linux_libs() {
lib=$1
if ! check_lib "$lib"; then
install_packages "$lib" >/dev/null 2>&1 || true
fi
add_lib_log "$lib"
}
# Function to add a library on macOS
add_darwin_libs() {
lib=$1
if ! check_lib "$lib"; then
brew install "$lib" >/dev/null 2>&1 || true
if [[ "$lib" = *@* ]]; then
brew link --overwrite --force "$lib" >/dev/null 2>&1 || true
fi
fi
add_lib_log "$lib"
}
# Function to add required libraries
add_libs() {
all_libs=("$@")
for lib in "${all_libs[@]}"; do
if [ "$(uname -s)" = "Linux" ]; then
add_linux_libs "$lib"
else
add_darwin_libs "$lib"
fi
done
}
# Function to run command in a group
run_group() {
command=$1
log=$2
echo "$command" | sudo tee ./run_group.sh >/dev/null 2>&1
echo "::group::$log"
. ./run_group.sh
rm ./run_group.sh
echo "::endgroup::"
}
patch_extension() {
extension=$1
if [ -e "${scripts:?}"/ext/patches/"$extension".sh ]; then
# shellcheck source=.
. "${scripts:?}"/ext/patches/"$extension".sh
patch_"${extension}"
fi
}
fetch_extension() {
fetch=$1
if [ "$fetch" = "clone" ]; then
run_group "git clone -nv $url/$org/$repo /tmp/$repo-$release" "git clone"
cd /tmp/"$repo-$release" || exit 1
git checkout -q "$release"
cd "$sub_dir" || exit 1
if [ -e .gitmodules ]; then
jobs="$(grep -c "\[submodule" .gitmodules)"
run_group "git submodule update --jobs $jobs --init --recursive" "git submodule"
fi
elif [ "$fetch" = "get" ]; then
get -q -n /tmp/"$extension".tar.gz "$url/$org/$repo/archive/$release.tar.gz"
tar -xzf /tmp/"$extension".tar.gz -C /tmp
cd /tmp/"$repo"-"$release"/"$sub_dir" || exit
elif [ "$fetch" = "pecl" ]; then
source="pecl"
pecl_name=${extension/http/pecl_http}
get -q -n /tmp/"$pecl_name".tgz https://pecl.php.net/get/"$pecl_name"-"$release".tgz
tar -xzf /tmp/"$pecl_name".tgz -C /tmp
cd /tmp/"$pecl_name"-"$release" || exit
fi
}
# Function to install extension from a git repository
add_extension_from_source() {
extension="${1/pecl_/}"
url=$2
org=$3
repo=$4
release=$5
prefix=$6
fetch=${7:-clone}
slug="$extension-$release"
source="$url/$org/$repo"
libraries="$(parse_args "$extension" LIBS) $(parse_args "$extension" "$(uname -s)"_LIBS)"
opts="$(parse_args "$extension" CONFIGURE_OPTS)"
prefix_opts="$(parse_args "$extension" CONFIGURE_PREFIX_OPTS)"
suffix_opts="$(parse_args "$extension" CONFIGURE_SUFFIX_OPTS)"
sub_dir="$(parse_args "$extension" PATH)"
step_log "Setup $slug"
(
add_devtools phpize >/dev/null 2>&1
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 if ! command -v apt-fast >/dev/null; then
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
fi fi
install_packages apt-transport-https curl make software-properties-common unzip autoconf automake gcc g++ install_packages curl make software-properties-common unzip autoconf automake gcc g++
add_ppa ondrej/php add_ppa ondrej/ppa
} }
# Function to backup and cleanup package lists. # Function to backup and cleanup package lists.
@ -14,6 +14,7 @@ cleanup_lists() {
sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
sudo mkdir /etc/apt/sources.list.d 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/*"${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 trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/ 2>/dev/null" exit
fi fi
} }
@ -21,23 +22,36 @@ cleanup_lists() {
# Function to add ppa:ondrej/php. # Function to add ppa:ondrej/php.
add_ppa() { add_ppa() {
ppa=${1:-ondrej/php} ppa=${1:-ondrej/php}
if [ "$DISTRIB_RELEASE" = "16.04" ] && [ "$ppa" = "ondrej/php" ]; then if ! apt-cache policy | grep -q "$ppa"; then
LC_ALL=C.UTF-8 sudo apt-add-repository --remove ppa:"$ppa" -y || true
LC_ALL=C.UTF-8 sudo apt-add-repository http://setup-php.com/ondrej/php/ubuntu -y
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 4f4ea0aae5267a6c
elif ! apt-cache policy | grep -q "$ppa"; then
cleanup_lists "$(dirname "$ppa")" cleanup_lists "$(dirname "$ppa")"
LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y
fi
if [ "$DISTRIB_RELEASE" = "16.04" ]; then if [ "$DISTRIB_RELEASE" = "16.04" ]; then
sudo "$debconf_fix" apt-get update sudo "$debconf_fix" apt-get update
fi 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. # Function to update the package lists.
update_lists() { update_lists() {
if [ ! -e /tmp/setup_php ]; then if [ ! -e /tmp/setup_php ]; then
[ "${runner:?}" != "self-hosted" ] && add_ppa >/dev/null 2>&1 [ "$DISTRIB_RELEASE" = "20.04" ] && add_ppa >/dev/null 2>&1
cleanup_lists cleanup_lists
sudo "$debconf_fix" apt-get update >/dev/null 2>&1 sudo "$debconf_fix" apt-get update >/dev/null 2>&1
echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1 echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1
@ -63,7 +77,9 @@ delete_extension() {
extension=$1 extension=$1
disable_extension "$extension" disable_extension "$extension"
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1 sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status if [ "${runner:?}" = "self-hosted" ]; then
$apt_remove "php-$extension" "php$version-$extension" >/dev/null 2>&1 || true
fi
} }
# Function to disable and delete extensions. # Function to disable and delete extensions.
@ -72,6 +88,7 @@ remove_extension() {
if check_extension "$extension"; then if check_extension "$extension"; then
if [[ ! "$version" =~ ${old_versions:?} ]] && [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then if [[ ! "$version" =~ ${old_versions:?} ]] && [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
sudo phpdismod -v "$version" "$extension" >/dev/null 2>&1 sudo phpdismod -v "$version" "$extension" >/dev/null 2>&1
echo "$extension" | sudo tee -a /tmp/setup_php_dismod >/dev/null 2>&1
fi fi
delete_extension "$extension" delete_extension "$extension"
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") || (! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
@ -90,10 +107,8 @@ add_pdo_extension() {
else else
ext=$1 ext=$1
ext_name=$1 ext_name=$1
if [ -e "$ext_dir"/pdo.so ]; then
disable_extension pdo disable_extension pdo
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1 echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1
fi
if [ "$ext" = "mysql" ]; then if [ "$ext" = "mysql" ]; then
enable_extension "mysqlnd" "extension" enable_extension "mysqlnd" "extension"
ext_name='mysqli' ext_name='mysqli'
@ -121,7 +136,9 @@ add_extension() {
if check_extension "$extension"; then if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled" add_log "${tick:?}" "$extension" "Enabled"
else else
if [[ "$version" =~ ${nightly_versions:?} ]]; then if [[ "$version" =~ 5.[4-5] ]]; then
install_packages "php5-$extension=$release_version"
elif [[ "$version" =~ ${nightly_versions:?} ]]; then
pecl_install "$extension" pecl_install "$extension"
else else
install_packages "php$version-$extension" || pecl_install "$extension" install_packages "php$version-$extension" || pecl_install "$extension"
@ -131,25 +148,46 @@ add_extension() {
sudo chmod 777 "${ini_file[@]}" sudo chmod 777 "${ini_file[@]}"
} }
# Function to install a PECL version.
add_pecl_extension() {
extension=$1
pecl_version=$2
prefix=$3
if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|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. # Function to setup phpize and php-config.
add_devtools() { add_devtools() {
tool=$1 tool=$1
if ! command -v "$tool$version" >/dev/null; then if ! command -v "$tool$version" >/dev/null; then
install_packages "php$version-dev" "php$version-xml" install_packages "php$version-dev" "php$version-xml"
fi fi
switch_version "phpize" "php-config" sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
configure_pecl >/dev/null 2>&1
add_log "${tick:?}" "$tool" "Added $tool $semver" add_log "${tick:?}" "$tool" "Added $tool $semver"
} }
# Function to setup the nightly build from shivammathur/php-builder # Function to setup the nightly build from shivammathur/php-builder
setup_nightly() { setup_nightly() {
run_script "php-builder" "$runner" "$version" run_script "php-builder" "$runner" "$version"
extra_version="-dev ($(cat "/etc/php/$version/COMMIT"))"
} }
# Function to setup PHP 5.3, PHP 5.4 and PHP 5.5. # Function to setup PHP 5.3, PHP 5.4 and PHP 5.5.
setup_old_versions() { setup_old_versions() {
run_script "php5-ubuntu" "$version" run_script "php5-ubuntu" "$version"
release_version=$(php -v | head -n 1 | cut -d' ' -f 2)
} }
# Function to add PECL. # Function to add PECL.
@ -165,11 +203,9 @@ add_pecl() {
# Function to switch versions of PHP binaries. # Function to switch versions of PHP binaries.
switch_version() { switch_version() {
tools=("$@") && ! (( ${#tools[@]} )) && tools+=(pear pecl php phar phar.phar php-cgi php-config phpize phpdbg) for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
to_wait=()
for tool in "${tools[@]}"; do
if [ -e "/usr/bin/$tool$version" ]; then if [ -e "/usr/bin/$tool$version" ]; then
sudo update-alternatives --set "$tool" /usr/bin/"$tool$version" & sudo update-alternatives --set $tool /usr/bin/"$tool$version" &
to_wait+=($!) to_wait+=($!)
fi fi
done done
@ -183,7 +219,7 @@ add_packaged_php() {
IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")" IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
$apt_install "${packages[@]}" $apt_install "${packages[@]}"
else else
run_script "php-ubuntu" "$version" run_script "test-setup-php" "$version"
fi fi
} }
@ -259,7 +295,7 @@ setup_php() {
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1 sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}" sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}"
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/" sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "${tick:?}" "PHP" "$status PHP $semver$extra_version" add_log "${tick:?}" "PHP" "$status PHP $semver"
} }
# Variables # Variables
@ -267,10 +303,10 @@ version=$1
dist=$2 dist=$2
debconf_fix="DEBIAN_FRONTEND=noninteractive" debconf_fix="DEBIAN_FRONTEND=noninteractive"
apt_install="sudo $debconf_fix apt-fast install -y" apt_install="sudo $debconf_fix apt-fast install -y"
apt_remove="sudo $debconf_fix apt-fast remove -y"
scripts="${dist}"/../src/scripts scripts="${dist}"/../src/scripts
# shellcheck source=. # shellcheck source=.
. "${scripts:?}"/ext/source.sh
. "${scripts:?}"/tools/add_tools.sh . "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/common.sh . "${scripts:?}"/common.sh
. /etc/lsb-release . /etc/lsb-release

View File

@ -0,0 +1,116 @@
#!/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

@ -0,0 +1,117 @@
#!/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

@ -19,7 +19,7 @@ add_protoc() {
[ "$(uname -s)" = "Darwin" ] && platform='osx' [ "$(uname -s)" = "Darwin" ] && platform='osx'
get -q -n /tmp/protobuf.zip "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-${protobuf_tag:1}-$platform-x86_64.zip" 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 unzip /tmp/protobuf.zip -d /usr/local/
sudo chmod -R 777 /usr/local/bin/protoc /usr/local/include/google sudo chmod 777 /usr/local/bin/protoc -R /usr/local/include/google
) >/dev/null 2>&1 ) >/dev/null 2>&1
add_log "${tick:?}" "protoc" "Added protoc ${protobuf_tag:1}" add_log "${tick:?}" "protoc" "Added 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" 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,9 +101,7 @@ Function Install-PSPackage() {
[Parameter(Position = 1, Mandatory = $true)] [Parameter(Position = 1, Mandatory = $true)]
$psm1_path, $psm1_path,
[Parameter(Position = 2, Mandatory = $true)] [Parameter(Position = 2, Mandatory = $true)]
$url, $url
[Parameter(Position = 3, Mandatory = $true)]
$cmdlet
) )
$module_path = "$bin_dir\$psm1_path.psm1" $module_path = "$bin_dir\$psm1_path.psm1"
if(-not (Test-Path $module_path -PathType Leaf)) { if(-not (Test-Path $module_path -PathType Leaf)) {
@ -113,31 +111,6 @@ Function Install-PSPackage() {
} }
Import-Module $module_path Import-Module $module_path
Add-ToProfile $current_profile "$package-search" "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. # Function to add PHP extensions.
@ -170,18 +143,16 @@ Function Add-Extension {
Add-Log $tick $extension "Enabled" Add-Log $tick $extension "Enabled"
} }
default { default {
Add-ExtensionPrerequisites $extension
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
Add-Log $tick $extension "Enabled" Add-Log $tick $extension "Enabled"
} }
} }
} }
else { else {
Add-ExtensionPrerequisites $extension
if($extension_version -ne '') { if($extension_version -ne '') {
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir -NoDependencies Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir
} else { } else {
Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir -NoDependencies Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir
} }
Add-Log $tick $extension "Installed and enabled" Add-Log $tick $extension "Installed and enabled"
@ -248,8 +219,7 @@ Function Get-ToolVersion() {
[Parameter(Position = 1, Mandatory = $true)] [Parameter(Position = 1, Mandatory = $true)]
$param $param
) )
$alp = "[a-zA-Z0-9]" $version_regex = "[0-9]+((\.{1}[0-9]+)+)(\.{0})(-[a-z0-9]+){0,1}"
$version_regex = "[0-9]+((\.{1}$alp+)+)(\.{0})(-$alp+){0,1}"
if($tool -eq 'composer') { if($tool -eq 'composer') {
if ($param -eq 'snapshot') { 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 }) $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 })
@ -338,15 +308,14 @@ Function Add-Composertool() {
if(Test-Path $composer_lock) { if(Test-Path $composer_lock) {
Remove-Item -Path $composer_lock -Force Remove-Item -Path $composer_lock -Force
} }
(composer global require $prefix$release 2>&1 | Tee-Object -FilePath $env:APPDATA\Composer\composer.log) >$null 2>&1 composer global require $prefix$release >$null 2>&1
$json = findstr $prefix$tool $env:APPDATA\Composer\composer.json $json = findstr $prefix$tool $env:APPDATA\Composer\composer.json
$log = findstr $prefix$tool $env:APPDATA\Composer\composer.log
if(Test-Path $composer_bin\composer) { if(Test-Path $composer_bin\composer) {
Copy-Item -Path "$bin_dir\composer" -Destination "$composer_bin\composer" -Force Copy-Item -Path "$bin_dir\composer" -Destination "$composer_bin\composer" -Force
} }
Add-ToolsHelper $tool Add-ToolsHelper $tool
if($json) { if($json) {
$tool_version = Get-ToolVersion "Write-Output" "$log" $tool_version = Get-ToolVersion "Write-Output" "$json"
Add-Log $tick $tool "Added $tool $tool_version" Add-Log $tick $tool "Added $tool $tool_version"
} else { } else {
Add-Log $cross $tool "Could not setup $tool" Add-Log $cross $tool "Could not setup $tool"
@ -364,8 +333,8 @@ $cross = ([char]10007)
$php_dir = 'C:\tools\php' $php_dir = 'C:\tools\php'
$ext_dir = "$php_dir\ext" $ext_dir = "$php_dir\ext"
$bin_dir = $php_dir $bin_dir = $php_dir
$bintray = 'https://dl.bintray.com/shivammathur/php'
$github = 'https://github.com' $github = 'https://github.com'
$php_builder = "$github/shivammathur/php-builder-windows"
$composer_bin = "$env:APPDATA\Composer\vendor\bin" $composer_bin = "$env:APPDATA\Composer\vendor\bin"
$composer_json = "$env:APPDATA\Composer\composer.json" $composer_json = "$env:APPDATA\Composer\composer.json"
$composer_lock = "$env:APPDATA\Composer\composer.lock" $composer_lock = "$env:APPDATA\Composer\composer.lock"
@ -415,7 +384,7 @@ if($env:RUNNER -eq 'self-hosted') {
Add-Printf >$null 2>&1 Add-Printf >$null 2>&1
Step-Log "Setup PhpManager" Step-Log "Setup PhpManager"
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php >$null 2>&1 Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" >$null 2>&1
Add-Log $tick "PhpManager" "Installed" Add-Log $tick "PhpManager" "Installed"
Step-Log "Setup PHP" Step-Log "Setup PHP"
@ -428,11 +397,11 @@ if (Test-Path -LiteralPath $php_dir -PathType Container) {
$status = "Installed" $status = "Installed"
if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) { if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) {
if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') { if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') {
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1 Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" >$null 2>&1
} }
try { try {
if ($version -match $nightly_versions) { if ($version -match $nightly_versions) {
Invoke-WebRequest -UseBasicParsing -Uri $php_builder/releases/latest/download/Get-PhpNightly.ps1 -OutFile $php_dir\Get-PhpNightly.ps1 > $null 2>&1 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
& $php_dir\Get-PhpNightly.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir > $null 2>&1 & $php_dir\Get-PhpNightly.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir > $null 2>&1
} else { } else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1 Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
@ -457,10 +426,14 @@ 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 } ('date.timezone=UTC', 'memory_limit=-1', 'xdebug.mode=coverage') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
if($version -lt "5.5") { if($version -lt "5.5") {
('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri "$php_builder/releases/download/openssl-1.0.2u/$_" -OutFile $php_dir\$_ >$null 2>&1 } ('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri $bintray/$_ -OutFile $php_dir\$_ >$null 2>&1 }
} else { } else {
$enable_extensions += ('opcache') $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 Enable-PhpExtension -Extension $enable_extensions -Path $php_dir
Update-PhpCAInfo -Path $php_dir -Source $cert_source Update-PhpCAInfo -Path $php_dir -Source $cert_source
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE

View File

@ -7,8 +7,7 @@ import * as utils from './utils';
*/ */
export async function getToolVersion(version: string): Promise<string> { export async function getToolVersion(version: string): Promise<string> {
// semver_regex - https://semver.org/ // semver_regex - https://semver.org/
const semver_regex = 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-]+)*))?$/;
/^(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]$/; const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/;
version = version.replace(/[><=^]*/, ''); version = version.replace(/[><=^]*/, '');
switch (true) { switch (true) {
@ -33,17 +32,12 @@ export async function parseTool(
const parts: string[] = release.split(':'); const parts: string[] = release.split(':');
const tool: string = parts[0]; const tool: string = parts[0];
const version: string | undefined = parts[1]; const version: string | undefined = parts[1];
switch (true) { switch (version) {
case version === undefined: case undefined:
return { return {
name: tool, name: tool,
version: 'latest' version: 'latest'
}; };
case /^[\w.-]+\/[\w.-]+$/.test(tool):
return {
name: tool,
version: version
};
default: default:
return { return {
name: tool, name: tool,
@ -251,8 +245,7 @@ export async function getWpCliUrl(version: string): Promise<string> {
*/ */
export async function addComposer(tools_list: string[]): Promise<string[]> { export async function addComposer(tools_list: string[]): Promise<string[]> {
const regex_any = /^composer($|:.*)/; const regex_any = /^composer($|:.*)/;
const regex_valid = const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
/^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
const matches: string[] = tools_list.filter(tool => regex_valid.test(tool)); const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
let composer = 'composer'; let composer = 'composer';
tools_list = tools_list.filter(tool => !regex_any.test(tool)); tools_list = tools_list.filter(tool => !regex_any.test(tool));
@ -290,6 +283,29 @@ export async function getComposerUrl(version: string): Promise<string> {
} }
} }
/**
* Function to get Tools list after cleanup
*
* @param tools_csv
*/
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)];
}
/** /**
* Helper function to get script to setup a tool using a phar url * Helper function to get script to setup a tool using a phar url
* *
@ -370,13 +386,8 @@ export async function addTools(
php_version: string, php_version: string,
os_version: string os_version: string
): Promise<string> { ): Promise<string> {
let script = '\n'; let script = '\n' + (await utils.stepLog('Setup Tools', os_version));
if (tools_csv === 'none') { const tools_list: Array<string> = await getCleanedToolsList(tools_csv);
return '';
} else {
script += await utils.stepLog('Setup Tools', os_version);
}
const tools_list = await addComposer(await utils.CSVArray(tools_csv));
await utils.asyncForEach(tools_list, async function (release: string) { await utils.asyncForEach(tools_list, async function (release: string) {
const tool_data: {name: string; version: string} = await parseTool(release); const tool_data: {name: string; version: string} = await parseTool(release);
const tool: string = tool_data.name; const tool: string = tool_data.name;
@ -392,123 +403,124 @@ export async function addTools(
); );
script += '\n'; script += '\n';
let url = ''; let url = '';
switch (true) { switch (tool) {
case /^blackfire(-agent)?$/.test(tool): case 'blackfire':
script += await utils.customPackage( case 'grpc_php_plugin':
'blackfire', case 'protoc':
'tools',
version,
os_version
);
break;
case /^grpc_php_plugin$|^protoc$/.test(tool):
script += await utils.customPackage(tool, 'tools', version, os_version); script += await utils.customPackage(tool, 'tools', version, os_version);
break; break;
case /^behat$|^codeception$|^phpspec$/.test(tool): case 'behat':
case 'codeception':
case 'phpspec':
script += await addPackage(tool, release, tool + '/', os_version); script += await addPackage(tool, release, tool + '/', os_version);
break; break;
case /^blackfire-player$/.test(tool): case 'blackfire-player':
url = await getBlackfirePlayerUrl(version, php_version); url = await getBlackfirePlayerUrl(version, php_version);
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^composer$/.test(tool): case 'composer':
url = await getComposerUrl(version); url = await getComposerUrl(version);
script += await addArchive('composer', url, os_version, version); script += await addArchive('composer', url, os_version, version);
break; break;
case /^composer-normalize$/.test(tool): case 'composer-normalize':
uri = await getUri(tool, '.phar', version, 'releases', '', 'download'); uri = await getUri(tool, '.phar', version, 'releases', '', 'download');
url = github + 'ergebnis/composer-normalize/' + uri; url = github + 'ergebnis/composer-normalize/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^composer-prefetcher$/.test(tool): case 'composer-prefetcher':
script += await addPackage( script += await addPackage(
'automatic-' + tool, tool,
release, release,
'narrowspark/', 'narrowspark/automatic-',
os_version os_version
); );
break; break;
case /^composer-require-checker$/.test(tool): case 'composer-require-checker':
uri = await getUri(tool, '.phar', version, 'releases', '', 'download'); uri = await getUri(tool, '.phar', version, 'releases', '', 'download');
url = github + 'maglnet/ComposerRequireChecker/' + uri; url = github + 'maglnet/ComposerRequireChecker/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^composer-unused$/.test(tool): case 'composer-unused':
script += await addPackage(tool, release, 'icanhazstring/', os_version); script += await addPackage(tool, release, 'icanhazstring/', os_version);
break; break;
case /^cs2pr$/.test(tool): case 'cs2pr':
uri = await getUri(tool, '', version, 'releases', '', 'download'); uri = await getUri(tool, '', version, 'releases', '', 'download');
url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri; url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^deployer$/.test(tool): case 'deployer':
url = await getDeployerUrl(version); url = await getDeployerUrl(version);
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^flex$/.test(tool): case 'flex':
script += await addPackage(tool, release, 'symfony/', os_version); script += await addPackage(tool, release, 'symfony/', os_version);
break; break;
case /^infection$/.test(tool): case 'infection':
url = github + 'infection/infection/' + uri; url = github + 'infection/infection/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^pecl/.test(tool): case 'pecl':
script += await utils.getCommand(os_version, 'pecl'); script += await utils.getCommand(os_version, 'pecl');
break; break;
case /^phan$/.test(tool): case 'phan':
url = github + 'phan/phan/' + uri; url = github + 'phan/phan/' + uri;
script += await addArchive(tool, url, os_version, '"-v"'); script += await addArchive(tool, url, os_version, '"-v"');
break; break;
case /^phing$/.test(tool): case 'phing':
url = 'https://www.phing.info/get/phing-' + version + '.phar'; url = 'https://www.phing.info/get/phing-' + version + '.phar';
script += await addArchive(tool, url, os_version, '"-v"'); script += await addArchive(tool, url, os_version, '"-v"');
break; break;
case /^phinx$/.test(tool): case 'phinx':
script += await addPackage(tool, release, 'robmorgan/', os_version); script += await addPackage(tool, release, 'robmorgan/', os_version);
break; break;
case /^phive$/.test(tool): case 'phive':
script += await addPhive(version, php_version, os_version); script += await addPhive(version, php_version, os_version);
break; break;
case /^php(-config|ize)$/.test(tool): case 'php-config':
case 'phpize':
script += await addDevTools(tool, os_version); script += await addDevTools(tool, os_version);
break; break;
case /^php-cs-fixer$/.test(tool): case 'php-cs-fixer':
uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download'); uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download');
url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri; url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^php(cbf|cs)$/.test(tool): case 'phpcbf':
case 'phpcs':
url = github + 'squizlabs/PHP_CodeSniffer/' + uri; url = github + 'squizlabs/PHP_CodeSniffer/' + uri;
script += await addArchive(tool, url, os_version, '"--version"'); script += await addArchive(tool, url, os_version, '"--version"');
break; break;
case /^php(cpd|unit)$/.test(tool): case 'phpcpd':
case 'phpunit':
url = await getPharUrl('https://phar.phpunit.de', tool, '', version); url = await getPharUrl('https://phar.phpunit.de', tool, '', version);
script += await addArchive(tool, url, os_version, '"--version"'); script += await addArchive(tool, url, os_version, '"--version"');
break; break;
case /^phplint$/.test(tool): case 'phplint':
script += await addPackage(tool, release, 'overtrue/', os_version); script += await addPackage(tool, release, 'overtrue/', os_version);
break; break;
case /^phpmd$/.test(tool): case 'phpmd':
url = github + 'phpmd/phpmd/' + uri; url = github + 'phpmd/phpmd/' + uri;
script += await addArchive(tool, url, os_version, '"--version"'); script += await addArchive(tool, url, os_version, '"--version"');
break; break;
case /^phpstan$/.test(tool): case 'phpstan':
url = github + 'phpstan/phpstan/' + uri; url = github + 'phpstan/phpstan/' + uri;
script += await addArchive(tool, url, os_version, '"-V"'); script += await addArchive(tool, url, os_version, '"-V"');
break; break;
case /^prestissimo$/.test(tool): case 'prestissimo':
script += await addPackage(tool, release, 'hirak/', os_version); script += await addPackage(tool, release, 'hirak/', os_version);
break; break;
case /^psalm$/.test(tool): case 'psalm':
url = github + 'vimeo/psalm/' + uri; url = github + 'vimeo/psalm/' + uri;
script += await addArchive(tool, url, os_version, '"-v"'); script += await addArchive(tool, url, os_version, '"-v"');
break; break;
case /^symfony(-cli)?$/.test(tool): case 'symfony':
case 'symfony-cli':
uri = await getSymfonyUri(version, os_version); uri = await getSymfonyUri(version, os_version);
url = github + 'symfony/cli/' + uri; url = github + 'symfony/cli/' + uri;
script += await addArchive('symfony', url, os_version, 'version'); script += await addArchive('symfony', url, os_version, 'version');
break; break;
case /^vapor(-cli)?$/.test(tool): case 'vapor-cli':
case 'vapor':
script += await addPackage( script += await addPackage(
'vapor-cli', 'vapor-cli',
release, release,
@ -516,20 +528,11 @@ export async function addTools(
os_version os_version
); );
break; break;
case /^wp(-cli)?$/.test(tool): case 'wp':
case 'wp-cli':
url = github + (await getWpCliUrl(version)); url = github + (await getWpCliUrl(version));
script += await addArchive('wp-cli', url, os_version, '"--version"'); script += await addArchive('wp-cli', url, os_version, '"--version"');
break; break;
case /^none$/.test(tool):
break;
case /^[\w.-]+\/[\w.-]+$/.test(tool):
script += await addPackage(
tool.split('/')[1],
release.split('/')[1].replace(/\s+/, ''),
tool.split('/')[0] + '/',
os_version
);
break;
default: default:
script += await utils.addLog( script += await utils.addLog(
'$cross', '$cross',

View File

@ -234,23 +234,20 @@ export async function writeScript(
/** /**
* Function to break extension csv into an array * Function to break extension csv into an array
* *
* @param extension_csv * @param package_csv
*/ */
export async function extensionArray( export async function packageArray(
extension_csv: string package_csv: string
): Promise<Array<string>> { ): Promise<Array<string>> {
switch (extension_csv) { switch (package_csv) {
case '': case '':
case ' ': case ' ':
return []; return [];
default: default:
return extension_csv return package_csv
.split(',') .split(',')
.map(function (extension: string) { .map(function (package_name: string) {
if (/.+-.+\/.+@.+/.test(extension)) { return package_name
return extension;
}
return extension
.trim() .trim()
.toLowerCase() .toLowerCase()
.replace(/^php[-_]/, ''); .replace(/^php[-_]/, '');
@ -441,24 +438,3 @@ export async function customPackage(
const command: string = await getCommand(os_version, pkg_name); const command: string = await getCommand(os_version, pkg_name);
return '\n. ' + script + '\n' + command + version; 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,18 +1,63 @@
{ {
"compilerOptions": { "compilerOptions": {
"esModuleInterop": true, /* Basic Options */
"lib": [ // "incremental": true, /* Enable incremental compilation */
"ESNext" "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'. */
"module": "commonjs", // "allowJs": true, /* Allow javascript files to be compiled. */
"moduleResolution": "node", // "checkJs": true, /* Report errors in .js files. */
"noImplicitAny": true, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
"outDir": "./lib", // "declaration": true, /* Generates corresponding '.d.ts' file. */
"removeComments": true, // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
"rootDir": "./src", // "sourceMap": true, /* Generates corresponding '.map' file. */
"sourceMap": true, // "outFile": "./", /* Concatenate and emit output to single file. */
"strict": true, "outDir": "./lib", /* Redirect output structure to the directory. */
"target": "ESNext" "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. */
}, },
"exclude": ["__tests__", "lib", "node_modules"] "exclude": ["node_modules", "**/*.test.ts"]
} }