Skip to content

Commit

Permalink
Allow extensions to be compiled from GitHub sources
Browse files Browse the repository at this point in the history
  • Loading branch information
alcaeus authored and shivammathur committed Feb 19, 2021
1 parent 912f27c commit f42065d
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 12 deletions.
16 changes: 14 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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'
);
});
});
19 changes: 19 additions & 0 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2901,6 +2901,13 @@ 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);
// Install extensions from a GitHub tarball. This needs to be checked first
// as the version may also match the semver check below.
const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/);
if (urlMatches != null) {
add_script += await utils.joins('\nadd_extension_from_github', ext_name, urlMatches[1], urlMatches[2], urlMatches[3], ext_prefix);
return;
}
switch (true) {
// match :extension
case /^:/.test(ext_name):
Expand Down Expand Up @@ -2987,6 +2994,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 +3056,13 @@ 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);
// Install extensions from a GitHub tarball. This needs to be checked first
// as the version may also match the semver check below.
const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/);
if (urlMatches != null) {
add_script += await utils.joins('\nadd_extension_from_github', ext_name, urlMatches[1], urlMatches[2], urlMatches[3], ext_prefix);
return;
}
switch (true) {
// Match :extension
case /^:/.test(ext_name):
Expand Down
41 changes: 41 additions & 0 deletions src/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,22 @@ 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);

// Install extensions from a GitHub tarball. This needs to be checked first
// as the version may also match the semver check below.
const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/);
if (urlMatches != null) {
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
urlMatches[1],
urlMatches[2],
urlMatches[3],
ext_prefix
);
return;
}

switch (true) {
// match :extension
case /^:/.test(ext_name):
Expand Down Expand Up @@ -142,6 +158,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 +239,22 @@ 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);

// Install extensions from a GitHub tarball. This needs to be checked first
// as the version may also match the semver check below.
const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/);
if (urlMatches != null) {
add_script += await utils.joins(
'\nadd_extension_from_github',
ext_name,
urlMatches[1],
urlMatches[2],
urlMatches[3],
ext_prefix
);
return;
}

switch (true) {
// Match :extension
case /^:/.test(ext_name):
Expand Down
18 changes: 18 additions & 0 deletions src/scripts/darwin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,24 @@ add_pecl_extension() {
fi
}

# 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 --recurse-submodules -b "$release" https://github.com/"$org"/"$repo" /tmp/"$repo-$release" || exit 1
cd /tmp/"$repo-$release" || 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"
}

# Function to fetch a brew tap
fetch_brew_tap() {
tap=$1
Expand Down
19 changes: 9 additions & 10 deletions src/scripts/linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -148,23 +148,22 @@ add_pecl_extension() {
fi
}

# Function to install extension from source
add_extension_from_source() {
# Function to install extension from a GitHub repository
add_extension_from_github() {
extension=$1
repo=$2
release=$3
args=$4
org=$2
repo=$3
release=$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
git clone --recurse-submodules -b "$release" https://github.com/"$org"/"$repo" /tmp/"$repo-$release" || exit 1
cd /tmp/"$repo-$release" || exit 1
phpize && ./configure && make -j"$(nproc)" && sudo make install
enable_extension "$extension" "$prefix"
) >/dev/null 2>&1
add_extension_log "$extension-$release" "Installed and enabled"
add_extension_log "$extension-$org/$repo@$release" "Installed and enabled"
}

# Function to setup phpize and php-config.
Expand Down

0 comments on commit f42065d

Please sign in to comment.