Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow extensions to be compiled from GitHub sources #399

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 14 additions & 2 deletions README.md
Expand Up @@ -117,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.

- On `Ubuntu`, extensions which are available as a package or available on `PECL` can be setup.
- On `Ubuntu`, extensions which are available as a package, available on `PECL`, or hosted on GitHub can be setup.

```yaml
- name: Setup PHP with PECL extension
Expand All @@ -129,7 +129,7 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`

- On `Windows`, extensions available on `PECL` which have the `DLL` binary can be setup.

- On `macOS`, extensions available on `PECL` can be installed.
- On `macOS`, extensions available on `PECL` or hosted on GitHub can be installed.

- Extensions installed along with PHP if specified are enabled.

Expand Down Expand Up @@ -192,6 +192,18 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string`
fail-fast: true
```

- Extensions can be compiled from source if they are hosted on GitHub. In this case, the version specification contains the repository and branch/tag to clone:

```yaml
- name: Setup PHP and remove shared extension
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: mongodb-mongodb/mongo-php-driver@v1.9
```

The version can be a branch name or tag as supported by `git clone -b <name>`. The clone is performed recursively, i.e. submodules will be cloned as well.

## :wrench: Tools Support

These tools can be setup globally using the `tools` input. It accepts a string in csv-format.
Expand Down
27 changes: 27 additions & 0 deletions __tests__/extensions.test.ts
Expand Up @@ -58,6 +58,15 @@ describe('Extension tests', () => {

win32 = await extensions.addExtension('blackfire-1.31.0', '7.3', 'win32');
expect(win32).toContain('Add-Blackfire blackfire-1.31.0');

win32 = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'win32'
);
expect(win32).toContain(
'Add-Log "$cross" "mongodb-mongodb/mongo-php-driver@master" "mongodb-mongodb/mongo-php-driver@master is not supported on PHP 7.3"'
);
});

it('checking addExtensionOnLinux', async () => {
Expand Down Expand Up @@ -131,6 +140,15 @@ describe('Extension tests', () => {

linux = await extensions.addExtension('intl-68.2', '8.0', 'linux');
expect(linux).toContain('add_intl intl-68.2');

linux = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'linux'
);
expect(linux).toContain(
'add_extension_from_github mongodb mongodb mongo-php-driver master'
);
});

it('checking addExtensionOnDarwin', async () => {
Expand Down Expand Up @@ -220,5 +238,14 @@ describe('Extension tests', () => {

darwin = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(darwin).toContain('Platform openbsd is not supported');

darwin = await extensions.addExtension(
'mongodb-mongodb/mongo-php-driver@master',
'7.3',
'darwin'
);
expect(darwin).toContain(
'add_extension_from_github mongodb mongodb mongo-php-driver master'
);
});
});
29 changes: 29 additions & 0 deletions dist/index.js
Expand Up @@ -2901,6 +2901,7 @@ async function addExtensionDarwin(extension_csv, version) {
const version_extension = version + extension;
const [ext_name, ext_version] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches;
switch (true) {
// match :extension
case /^:/.test(ext_name):
Expand All @@ -2923,6 +2924,17 @@ async function addExtensionDarwin(extension_csv, version) {
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(version_extension):
add_script += await utils.joins('\nadd_unstable_extension', ext_name, ext_version, ext_prefix);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
matches = /.*-(.*)\/(.*)@(.*)/.exec(extension);
if (matches == null) {
// Shouldn't happen
add_script += await utils.getUnsupportedLog(extension, version, 'darwin');
return;
}
add_script += await utils.joins('\nadd_extension_from_github', ext_name, matches[1], matches[2], matches[3], ext_prefix);
return;
// match semver
case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins('\nadd_pecl_extension', ext_name, ext_version, ext_prefix);
Expand Down Expand Up @@ -2987,6 +2999,11 @@ async function addExtensionWindows(extension_csv, version) {
case /.*-(stable|beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins('\nAdd-Extension', ext_name, ext_version.replace('stable', ''));
break;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
add_script += await utils.getUnsupportedLog(extension, version, 'win32');
break;
// match semver without state
case /.*-\d+\.\d+\.\d+$/.test(version_extension):
add_script += await utils.joins('\nAdd-Extension', ext_name, 'stable', ext_version);
Expand Down Expand Up @@ -3044,6 +3061,7 @@ async function addExtensionLinux(extension_csv, version) {
const version_extension = version + extension;
const [ext_name, ext_version] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches;
switch (true) {
// Match :extension
case /^:/.test(ext_name):
Expand All @@ -3069,6 +3087,17 @@ async function addExtensionLinux(extension_csv, version) {
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(version_extension):
add_script += await utils.joins('\nadd_unstable_extension', ext_name, ext_version, ext_prefix);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
matches = /.*-(.*)\/(.*)@(.*)/.exec(extension);
if (matches == null) {
// Shouldn't happen
add_script += await utils.getUnsupportedLog(extension, version, 'linux');
return;
}
add_script += await utils.joins('\nadd_extension_from_github', ext_name, matches[1], matches[2], matches[3], ext_prefix);
return;
// match semver versions
case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins('\nadd_pecl_extension', ext_name, ext_version, ext_prefix);
Expand Down
39 changes: 39 additions & 0 deletions src/extensions.ts
Expand Up @@ -17,6 +17,8 @@ export async function addExtensionDarwin(
const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches: RegExpExecArray;

switch (true) {
// match :extension
case /^:/.test(ext_name):
Expand Down Expand Up @@ -53,6 +55,19 @@ export async function addExtensionDarwin(
ext_prefix
);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
matches = /.*-(.*)\/(.*)@(.*)/.exec(extension) as RegExpExecArray;
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
matches[1],
matches[2],
matches[3],
ext_prefix
);
return;
// match semver
case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins(
Expand Down Expand Up @@ -142,6 +157,15 @@ export async function addExtensionWindows(
ext_version.replace('stable', '')
);
break;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
add_script += await utils.getUnsupportedLog(
extension,
version,
'win32'
);
break;
// match semver without state
case /.*-\d+\.\d+\.\d+$/.test(version_extension):
add_script += await utils.joins(
Expand Down Expand Up @@ -214,6 +238,8 @@ export async function addExtensionLinux(
const version_extension: string = version + extension;
const [ext_name, ext_version]: string[] = extension.split('-');
const ext_prefix = await utils.getExtensionPrefix(ext_name);
let matches: RegExpExecArray;

switch (true) {
// Match :extension
case /^:/.test(ext_name):
Expand Down Expand Up @@ -255,6 +281,19 @@ export async function addExtensionLinux(
ext_prefix
);
return;
// match extensions from GitHub. Do this before checking for semver as
// the version may match that as well
case /.*-(.*)\/(.*)@(.*)/.test(extension):
matches = /.*-(.*)\/(.*)@(.*)/.exec(extension) as RegExpExecArray;
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
matches[1],
matches[2],
matches[3],
ext_prefix
);
return;
// match semver versions
case /.*-\d+\.\d+\.\d+.*/.test(version_extension):
add_script += await utils.joins(
Expand Down
22 changes: 21 additions & 1 deletion src/scripts/common.sh
Expand Up @@ -267,4 +267,24 @@ add_composertool() {
# Function to get PHP version in semver format.
php_semver() {
php"$version" -v | grep -Eo -m 1 "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1
}
}

# 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"
}
19 changes: 0 additions & 19 deletions src/scripts/linux.sh
Expand Up @@ -142,25 +142,6 @@ add_pecl_extension() {
fi
}

# Function to install extension from source
add_extension_from_source() {
extension=$1
repo=$2
release=$3
args=$4
prefix=$5
(
add_devtools phpize
delete_extension "$extension"
get -q -n "/tmp/$extension.tar.gz" "https://github.com/$repo/archive/$release.tar.gz"
tar xf /tmp/"$extension".tar.gz -C /tmp
cd /tmp/"$extension-$release" || exit 1
phpize && ./configure "$args" && make -j"$(nproc)" && sudo make install
enable_extension "$extension" "$prefix"
) >/dev/null 2>&1
add_extension_log "$extension-$release" "Installed and enabled"
}

# Function to setup phpize and php-config.
add_devtools() {
tool=$1
Expand Down