Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b52930e590 | ||
|
|
3572ca5db9 | ||
|
|
b8a361a25a | ||
|
|
eb0ccb73d5 | ||
|
|
2a56d34ea0 | ||
|
|
075da4be87 | ||
|
|
b660f29789 | ||
|
|
f73bbb0929 | ||
|
|
caa5d3f915 | ||
|
|
6c67ee1261 | ||
|
|
502885cc75 | ||
|
|
d3929ece8e | ||
|
|
9355729f4a | ||
|
|
7f4f2f921c | ||
|
|
bcdf57190d | ||
|
|
fa913560e6 | ||
|
|
90fc296fbc | ||
|
|
f851596ef0 | ||
|
|
319d6f9a6d | ||
|
|
882ea8f750 | ||
|
|
7e3d12a4c4 | ||
|
|
96afc02cad | ||
|
|
024a2e796f | ||
|
|
65ea75914e |
@@ -12,12 +12,5 @@
|
|||||||
"plugin:prettier/recommended",
|
"plugin:prettier/recommended",
|
||||||
"prettier"
|
"prettier"
|
||||||
],
|
],
|
||||||
"plugins": ["@typescript-eslint", "jest"],
|
"plugins": ["@typescript-eslint", "jest"]
|
||||||
"rules": {
|
|
||||||
"camelcase": "off",
|
|
||||||
"require-atomic-updates": "off",
|
|
||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
|
||||||
"@typescript-eslint/camelcase": "off",
|
|
||||||
"@typescript-eslint/no-unused-vars": "off"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
7
.github/FUNDING.yml
vendored
7
.github/FUNDING.yml
vendored
@@ -1,7 +0,0 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
open_collective: setup-php
|
|
||||||
tidelift: "npm/setup-php"
|
|
||||||
community_bridge: setup-php
|
|
||||||
patreon: shivammathur
|
|
||||||
custom: https://www.paypal.me/shivammathur
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Libs workflow
|
name: Release workflow
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
schedule:
|
schedule:
|
||||||
@@ -38,6 +38,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: lists
|
name: lists
|
||||||
path: src/lists
|
path: src/lists
|
||||||
|
- name: Update darwin extensions list
|
||||||
|
run: |
|
||||||
|
brew tap shivammathur/extensions
|
||||||
|
find "$(brew --repository shivammathur/extensions)"/.github/deps -mindepth 1 -type d -name "*" -exec basename {} \; | sort > src/lists/darwin-extensions
|
||||||
- name: Update tags and branches
|
- name: Update tags and branches
|
||||||
run: |
|
run: |
|
||||||
push_ref() {
|
push_ref() {
|
||||||
20
README.md
20
README.md
@@ -37,17 +37,19 @@ Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "Gi
|
|||||||
|7.4|`Stable`|`Active`|
|
|7.4|`Stable`|`Active`|
|
||||||
|8.0|`Stable`|`Active`|
|
|8.0|`Stable`|`Active`|
|
||||||
|8.1|`Nightly`|`In development`|
|
|8.1|`Nightly`|`In development`|
|
||||||
|
|8.2|`Nightly`|`In development`|
|
||||||
|
|
||||||
## :cloud: OS/Platform Support
|
## :cloud: OS/Platform Support
|
||||||
|
|
||||||
|Virtual environment|YAML workflow label|
|
|Virtual environment|YAML workflow label|
|
||||||
|--- |--- |
|
|--- |--- |
|
||||||
|Windows Server 2019|`windows-latest` or `windows-2019`|
|
|
||||||
|Ubuntu 20.04|`ubuntu-latest` or `ubuntu-20.04`|
|
|Ubuntu 20.04|`ubuntu-latest` or `ubuntu-20.04`|
|
||||||
|Ubuntu 18.04|`ubuntu-18.04`|
|
|Ubuntu 18.04|`ubuntu-18.04`|
|
||||||
|Ubuntu 16.04|`ubuntu-16.04`|
|
|Ubuntu 16.04|`ubuntu-16.04`|
|
||||||
|
|Windows Server 2022|`windows-2022`|
|
||||||
|
|Windows Server 2019|`windows-latest` or `windows-2019`|
|
||||||
|macOS Catalina 10.15|`macos-latest` or `macOS-10.15`|
|
|macOS Catalina 10.15|`macos-latest` or `macOS-10.15`|
|
||||||
|macOS Big Sur 11.x|`macOS-11.0`|
|
|macOS Big Sur 11.x|`macOS-11`|
|
||||||
|
|
||||||
## :memo: Usage
|
## :memo: Usage
|
||||||
|
|
||||||
@@ -57,15 +59,18 @@ Use this GitHub Action when the extensions you are adding in [setup-php](https:/
|
|||||||
|
|
||||||
#### `php-version` (required)
|
#### `php-version` (required)
|
||||||
|
|
||||||
- Specify the PHP version you want to set-up.
|
- Specify the PHP version you want to set up.
|
||||||
- Accepts a `string`. For example `'7.4'`.
|
- Accepts a `string`. For example `'8.0'`.
|
||||||
|
- Accepts `latest` to set up the latest stable PHP version.
|
||||||
|
- Accepts `nightly` to set up a nightly build from the master branch of PHP.
|
||||||
|
- Accepts the format `d.x`, where `d` is the major version. For example `5.x`, `7.x` and `8.x`.
|
||||||
- See [PHP support](#tada-php-support) for supported PHP versions.
|
- See [PHP support](#tada-php-support) for supported PHP versions.
|
||||||
|
|
||||||
#### `extensions` (required)
|
#### `extensions` (required)
|
||||||
|
|
||||||
- Specify the extensions you want to setup.
|
- Specify the extensions you want to set up.
|
||||||
- Accepts a `string` in csv-format. For example `mbstring, xdebug, :opcache`.
|
- Accepts a `string` in csv-format. For example `mbstring, xdebug, :opcache`.
|
||||||
- Extensions prefixed with `:` are ignored.
|
- Extensions prefixed with `:` are ignored in output cache key.
|
||||||
|
|
||||||
#### `key` (required)
|
#### `key` (required)
|
||||||
|
|
||||||
@@ -143,8 +148,7 @@ Contributions are welcome! See [Contributor's Guide](.github/CONTRIBUTING.md "sh
|
|||||||
If this action helped you.
|
If this action helped you.
|
||||||
|
|
||||||
- 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.
|
||||||
- Please consider supporting our work by sponsoring using [Open Collective](https://opencollective.com/setup-php), [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal") or [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon").
|
- Please consider supporting our work by sponsoring using [GitHub sponsors](https://github.com/sponsors/shivammathur).
|
||||||
- If you use this action at your company, please [reach out](mailto:contact@setup-php.com) to sponsor the project.
|
|
||||||
|
|
||||||
## :package: Dependencies
|
## :package: Dependencies
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import path from 'path';
|
||||||
|
import * as spu from 'setup-php/lib/utils';
|
||||||
import * as cache from '../src/cache';
|
import * as cache from '../src/cache';
|
||||||
import * as utils from '../src/utils';
|
import * as utils from '../src/utils';
|
||||||
|
|
||||||
@@ -6,17 +8,14 @@ import * as utils from '../src/utils';
|
|||||||
*/
|
*/
|
||||||
jest.mock('../src/cache', () => ({
|
jest.mock('../src/cache', () => ({
|
||||||
run: jest.fn().mockImplementation(async (): Promise<string> => {
|
run: jest.fn().mockImplementation(async (): Promise<string> => {
|
||||||
let version: string = process.env['php-version'] || '';
|
const version: string = await spu.parseVersion(
|
||||||
version = version.length > 1 ? version.slice(0, 3) : version + '.0';
|
process.env['php-version'] || ''
|
||||||
|
);
|
||||||
const extensions = await utils.filterExtensions(
|
const extensions = await utils.filterExtensions(
|
||||||
process.env['extensions'] || ''
|
process.env['extensions'] || ''
|
||||||
);
|
);
|
||||||
const key: string = process.env['key'] || '';
|
const key: string = process.env['key'] || '';
|
||||||
const script_path = 'extensions.sh';
|
return await utils.scriptCall('test', extensions, key, version);
|
||||||
|
|
||||||
return (
|
|
||||||
'bash ' + script_path + ' "' + extensions + '" ' + key + ' ' + version
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -38,21 +37,22 @@ function setEnv(
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('Install', () => {
|
describe('Install', () => {
|
||||||
|
const spath: string = path.join(__dirname, '../src/scripts/cache.sh');
|
||||||
it('Test Run', async () => {
|
it('Test Run', async () => {
|
||||||
setEnv('7.0', 'xdebug, pcov', 'cache-v1');
|
setEnv('7.0', 'xdebug, pcov', 'cache-v1');
|
||||||
const script: string = '' + (await cache.run());
|
const script: string = '' + (await cache.run());
|
||||||
expect(script).toContain('bash extensions.sh "xdebug, pcov" cache-v1 7.0');
|
expect(script).toContain(`bash ${spath} test "xdebug, pcov" cache-v1 7.0`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Test Run', async () => {
|
it('Test Run', async () => {
|
||||||
setEnv('7.4', 'xdebug, zip', 'cache-v2');
|
setEnv('7.4', 'xdebug, zip', 'cache-v2');
|
||||||
const script: string = '' + (await cache.run());
|
const script: string = '' + (await cache.run());
|
||||||
expect(script).toContain('bash extensions.sh "xdebug, zip" cache-v2 7.4');
|
expect(script).toContain(`bash ${spath} test "xdebug, zip" cache-v2 7.4`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Test Run', async () => {
|
it('Test Run', async () => {
|
||||||
setEnv('7.4', 'xdebug, :zip', 'cache-v2');
|
setEnv('7.4', 'xdebug, :zip', 'cache-v2');
|
||||||
const script: string = '' + (await cache.run());
|
const script: string = '' + (await cache.run());
|
||||||
expect(script).toContain('bash extensions.sh "xdebug" cache-v2 7.4');
|
expect(script).toContain(`bash ${spath} test "xdebug" cache-v2 7.4`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,38 +1,33 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
import * as utils from '../src/utils';
|
import * as utils from '../src/utils';
|
||||||
|
|
||||||
jest.mock('@actions/core', () => ({
|
async function cleanup(path: string): Promise<void> {
|
||||||
getInput: jest.fn().mockImplementation(key => {
|
fs.unlink(path, error => {
|
||||||
return ['cache-extensions'].indexOf(key) !== -1 ? key : '';
|
if (error) {
|
||||||
})
|
console.log(error);
|
||||||
}));
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
describe('Utils tests', () => {
|
describe('Utils tests', () => {
|
||||||
it('checking readEnv', async () => {
|
it('checking getOutput', async () => {
|
||||||
process.env['test'] = 'setup-php';
|
const temp_dir: string = process.env['RUNNER_TEMP'] || '';
|
||||||
expect(await utils.readEnv('test')).toBe('setup-php');
|
const file_path: string = path.join(temp_dir, 'test');
|
||||||
expect(await utils.readEnv('undefined')).toBe('');
|
fs.writeFileSync(file_path, 'test', {mode: 0o755});
|
||||||
});
|
expect(await utils.getOutput('test')).toBe('test');
|
||||||
|
await cleanup(file_path);
|
||||||
it('checking getInput', async () => {
|
|
||||||
process.env['test'] = 'setup-php';
|
|
||||||
expect(await utils.getInput('test', false)).toBe('setup-php');
|
|
||||||
expect(await utils.getInput('cache-extensions', false)).toBe(
|
|
||||||
'cache-extensions'
|
|
||||||
);
|
|
||||||
expect(await utils.getInput('DoesNotExist', false)).toBe('');
|
|
||||||
expect(async () => {
|
|
||||||
await utils.getInput('DoesNotExist', true);
|
|
||||||
}).rejects.toThrow('Input required and not supplied: DoesNotExist');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('checking parseVersion', async () => {
|
|
||||||
expect(await utils.parseVersion('7')).toBe('7.0');
|
|
||||||
expect(await utils.parseVersion('7.4')).toBe('7.4');
|
|
||||||
expect(await utils.parseVersion('latest')).toBe('7.4');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('checking filterExtensions', async () => {
|
it('checking filterExtensions', async () => {
|
||||||
expect(await utils.filterExtensions('a,:b,c')).toBe('a,c');
|
expect(await utils.filterExtensions('a,:b,c')).toBe('"a,c"');
|
||||||
expect(await utils.filterExtensions('a, :b, c')).toBe('a, c');
|
expect(await utils.filterExtensions('a, :b, c')).toBe('"a, c"');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('checking scriptCall', async () => {
|
||||||
|
const script: string = path.join(__dirname, '../src/scripts/cache.sh');
|
||||||
|
expect(await utils.scriptCall('test a b')).toBe(
|
||||||
|
['bash', script, 'test', 'a', 'b'].join(' ')
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
58716
dist/index.js
vendored
58716
dist/index.js
vendored
File diff suppressed because one or more lines are too long
4218
package-lock.json
generated
4218
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
33
package.json
33
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "cache-extensions",
|
"name": "cache-extensions",
|
||||||
"version": "1.5.1",
|
"version": "1.6.1",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "Cache extensions in GitHub Actions",
|
"description": "Cache PHP extensions in GitHub Actions",
|
||||||
"main": "lib/cache.js",
|
"main": "lib/cache.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
@@ -19,31 +19,34 @@
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"actions",
|
"actions",
|
||||||
"php",
|
"php",
|
||||||
"setup"
|
"extension",
|
||||||
|
"cache"
|
||||||
],
|
],
|
||||||
"author": "shivammathur",
|
"author": "shivammathur",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.3.0",
|
"@actions/cache": "^1.0.7",
|
||||||
"@actions/exec": "^1.0.4"
|
"@actions/core": "^1.4.0",
|
||||||
|
"@actions/exec": "^1.1.0",
|
||||||
|
"setup-php": "^2.14.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^26.0.23",
|
"@types/jest": "^26.0.24",
|
||||||
"@types/node": "^15.6.1",
|
"@types/node": "^16.0.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
"@typescript-eslint/eslint-plugin": "^4.28.2",
|
||||||
"@typescript-eslint/parser": "^4.25.0",
|
"@typescript-eslint/parser": "^4.28.2",
|
||||||
"@vercel/ncc": "^0.28.6",
|
"@vercel/ncc": "^0.28.6",
|
||||||
"eslint": "^7.27.0",
|
"eslint": "^7.30.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-import": "^2.23.4",
|
"eslint-plugin-import": "^2.23.4",
|
||||||
"eslint-plugin-jest": "^24.3.6",
|
"eslint-plugin-jest": "^24.3.6",
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
"husky": "^4.3.8",
|
"husky": "^4.3.8",
|
||||||
"jest": "^27.0.3",
|
"jest": "^27.0.6",
|
||||||
"jest-circus": "^27.0.3",
|
"jest-circus": "^27.0.6",
|
||||||
"prettier": "^2.3.0",
|
"prettier": "^2.3.2",
|
||||||
"ts-jest": "^27.0.1",
|
"ts-jest": "^27.0.3",
|
||||||
"typescript": "^4.3.2"
|
"typescript": "^4.3.5"
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"skipCI": true,
|
"skipCI": true,
|
||||||
|
|||||||
52
src/cache.ts
52
src/cache.ts
@@ -1,28 +1,60 @@
|
|||||||
import {exec} from '@actions/exec';
|
import {exec} from '@actions/exec';
|
||||||
|
import * as cache from '@actions/cache';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
|
import * as spu from 'setup-php/lib/utils';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as utils from './utils';
|
import * as utils from './utils';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle dependencies
|
||||||
|
*
|
||||||
|
* @param extensions
|
||||||
|
* @param version
|
||||||
|
*/
|
||||||
|
export async function handleDependencies(
|
||||||
|
extensions: string,
|
||||||
|
version: string
|
||||||
|
): Promise<void> {
|
||||||
|
if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) {
|
||||||
|
const cache_key: string = (await utils.getOutput('key')) + '-deps';
|
||||||
|
const cache_dir: string = path.join(
|
||||||
|
await spu.readEnv('RUNNER_TOOL_CACHE'),
|
||||||
|
'deps'
|
||||||
|
);
|
||||||
|
const cache_hit: string | undefined = await cache.restoreCache(
|
||||||
|
[cache_dir],
|
||||||
|
cache_key,
|
||||||
|
[cache_key]
|
||||||
|
);
|
||||||
|
await exec(await utils.scriptCall('dependencies', extensions, version));
|
||||||
|
if (!cache_hit) {
|
||||||
|
await cache.saveCache([cache_dir], cache_key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the script
|
* Run the script
|
||||||
*/
|
*/
|
||||||
export async function run(): Promise<void> {
|
export async function run(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const version: string = await utils.parseVersion(
|
const version: string = await spu.parseVersion(
|
||||||
await utils.getInput('php-version', true)
|
await spu.getInput('php-version', true)
|
||||||
);
|
);
|
||||||
const extensions: string = await utils.filterExtensions(
|
const extensions: string = await utils.filterExtensions(
|
||||||
await utils.getInput('extensions', true)
|
await spu.getInput('extensions', true)
|
||||||
);
|
|
||||||
const key: string = await utils.getInput('key', true);
|
|
||||||
const script_path: string = path.join(__dirname, '../src/extensions.sh');
|
|
||||||
await exec(
|
|
||||||
'bash ' + script_path + ' "' + extensions + '" ' + key + ' ' + version
|
|
||||||
);
|
);
|
||||||
|
const key: string = await spu.getInput('key', true);
|
||||||
|
await exec(await utils.scriptCall('data', extensions, version, key));
|
||||||
|
await handleDependencies(extensions, version);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(error.message);
|
core.setFailed((error as Error).message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// call the run function
|
// call the run function
|
||||||
run();
|
(async () => {
|
||||||
|
await run();
|
||||||
|
})().catch(error => {
|
||||||
|
core.setFailed(error.message);
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,219 +0,0 @@
|
|||||||
step_log() {
|
|
||||||
message=$1
|
|
||||||
printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
|
|
||||||
}
|
|
||||||
|
|
||||||
add_log() {
|
|
||||||
mark=$1
|
|
||||||
shift
|
|
||||||
subjects=("$@")
|
|
||||||
for subject in "${subjects[@]}"; do
|
|
||||||
if [ "$mark" = "$tick" ]; then
|
|
||||||
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Added $subject"
|
|
||||||
else
|
|
||||||
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Failed to setup $subject"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
fix_ownership() {
|
|
||||||
dir=$1
|
|
||||||
sudo chown -R "$USER":"$(id -g -n)" "$(dirname "$dir")"
|
|
||||||
}
|
|
||||||
|
|
||||||
link_apt_fast() {
|
|
||||||
if ! command -v apt-fast >/dev/null; then
|
|
||||||
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch_package() {
|
|
||||||
if ! [ -e /tmp/Packages ]; then
|
|
||||||
deb_build_arch=$(dpkg-architecture -q DEB_BUILD_ARCH)
|
|
||||||
curl -o /tmp/Packages.gz -sL "http://ppa.launchpad.net/ondrej/php/ubuntu/dists/$DISTRIB_CODENAME/main/binary-$deb_build_arch/Packages.gz"
|
|
||||||
gzip -df /tmp/Packages.gz
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_dependencies() {
|
|
||||||
package=$1
|
|
||||||
prefix=$2
|
|
||||||
sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Depends.*" | tr ',' '\n' | awk -v ORS='' '/^\s'"$prefix"'/{print$0}' | sed -e 's/([^()]*)//g' | sort | uniq | xargs echo -n
|
|
||||||
}
|
|
||||||
|
|
||||||
get_package_link() {
|
|
||||||
package=$1
|
|
||||||
trunk="http://ppa.launchpad.net/ondrej/php/ubuntu"
|
|
||||||
file=$(sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Filename.*" | cut -d' ' -f 2 | tr -d '\r')
|
|
||||||
echo "$trunk/$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
linux_extension_dir() {
|
|
||||||
api_version=$1
|
|
||||||
if [[ "$version" =~ $old_versions|$nightly_versions ]]; then
|
|
||||||
echo "/usr/local/php/$version/lib/php/extensions/no-debug-non-zts-$api_version"
|
|
||||||
else
|
|
||||||
echo "/usr/lib/php/$api_version"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
darwin_extension_dir() {
|
|
||||||
api_version=$1
|
|
||||||
if [[ "$version" =~ $old_versions ]]; then
|
|
||||||
echo "/opt/local/lib/php${version/./}/extensions/no-debug-non-zts-$api_version"
|
|
||||||
else
|
|
||||||
if [[ "$(sysctl -n hw.optional.arm64 2>/dev/null)" == "1" ]]; then
|
|
||||||
echo "/opt/homebrew/lib/php/pecl/$api_version"
|
|
||||||
else
|
|
||||||
echo "/usr/local/lib/php/pecl/$api_version"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_api_version() {
|
|
||||||
case $version in
|
|
||||||
5.3) echo "20090626" ;;
|
|
||||||
5.4) echo "20100525" ;;
|
|
||||||
5.5) echo "20121212" ;;
|
|
||||||
5.6) echo "20131226" ;;
|
|
||||||
7.0) echo "20151012" ;;
|
|
||||||
7.1) echo "20160303" ;;
|
|
||||||
7.2) echo "20170718" ;;
|
|
||||||
7.3) echo "20180731" ;;
|
|
||||||
7.4) echo "20190902" ;;
|
|
||||||
8.0) echo "20200930" ;;
|
|
||||||
*)
|
|
||||||
php_header="https://raw.githubusercontent.com/php/php-src/master/main/php.h"
|
|
||||||
curl -sSL --retry 5 "$php_header" | grep "PHP_API_VERSION" | cut -d' ' -f 3
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
add_config() {
|
|
||||||
dependent_extension=$1
|
|
||||||
dependency_extension=$2
|
|
||||||
echo "$dependency_extension" | sudo tee "$cache_directory/$dependent_extension/$dependency_extension" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_extension() {
|
|
||||||
dependent_extension=$1
|
|
||||||
dependency_extension=$2
|
|
||||||
extension_dir=$3
|
|
||||||
if ! [ -e "$extension_dir/$dependency_extension.so" ]; then
|
|
||||||
extension_package_link="$(get_package_link "php$version-$dependency_extension")"
|
|
||||||
sudo curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" -o "$dependency_extension".deb -sL "$extension_package_link"
|
|
||||||
sudo dpkg-deb -x "$dependency_extension".deb /
|
|
||||||
fix_ownership "$dir"
|
|
||||||
fi
|
|
||||||
if [ -e "$extension_dir/$dependency_extension.so" ]; then
|
|
||||||
add_config "$dependent_extension" "$dependency_extension"
|
|
||||||
add_log "$tick" "$dependency_extension"
|
|
||||||
else
|
|
||||||
add_log "$cross" "$dependency_extension"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
filter_dependencies_libs() {
|
|
||||||
libraries="$(echo "$1" | xargs -n1 | uniq | xargs)"
|
|
||||||
script_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )
|
|
||||||
for library in $libraries; do
|
|
||||||
if grep -i -q -w "$library" "$script_dir"/lists/"$DISTRIB_CODENAME"-libs; then
|
|
||||||
libraries=${libraries//$library/}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "$libraries"
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_dependencies_libs() {
|
|
||||||
libraries=$1
|
|
||||||
if [[ -n "${libraries// }" ]]; then
|
|
||||||
libraries=$(filter_dependencies_libs "$libraries")
|
|
||||||
if [[ -n "${libraries// }" ]]; then
|
|
||||||
step_log "Setup libraries"
|
|
||||||
IFS=' ' read -r -a libraries_array <<<"$libraries"
|
|
||||||
link_apt_fast
|
|
||||||
(
|
|
||||||
sudo DEBIAN_FRONTEND=noninteractive apt-fast install --no-install-recommends --no-upgrade -y "${libraries_array[@]}" >/dev/null 2>&1 &&
|
|
||||||
add_log "$tick" "${libraries_array[@]}"
|
|
||||||
) || add_log "$cross" "${libraries_array[@]}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_dependencies_extensions() {
|
|
||||||
extension_dir=$1
|
|
||||||
shift
|
|
||||||
extensions_array=("$@")
|
|
||||||
. /etc/lsb-release
|
|
||||||
cache_directory=/tmp/extcache
|
|
||||||
sudo rm -rf "$cache_directory" || true
|
|
||||||
libraries=""
|
|
||||||
for extension_package in "${extensions_array[@]}"; do
|
|
||||||
fetch_package
|
|
||||||
libraries="$libraries $(get_dependencies "$extension_package" "lib")"
|
|
||||||
extension="${extension_package/php$version-/}"
|
|
||||||
if ! [ -d "$cache_directory"/"$extension" ]; then
|
|
||||||
extension_dependencies=$(get_dependencies "$extension_package" "php$version-")
|
|
||||||
extension_dependencies="${extension_dependencies//php$version-common/}"
|
|
||||||
if [[ -n "${extension_dependencies// }" ]]; then
|
|
||||||
step_log "Setup extensions for $extension"
|
|
||||||
extension_dependencies_array=()
|
|
||||||
IFS=' ' read -r -a extension_dependencies_array <<<"$extension_dependencies"
|
|
||||||
sudo mkdir -p "$cache_directory"/"$extension"
|
|
||||||
(
|
|
||||||
cd "$cache_directory" || exit 1
|
|
||||||
to_wait=()
|
|
||||||
for extension_dependeny_package in "${extension_dependencies_array[@]}"; do
|
|
||||||
if [[ -n "${extension_dependeny_package// }" ]]; then
|
|
||||||
extension_dependency=${extension_dependeny_package/php$version-/}
|
|
||||||
setup_extension "$extension" "$extension_dependency" "$extension_dir" &
|
|
||||||
to_wait+=($!)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
wait "${to_wait[@]}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
setup_dependencies_libs "$libraries"
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_dependencies() {
|
|
||||||
extensions=$1
|
|
||||||
extension_dir=$2
|
|
||||||
if [[ -n "${extensions// }" ]]; then
|
|
||||||
IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ php$version-/g")"
|
|
||||||
setup_dependencies_extensions "$extension_dir" "${extensions_array[@]}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
extensions=$1
|
|
||||||
key=$2
|
|
||||||
version=$3
|
|
||||||
tick="✓"
|
|
||||||
cross="✗"
|
|
||||||
os=$(uname -s)
|
|
||||||
old_versions="5.[3-5]"
|
|
||||||
nightly_versions="8.[1-9]"
|
|
||||||
date='20210313'
|
|
||||||
if [ "$os" = "Linux" ]; then
|
|
||||||
. /etc/lsb-release
|
|
||||||
os=$os-$DISTRIB_CODENAME
|
|
||||||
api_version=$(get_api_version)
|
|
||||||
dir=$(linux_extension_dir "$api_version")
|
|
||||||
sudo mkdir -p "$dir" && fix_ownership "$dir"
|
|
||||||
setup_dependencies "$extensions" "$dir"
|
|
||||||
elif [ "$os" = "Darwin" ]; then
|
|
||||||
api_version=$(get_api_version)
|
|
||||||
dir=$(darwin_extension_dir "$api_version")
|
|
||||||
sudo mkdir -p "$dir" && fix_ownership "$dir"
|
|
||||||
[[ "$extensions" == *"imagick"* ]] && date='20210622'
|
|
||||||
else
|
|
||||||
os="Windows"
|
|
||||||
dir='C:\\tools\\php\\ext'
|
|
||||||
[[ "$extensions" == *"imagick"* ]] && date='20210512'
|
|
||||||
fi
|
|
||||||
key="$os"-ext-"$version"-$(echo -n "$extensions-$key" | openssl dgst -sha256 | cut -d ' ' -f 2)
|
|
||||||
key="$key-$date"
|
|
||||||
echo "::set-output name=dir::$dir"
|
|
||||||
echo "::set-output name=key::$key"
|
|
||||||
17
src/lists/darwin-extensions
Normal file
17
src/lists/darwin-extensions
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
amqp
|
||||||
|
expect
|
||||||
|
grpc
|
||||||
|
imagick
|
||||||
|
imap
|
||||||
|
memcached
|
||||||
|
mongodb
|
||||||
|
pecl_http
|
||||||
|
phalcon3
|
||||||
|
phalcon4
|
||||||
|
psr
|
||||||
|
rdkafka
|
||||||
|
redis
|
||||||
|
ssh2
|
||||||
|
vips
|
||||||
|
yaml
|
||||||
|
zmq
|
||||||
@@ -21,6 +21,7 @@ libasound2
|
|||||||
libasound2-data
|
libasound2-data
|
||||||
libaspell15
|
libaspell15
|
||||||
libassuan0
|
libassuan0
|
||||||
|
libatasmart4
|
||||||
libatk-bridge2.0-0
|
libatk-bridge2.0-0
|
||||||
libatk1.0-0
|
libatk1.0-0
|
||||||
libatk1.0-data
|
libatk1.0-data
|
||||||
@@ -39,6 +40,14 @@ libblas-dev
|
|||||||
libblas3
|
libblas3
|
||||||
libblkid-dev
|
libblkid-dev
|
||||||
libblkid1
|
libblkid1
|
||||||
|
libblockdev-crypto2
|
||||||
|
libblockdev-fs2
|
||||||
|
libblockdev-loop2
|
||||||
|
libblockdev-part-err2
|
||||||
|
libblockdev-part2
|
||||||
|
libblockdev-swap2
|
||||||
|
libblockdev-utils2
|
||||||
|
libblockdev2
|
||||||
libboost-context1.71.0
|
libboost-context1.71.0
|
||||||
libboost-filesystem1.71.0
|
libboost-filesystem1.71.0
|
||||||
libboost-program-options1.71.0
|
libboost-program-options1.71.0
|
||||||
@@ -258,6 +267,7 @@ libitm1
|
|||||||
libjansson4
|
libjansson4
|
||||||
libjbig-dev
|
libjbig-dev
|
||||||
libjbig0
|
libjbig0
|
||||||
|
libjcat1
|
||||||
libjemalloc2
|
libjemalloc2
|
||||||
libjpeg-dev
|
libjpeg-dev
|
||||||
libjpeg-turbo8
|
libjpeg-turbo8
|
||||||
@@ -487,7 +497,6 @@ libmysqlclient21
|
|||||||
libncurses-dev
|
libncurses-dev
|
||||||
libncurses5
|
libncurses5
|
||||||
libncurses6
|
libncurses6
|
||||||
libncursesw5
|
|
||||||
libncursesw6
|
libncursesw6
|
||||||
libnet-dbus-perl
|
libnet-dbus-perl
|
||||||
libnet-http-perl
|
libnet-http-perl
|
||||||
@@ -536,6 +545,7 @@ libpangocairo-1.0-0
|
|||||||
libpangoft2-1.0-0
|
libpangoft2-1.0-0
|
||||||
libpaper-utils
|
libpaper-utils
|
||||||
libpaper1
|
libpaper1
|
||||||
|
libparted-fs-resize0
|
||||||
libparted2
|
libparted2
|
||||||
libpcap0.8
|
libpcap0.8
|
||||||
libpci3
|
libpci3
|
||||||
@@ -674,6 +684,7 @@ libubsan1
|
|||||||
libuchardet0
|
libuchardet0
|
||||||
libucl1
|
libucl1
|
||||||
libudev1
|
libudev1
|
||||||
|
libudisks2-0
|
||||||
libunistring2
|
libunistring2
|
||||||
libunwind8
|
libunwind8
|
||||||
liburcu6
|
liburcu6
|
||||||
@@ -683,6 +694,7 @@ libutempter0
|
|||||||
libutf8proc2
|
libutf8proc2
|
||||||
libuuid1
|
libuuid1
|
||||||
libuv1
|
libuv1
|
||||||
|
libvolume-key1
|
||||||
libvorbis0a
|
libvorbis0a
|
||||||
libvorbisfile3
|
libvorbisfile3
|
||||||
libvpx6
|
libvpx6
|
||||||
|
|||||||
123
src/scripts/cache.sh
Normal file
123
src/scripts/cache.sh
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
step_log() {
|
||||||
|
message=$1
|
||||||
|
printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
|
||||||
|
}
|
||||||
|
|
||||||
|
add_log() {
|
||||||
|
mark=$1
|
||||||
|
shift
|
||||||
|
subjects=("$@")
|
||||||
|
for subject in "${subjects[@]}"; do
|
||||||
|
if [ "$mark" = "$tick" ]; then
|
||||||
|
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Added $subject"
|
||||||
|
else
|
||||||
|
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Failed to setup $subject"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
get_api_version_from_repo() {
|
||||||
|
php_header="https://raw.githubusercontent.com/php/php-src/PHP-$version/main/php.h"
|
||||||
|
status_code=$(curl -sSL -o /tmp/php.h -w "%{http_code}" "$php_header")
|
||||||
|
if [ "$status_code" != "200" ]; then
|
||||||
|
curl -sSL --retry 5 "${php_header/PHP-$version/master}" | grep "PHP_API_VERSION" | cut -d' ' -f 3
|
||||||
|
else
|
||||||
|
grep "PHP_API_VERSION" /tmp/php.h | cut -d' ' -f 3
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_api_version() {
|
||||||
|
case $version in
|
||||||
|
5.3) echo "20090626" ;;
|
||||||
|
5.4) echo "20100525" ;;
|
||||||
|
5.5) echo "20121212" ;;
|
||||||
|
5.6) echo "20131226" ;;
|
||||||
|
7.0) echo "20151012" ;;
|
||||||
|
7.1) echo "20160303" ;;
|
||||||
|
7.2) echo "20170718" ;;
|
||||||
|
7.3) echo "20180731" ;;
|
||||||
|
7.4) echo "20190902" ;;
|
||||||
|
8.0) echo "20200930" ;;
|
||||||
|
8.1) echo "20210902" ;;
|
||||||
|
*) get_api_version_from_repo ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
fix_ownership() {
|
||||||
|
dir=$1
|
||||||
|
sudo chown -R "$USER":"$(id -g -n)" "$(dirname "$dir")"
|
||||||
|
}
|
||||||
|
|
||||||
|
add_config() {
|
||||||
|
dependent_extension=$1
|
||||||
|
dependency_extension=$2
|
||||||
|
echo "$dependency_extension" | sudo tee "${ext_config_directory:?}/$dependent_extension/$dependency_extension" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
extension_dir_darwin() {
|
||||||
|
api_version=$1
|
||||||
|
if [[ "${version:?}" =~ ${old_versions:?} ]]; then
|
||||||
|
echo "/opt/local/lib/php${version/./}/extensions/no-debug-non-zts-$api_version"
|
||||||
|
else
|
||||||
|
if [[ "$(sysctl -n hw.optional.arm64 2>/dev/null)" == "1" ]]; then
|
||||||
|
echo "/opt/homebrew/lib/php/pecl/$api_version"
|
||||||
|
else
|
||||||
|
echo "/usr/local/lib/php/pecl/$api_version"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
extension_dir_linux() {
|
||||||
|
api_version=$1
|
||||||
|
if [[ "${version:?}" =~ ${old_versions:?} ]]; then
|
||||||
|
echo "/usr/local/php/$version/lib/php/extensions/no-debug-non-zts-$api_version"
|
||||||
|
else
|
||||||
|
echo "/usr/lib/php/$api_version"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
data() {
|
||||||
|
old_versions="5.[3-5]"
|
||||||
|
date='20210919'
|
||||||
|
if [ "$os" = "Linux" ]; then
|
||||||
|
. /etc/lsb-release
|
||||||
|
os=$os-$DISTRIB_CODENAME
|
||||||
|
api_version=$(get_api_version)
|
||||||
|
dir=$(extension_dir_linux "$api_version")
|
||||||
|
sudo mkdir -p "$dir/deps" && fix_ownership "$dir"
|
||||||
|
elif [ "$os" = "Darwin" ]; then
|
||||||
|
api_version=$(get_api_version)
|
||||||
|
dir=$(extension_dir_darwin "$api_version")
|
||||||
|
sudo mkdir -p "$dir/deps" && fix_ownership "$dir"
|
||||||
|
else
|
||||||
|
os="Windows"
|
||||||
|
dir='C:\\tools\\php\\ext'
|
||||||
|
fi
|
||||||
|
key="$os"-ext-"$version"-$(echo -n "$extensions-$key" | openssl dgst -sha256 | cut -d ' ' -f 2)
|
||||||
|
key="$key-$date"
|
||||||
|
echo "$dir" > "${RUNNER_TEMP:?}"/dir
|
||||||
|
echo "$key" > "${RUNNER_TEMP:?}"/key
|
||||||
|
echo "::set-output name=dir::$dir"
|
||||||
|
echo "::set-output name=key::$key"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies() {
|
||||||
|
if [ "$os" = "Linux" ] || [ "$os" = "Darwin" ]; then
|
||||||
|
export tick="✓"
|
||||||
|
export cross="✗"
|
||||||
|
export ext_config_directory="/tmp/extcache"
|
||||||
|
export deps_cache_directory="${RUNNER_TOOL_CACHE}"/deps
|
||||||
|
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
. "$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh"
|
||||||
|
setup_dependencies "$extensions" "$(cat "${RUNNER_TEMP:?}"/dir)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run=$1
|
||||||
|
extensions=$2
|
||||||
|
version=$3
|
||||||
|
key=$4
|
||||||
|
os=$(uname -s)
|
||||||
|
|
||||||
|
$run
|
||||||
173
src/scripts/darwin.sh
Normal file
173
src/scripts/darwin.sh
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
fetch_brew_tap() {
|
||||||
|
tap=$1
|
||||||
|
tap_user=$(dirname "$tap")
|
||||||
|
tap_name=$(basename "$tap")
|
||||||
|
mkdir -p "$tap_dir/$tap_user"
|
||||||
|
curl -sL "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
|
||||||
|
if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
|
||||||
|
sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add_brew_tap() {
|
||||||
|
tap=$1
|
||||||
|
if ! [ -d "$tap_dir/$tap" ]; then
|
||||||
|
if [ "${ImageOS:=}-${ImageVersion:=}" = "-" ]; then
|
||||||
|
brew tap --shallow "$tap" >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
fetch_brew_tap "$tap" >/dev/null 2>&1
|
||||||
|
if ! [ -d "$tap_dir/$tap" ]; then
|
||||||
|
brew tap --shallow "$tap" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
filter_extensions() {
|
||||||
|
extensions_array=("$@")
|
||||||
|
filtered_extensions=()
|
||||||
|
for ext in "${extensions_array[@]}"; do
|
||||||
|
if grep -i -q -w "$ext" "${script_dir:?}"/../lists/darwin-extensions; then
|
||||||
|
filtered_extensions+=("$ext")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "${filtered_extensions[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_extensions_helper() {
|
||||||
|
dependent_extension=$1
|
||||||
|
dependency_extension=$2
|
||||||
|
extension_dir=$3
|
||||||
|
cached_extension="${deps_cache_directory:?}/$dependency_extension.so"
|
||||||
|
if ! [ -e "$cached_extension" ]; then
|
||||||
|
brew install "$dependency_extension@${version:?}"
|
||||||
|
sudo find "$brew_cellar/$dependency_extension@${version:?}" -name "$dependency_extension.so" -exec cp {} "$cached_extension" \;
|
||||||
|
else
|
||||||
|
echo "Found $dependency_extension extension in cache"
|
||||||
|
sudo cp "$cached_extension" "$extension_dir/"
|
||||||
|
fi
|
||||||
|
add_config "$dependent_extension" "$dependency_extension"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_extensions() {
|
||||||
|
dependent_extension=$1
|
||||||
|
extension_dir=$2
|
||||||
|
shift 2
|
||||||
|
dependency_extensions_array=("$@")
|
||||||
|
sudo mkdir -p "$cache_directory"/"$extension"
|
||||||
|
echo "::group::Logs to set up extensions required for $extension"
|
||||||
|
for dependency_extension in "${dependency_extensions_array[@]}"; do
|
||||||
|
setup_extensions_helper "$dependent_extension" "$dependency_extension" "$extension_dir"
|
||||||
|
done
|
||||||
|
echo "::endgroup::"
|
||||||
|
add_log "${tick:?}" "${dependency_extensions_array[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
add_library_helper() {
|
||||||
|
dep_name=$1
|
||||||
|
cache_dir=$2
|
||||||
|
echo "$dep_name" | sudo tee -a "$cache_dir"/list >/dev/null 2>&1
|
||||||
|
(
|
||||||
|
cd "$brew_cellar" || exit 1
|
||||||
|
if command -v gtar >/dev/null; then
|
||||||
|
sudo gtar -I "zstd -T0" -cf "$cache_dir"/"$dep_name".tar.zst "$dep_name"
|
||||||
|
else
|
||||||
|
sudo tar -cf - "$dep_name" | zstd -T0 > "$cache_dir"/"$dep_name".tar.zst
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
add_library() {
|
||||||
|
lib=$1
|
||||||
|
cache_dir=$2
|
||||||
|
brew list "$lib" &>/dev/null || brew install "$lib"
|
||||||
|
IFS=' ' read -r -a deps_array <<<"$(brew deps "$lib" | tr '\n' ' ')"
|
||||||
|
to_wait=()
|
||||||
|
for dep_name in "$lib" "${deps_array[@]}"; do
|
||||||
|
add_library_helper "$dep_name" "$cache_dir" &
|
||||||
|
to_wait+=($!)
|
||||||
|
done
|
||||||
|
wait "${to_wait[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_library_helper() {
|
||||||
|
dep_name=$1
|
||||||
|
cache_dir=$2
|
||||||
|
if ! [ -d "$brew_cellar/$dep_name" ]; then
|
||||||
|
if command -v gtar >/dev/null; then
|
||||||
|
sudo gtar -I "zstd -d" -xf "$cache_dir"/"$dep_name".tar.zst -C "$brew_cellar"
|
||||||
|
else
|
||||||
|
sudo zstd -dq "$cache_dir"/"$dep_name".tar.zst && sudo tar -xf "$cache_dir"/"$dep_name".tar -C "$brew_cellar"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if ! [ -d "$brew_prefix/opt/$dep_name" ]; then
|
||||||
|
brew link --force --overwrite "$dep_name" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_library() {
|
||||||
|
cache_dir=$1
|
||||||
|
to_wait=()
|
||||||
|
while read -r dep_name; do
|
||||||
|
restore_library_helper "$dep_name" "$cache_dir" &
|
||||||
|
to_wait+=($!)
|
||||||
|
done <"$cache_dir"/list
|
||||||
|
wait "${to_wait[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_libraries() {
|
||||||
|
extension=$1
|
||||||
|
shift 1
|
||||||
|
libraries_array=("$@")
|
||||||
|
ext_deps_dir="$deps_cache_directory/$extension"
|
||||||
|
sudo cp -a "$tap_dir"/"$ext_tap"/.github/deps/"$extension"/*.rb "$tap_dir"/"$core_tap"/Formula/
|
||||||
|
sudo mkdir -p "$ext_deps_dir"
|
||||||
|
echo "::group::Logs to set up libraries required for $extension"
|
||||||
|
for lib in "${libraries_array[@]}"; do
|
||||||
|
if ! [ -e "$ext_deps_dir"/list ]; then
|
||||||
|
add_library "$lib" "$ext_deps_dir"
|
||||||
|
else
|
||||||
|
restore_library "$ext_deps_dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "::endgroup::"
|
||||||
|
add_log "$tick" "${libraries_array[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_dependencies() {
|
||||||
|
extensions=$1
|
||||||
|
extension_dir=$2
|
||||||
|
cache_directory=/tmp/extcache
|
||||||
|
[[ -z "${extensions// /}" ]] && return
|
||||||
|
IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ /g")"
|
||||||
|
IFS=' ' read -r -a extensions_array <<<"$(filter_extensions "${extensions_array[@]}")"
|
||||||
|
if [[ -n "${extensions_array[*]// /}" ]]; then
|
||||||
|
add_brew_tap "$php_tap"
|
||||||
|
add_brew_tap "$ext_tap"
|
||||||
|
for extension in "${extensions_array[@]}"; do
|
||||||
|
IFS=' ' read -r -a dependency_array <<<"$(grep "depends_on" "$tap_dir/$ext_tap/Formula/$extension@$version.rb" | cut -d '"' -f 2 | tr '\n' ' ')"
|
||||||
|
IFS=' ' read -r -a extension_array <<<"$(echo "${dependency_array[@]}" | grep -Eo "[a-z]*@" | sed 's/@//' | tr '\n' ' ')"
|
||||||
|
IFS=' ' read -r -a libraries_array <<<"${dependency_array[@]//shivammathur*/}"
|
||||||
|
if [[ -n "${libraries_array[*]// /}" ]]; then
|
||||||
|
step_log "Setup libraries for $extension"
|
||||||
|
setup_libraries "$extension" "${libraries_array[@]}"
|
||||||
|
fi
|
||||||
|
if [[ -n "${extension_array[*]// /}" ]] && [ "${skip_dependency_extensions:=}" != "true" ]; then
|
||||||
|
step_log "Setup extensions for $extension"
|
||||||
|
setup_extensions "$extension" "$extension_dir" "${extension_array[@]}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
export HOMEBREW_CHANGE_ARCH_TO_ARM=1
|
||||||
|
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
||||||
|
export HOMEBREW_NO_AUTO_UPDATE=1
|
||||||
|
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
|
||||||
|
|
||||||
|
brew_prefix="$(brew --prefix)"
|
||||||
|
brew_cellar="$brew_prefix/Cellar"
|
||||||
|
tap_dir="$(brew --repository)"/Library/Taps
|
||||||
|
core_tap=homebrew/homebrew-core
|
||||||
|
php_tap=shivammathur/homebrew-php
|
||||||
|
ext_tap=shivammathur/homebrew-extensions
|
||||||
107
src/scripts/linux.sh
Normal file
107
src/scripts/linux.sh
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
link_apt_fast() {
|
||||||
|
if ! command -v apt-fast >/dev/null; then
|
||||||
|
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch_package() {
|
||||||
|
if ! [ -e /tmp/Packages ]; then
|
||||||
|
. /etc/lsb-release
|
||||||
|
deb_build_arch=$(dpkg-architecture -q DEB_BUILD_ARCH)
|
||||||
|
curl -o /tmp/Packages.gz -sL "http://ppa.launchpad.net/ondrej/php/ubuntu/dists/$DISTRIB_CODENAME/main/binary-$deb_build_arch/Packages.gz"
|
||||||
|
gzip -df /tmp/Packages.gz
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_dependencies() {
|
||||||
|
package=$1
|
||||||
|
prefix=$2
|
||||||
|
sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Depends.*" | tr ',' '\n' | awk -v ORS='' '/^\s'"$prefix"'/{print$0}' | sed -e 's/([^()]*)//g' | sort | uniq | xargs echo -n
|
||||||
|
}
|
||||||
|
|
||||||
|
get_package_link() {
|
||||||
|
package=$1
|
||||||
|
trunk="http://ppa.launchpad.net/ondrej/php/ubuntu"
|
||||||
|
file=$(sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Filename.*" | cut -d' ' -f 2 | tr -d '\r')
|
||||||
|
echo "$trunk/$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_extensions_helper() {
|
||||||
|
dependency_extension=$1
|
||||||
|
extension_dir=$2
|
||||||
|
cached_extension="${deps_cache_directory:?}/$dependency_extension.so"
|
||||||
|
if ! [ -e "$extension_dir/$dependency_extension.so" ]; then
|
||||||
|
if ! [ -e "$cached_extension" ]; then
|
||||||
|
extension_package_link="$(get_package_link "php${version:?}-$dependency_extension")"
|
||||||
|
sudo curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" -o "/tmp/$dependency_extension".deb -sL "$extension_package_link"
|
||||||
|
sudo dpkg-deb -x "/tmp/$dependency_extension".deb /
|
||||||
|
sudo cp "$extension_dir/$dependency_extension.so" "$cached_extension"
|
||||||
|
fix_ownership "$extension_dir"
|
||||||
|
else
|
||||||
|
sudo cp "$cached_extension" "$extension_dir/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_extensions() {
|
||||||
|
extension_dir=$1
|
||||||
|
IFS=' ' read -r -a dependency_extension_array <<<"$(echo "$2" | xargs -n1 | sort | uniq | xargs)"
|
||||||
|
to_wait=()
|
||||||
|
for dependency_extension in "${dependency_extension_array[@]}"; do
|
||||||
|
setup_extensions_helper "$dependency_extension" "$extension_dir" &
|
||||||
|
to_wait+=($!)
|
||||||
|
done
|
||||||
|
wait "${to_wait[@]}"
|
||||||
|
add_log "${tick:?}" "${dependency_extension_array[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
filter_libraries() {
|
||||||
|
libraries="$(echo "$1" | xargs -n1 | sort | uniq | xargs)"
|
||||||
|
for library in $libraries; do
|
||||||
|
if grep -i -q -w "$library" "${script_dir:?}"/../lists/"$DISTRIB_CODENAME"-libs; then
|
||||||
|
libraries=${libraries//$library/}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "$libraries"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_libraries() {
|
||||||
|
libraries=$1
|
||||||
|
if [[ -n "${libraries// /}" ]]; then
|
||||||
|
libraries=$(filter_libraries "$libraries")
|
||||||
|
if [[ -n "${libraries// /}" ]]; then
|
||||||
|
step_log "Setup libraries"
|
||||||
|
IFS=' ' read -r -a libraries_array <<<"$libraries"
|
||||||
|
link_apt_fast
|
||||||
|
echo "::group::Logs to set up required libraries"
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-fast install --no-install-recommends --no-upgrade -y "${libraries_array[@]}"
|
||||||
|
ec="$?"
|
||||||
|
echo "::endgroup::"
|
||||||
|
if [ "$ec" -eq "0" ]; then mark="${tick:?}"; else mark="${cross:?}"; fi
|
||||||
|
add_log "$mark" "${libraries_array[@]}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_dependencies() {
|
||||||
|
extensions=$1
|
||||||
|
extension_dir=$2
|
||||||
|
[[ -z "${extensions// }" ]] && return
|
||||||
|
IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ php$version-/g")"
|
||||||
|
. /etc/lsb-release
|
||||||
|
sudo rm -rf "${ext_config_directory:?}" || true
|
||||||
|
libraries=""
|
||||||
|
extension_packages=""
|
||||||
|
for extension_package in "${extensions_array[@]}"; do
|
||||||
|
fetch_package
|
||||||
|
libraries="$libraries $(get_dependencies "$extension_package" "lib")"
|
||||||
|
extension_packages="$extension_packages $(get_dependencies "$extension_package" "php$version-")"
|
||||||
|
extension_packages="${extension_packages//php$version-common/}"
|
||||||
|
done
|
||||||
|
if [[ -n "${libraries// /}" ]]; then
|
||||||
|
setup_libraries "$libraries"
|
||||||
|
fi
|
||||||
|
if [[ -n "${extension_packages// /}" ]] && [ "${skip_dependency_extensions:=}" != "true" ]; then
|
||||||
|
setup_extensions "$extension_dir" "${extension_packages//php$version-/}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
91
src/utils.ts
91
src/utils.ts
@@ -1,62 +1,15 @@
|
|||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as core from '@actions/core';
|
import * as path from 'path';
|
||||||
|
import * as spu from 'setup-php/lib/utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to read environment variable and return a string value.
|
* Function to get outputs
|
||||||
*
|
|
||||||
* @param property
|
|
||||||
*/
|
*/
|
||||||
export async function readEnv(property: string): Promise<string> {
|
export async function getOutput(output: string): Promise<string> {
|
||||||
const value = process.env[property];
|
return fs.readFileSync(
|
||||||
switch (value) {
|
path.join(await spu.readEnv('RUNNER_TEMP'), output),
|
||||||
case undefined:
|
'utf8'
|
||||||
return '';
|
);
|
||||||
default:
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to get inputs from both with and env annotations.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* @param mandatory
|
|
||||||
*/
|
|
||||||
export async function getInput(
|
|
||||||
name: string,
|
|
||||||
mandatory: boolean
|
|
||||||
): Promise<string> {
|
|
||||||
const input = core.getInput(name);
|
|
||||||
const env_input = await readEnv(name);
|
|
||||||
switch (true) {
|
|
||||||
case input != '':
|
|
||||||
return input;
|
|
||||||
case input == '' && env_input != '':
|
|
||||||
return env_input;
|
|
||||||
case input == '' && env_input == '' && mandatory:
|
|
||||||
throw new Error(`Input required and not supplied: ${name}`);
|
|
||||||
default:
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to parse PHP version.
|
|
||||||
*
|
|
||||||
* @param version
|
|
||||||
*/
|
|
||||||
export async function parseVersion(version: string): Promise<string> {
|
|
||||||
switch (version) {
|
|
||||||
case 'latest':
|
|
||||||
return '7.4';
|
|
||||||
default:
|
|
||||||
switch (true) {
|
|
||||||
case version.length > 1:
|
|
||||||
return version.slice(0, 3);
|
|
||||||
default:
|
|
||||||
return version + '.0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,10 +18,26 @@ export async function parseVersion(version: string): Promise<string> {
|
|||||||
* @param extension_csv
|
* @param extension_csv
|
||||||
*/
|
*/
|
||||||
export async function filterExtensions(extension_csv: string): Promise<string> {
|
export async function filterExtensions(extension_csv: string): Promise<string> {
|
||||||
return extension_csv
|
return JSON.stringify(
|
||||||
.split(',')
|
extension_csv
|
||||||
.filter(extension => {
|
.split(',')
|
||||||
return extension.trim()[0] != ':';
|
.filter(extension => {
|
||||||
})
|
return extension.trim()[0] != ':';
|
||||||
.join(',');
|
})
|
||||||
|
.join(',')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to get script call
|
||||||
|
*
|
||||||
|
* @param fn
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
export async function scriptCall(
|
||||||
|
fn: string,
|
||||||
|
...args: string[]
|
||||||
|
): Promise<string> {
|
||||||
|
const script: string = path.join(__dirname, '../src/scripts/cache.sh');
|
||||||
|
return ['bash', script, fn, ...args].join(' ');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user