mirror of
https://github.com/shivammathur/setup-php.git
synced 2026-03-02 18:45:40 +07:00
Compare commits
27 Commits
releases/v
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8ca9e3783 | ||
|
|
769a4a81fd | ||
|
|
d042aafd13 | ||
|
|
f97ca00780 | ||
|
|
3aeeb03660 | ||
|
|
57e8183dae | ||
|
|
5e98c022f7 | ||
|
|
f0b3fd9afe | ||
|
|
1eee54fe48 | ||
|
|
341bc9e176 | ||
|
|
185f9de395 | ||
|
|
46cb5030ab | ||
|
|
6300a313a9 | ||
|
|
b7741bd785 | ||
|
|
109ae4d1c0 | ||
|
|
871ff01b2b | ||
|
|
f0e37f9e90 | ||
|
|
46ae35f333 | ||
|
|
f89a301251 | ||
|
|
5efa2a774e | ||
|
|
f72fc99524 | ||
|
|
c84edb415f | ||
|
|
4dda6da925 | ||
|
|
c14319add5 | ||
|
|
5ba12107fc | ||
|
|
8bd624e171 | ||
|
|
3dfaca4ee1 |
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
@@ -88,7 +88,7 @@ jobs:
|
||||
Remove-Item "$env:file.all" -Force
|
||||
Remove-Item "$env:file.builtin" -Force
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: lists-php${{ matrix.php-versions }}-${{ matrix.operating-system }}.md
|
||||
path: php${{ matrix.php-versions }}-${{ matrix.operating-system }}.md
|
||||
@@ -105,7 +105,7 @@ jobs:
|
||||
with:
|
||||
repository: ${{ github.repository }}.wiki
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v6
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
path: ${{ github.workspace }}/lists
|
||||
pattern: lists-*
|
||||
|
||||
4
.github/workflows/node.yml
vendored
4
.github/workflows/node.yml
vendored
@@ -33,10 +33,10 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Setup Node.js 20.x
|
||||
- name: Setup Node.js 24.x
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 20.x
|
||||
node-version: 24.x
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
2
.github/workflows/php.yml
vendored
2
.github/workflows/php.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
||||
key: ${{ env.key }}
|
||||
|
||||
- name: Cache extensions
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ steps.cache-env.outputs.dir }}
|
||||
key: ${{ steps.cache-env.outputs.key }}
|
||||
|
||||
11
README.md
11
README.md
@@ -74,13 +74,12 @@ Both `GitHub-hosted` and `self-hosted` runners are supported by `setup-php` on t
|
||||
| Ubuntu 22.04 | x86_64 | `ubuntu-22.04` | `PHP 8.1` |
|
||||
| Ubuntu 24.04 | aarch64 | `ubuntu-24.04-arm` | `PHP 8.3` |
|
||||
| Ubuntu 22.04 | aarch64 | `ubuntu-22.04-arm` | `PHP 8.1` |
|
||||
| Windows Server 2025 | x64 | `windows-2025` | `PHP 8.3` |
|
||||
| Windows Server 2022 | x64 | `windows-latest` or `windows-2022` | `PHP 8.3` |
|
||||
| Windows Server 2025 | x64 | `windows-2025` | `PHP 8.5` |
|
||||
| Windows Server 2022 | x64 | `windows-latest` or `windows-2022` | `PHP 8.5` |
|
||||
| macOS Tahoe 26.x | arm64 | `macos-26` | - |
|
||||
| macOS Sequoia 15.x | arm64 | `macos-latest` or `macos-15` | - |
|
||||
| macOS Sonoma 14.x | arm64 | `macos-14` | - |
|
||||
| macOS Sequoia 15.x | x86_64 | `macos-15-intel` | `PHP 8.3` |
|
||||
| macOS Ventura 13.x | x86_64 | `macos-13` | `PHP 8.3` |
|
||||
| macOS Sequoia 15.x | x86_64 | `macos-15-intel` | `PHP 8.5` |
|
||||
|
||||
### Self-Hosted Runners
|
||||
|
||||
@@ -121,9 +120,9 @@ On all supported OS/Platforms, the following PHP versions can be set up as per t
|
||||
| `7.3` | `Stable` | `End of life` | `GitHub-hosted`, `self-hosted` |
|
||||
| `7.4` | `Stable` | `End of life` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.0` | `Stable` | `End of life` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.1` | `Stable` | `Security fixes only` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.1` | `Stable` | `End of life` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.2` | `Stable` | `Security fixes only` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.3` | `Stable` | `Active` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.3` | `Stable` | `Security fixes only` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.4` | `Stable` | `Active` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.5` | `Stable` | `Active` | `GitHub-hosted`, `self-hosted` |
|
||||
| `8.6` | `Nightly` | `In development` | `GitHub-hosted`, `self-hosted` |
|
||||
|
||||
106
__tests__/core.test.ts
Normal file
106
__tests__/core.test.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import * as core from '../src/core';
|
||||
|
||||
describe('Core tests', () => {
|
||||
const originalEnv = process.env;
|
||||
const originalExitCode = process.exitCode;
|
||||
let stdoutOutput: string;
|
||||
const originalWrite = process.stdout.write;
|
||||
|
||||
beforeEach(() => {
|
||||
process.env = {...originalEnv};
|
||||
process.exitCode = undefined;
|
||||
stdoutOutput = '';
|
||||
process.stdout.write = jest.fn((chunk: string | Uint8Array): boolean => {
|
||||
stdoutOutput += chunk.toString();
|
||||
return true;
|
||||
}) as unknown as typeof process.stdout.write;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
process.env = originalEnv;
|
||||
process.exitCode = originalExitCode;
|
||||
process.stdout.write = originalWrite;
|
||||
});
|
||||
|
||||
it('checking issueCommand with no properties', () => {
|
||||
core.issueCommand('warning', {}, 'test message');
|
||||
expect(stdoutOutput).toContain('::warning::test message');
|
||||
});
|
||||
|
||||
it('checking issueCommand with properties', () => {
|
||||
core.issueCommand('error', {file: 'test.ts', line: '10'}, 'error message');
|
||||
expect(stdoutOutput).toContain(
|
||||
'::error file=test.ts,line=10::error message'
|
||||
);
|
||||
});
|
||||
|
||||
it('checking issueCommand escapes special characters in message', () => {
|
||||
core.issueCommand('warning', {}, 'line1\nline2\rline3%percent');
|
||||
expect(stdoutOutput).toContain(
|
||||
'::warning::line1%0Aline2%0Dline3%25percent'
|
||||
);
|
||||
});
|
||||
|
||||
it('checking issueCommand escapes special characters in properties', () => {
|
||||
core.issueCommand('error', {file: 'path:to,file'}, 'message');
|
||||
expect(stdoutOutput).toContain('::error file=path%3Ato%2Cfile::message');
|
||||
});
|
||||
|
||||
it('checking issueCommand with Error object', () => {
|
||||
const error = new Error('test error');
|
||||
core.issueCommand('error', {}, error);
|
||||
expect(stdoutOutput).toContain('::error::Error: test error');
|
||||
});
|
||||
|
||||
it('checking issueCommand filters empty properties', () => {
|
||||
core.issueCommand('warning', {file: 'test.ts', line: ''}, 'message');
|
||||
expect(stdoutOutput).toContain('::warning file=test.ts::message');
|
||||
});
|
||||
|
||||
it('checking error', () => {
|
||||
core.error('error message');
|
||||
expect(stdoutOutput).toContain('::error::error message');
|
||||
});
|
||||
|
||||
it('checking error with Error object', () => {
|
||||
core.error(new Error('error instance'));
|
||||
expect(stdoutOutput).toContain('::error::Error: error instance');
|
||||
});
|
||||
|
||||
it('checking setFailed', () => {
|
||||
core.setFailed('failure message');
|
||||
expect(process.exitCode).toBe(1);
|
||||
expect(stdoutOutput).toContain('::error::failure message');
|
||||
});
|
||||
|
||||
it('checking setFailed with Error object', () => {
|
||||
core.setFailed(new Error('failure error'));
|
||||
expect(process.exitCode).toBe(1);
|
||||
expect(stdoutOutput).toContain('::error::Error: failure error');
|
||||
});
|
||||
|
||||
it('checking getInput returns value', () => {
|
||||
process.env['INPUT_TEST-INPUT'] = 'test value';
|
||||
expect(core.getInput('test-input')).toBe('test value');
|
||||
});
|
||||
|
||||
it('checking getInput trims value', () => {
|
||||
process.env['INPUT_TEST-INPUT'] = ' trimmed ';
|
||||
expect(core.getInput('test-input')).toBe('trimmed');
|
||||
});
|
||||
|
||||
it('checking getInput returns empty string for missing input', () => {
|
||||
expect(core.getInput('missing-input')).toBe('');
|
||||
});
|
||||
|
||||
it('checking getInput throws for required missing input', () => {
|
||||
expect(() => core.getInput('missing-input', true)).toThrow(
|
||||
'Input required and not supplied: missing-input'
|
||||
);
|
||||
});
|
||||
|
||||
it('checking getInput handles spaces in name', () => {
|
||||
process.env['INPUT_INPUT_WITH_SPACES'] = 'spaced value';
|
||||
expect(core.getInput('input with spaces')).toBe('spaced value');
|
||||
});
|
||||
});
|
||||
@@ -131,7 +131,11 @@ describe('Extension tests', () => {
|
||||
)
|
||||
? `add_${ext_name}`
|
||||
: `add_brew_extension ${formula} ${prefix}`;
|
||||
return [formula, formula === 'phalcon3' ? '7.3' : '7.4', output];
|
||||
return [
|
||||
formula,
|
||||
formula.match(/phalcon3|lua|propro/) ? '7.3' : '8.1',
|
||||
output
|
||||
];
|
||||
});
|
||||
|
||||
it.each(data)(
|
||||
|
||||
@@ -19,7 +19,9 @@ it('checking fetch', async () => {
|
||||
Location: host_url + '/pong'
|
||||
})
|
||||
.get('/pong')
|
||||
.reply(200, 'pong');
|
||||
.reply(200, 'pong')
|
||||
.get('/error')
|
||||
.replyWithError('Network failure');
|
||||
|
||||
let response: Record<string, string> = await fetch.fetch(manifest_url);
|
||||
expect(response.error).toBe(undefined);
|
||||
@@ -36,4 +38,8 @@ it('checking fetch', async () => {
|
||||
response = await fetch.fetch(manifest_url, 'invalid_token');
|
||||
expect(response.error).not.toBe(undefined);
|
||||
expect(response.data).toBe(undefined);
|
||||
|
||||
response = await fetch.fetch(host_url + '/error');
|
||||
expect(response.error).toContain('Fetch error:');
|
||||
expect(response.data).toBe(undefined);
|
||||
});
|
||||
|
||||
@@ -1,40 +1,33 @@
|
||||
import * as fs from 'fs';
|
||||
import * as tools from '../src/tools';
|
||||
import {ToolData, ToolInput} from '../src/tools';
|
||||
|
||||
interface IData {
|
||||
tool: string;
|
||||
version?: string;
|
||||
domain?: string;
|
||||
extension?: string;
|
||||
os?: string;
|
||||
php_version?: string;
|
||||
release?: string;
|
||||
repository?: string;
|
||||
scope?: string;
|
||||
type?: string;
|
||||
fetch_latest?: string;
|
||||
version_parameter?: string;
|
||||
version_prefix?: string;
|
||||
}
|
||||
|
||||
function getData(data: IData): Record<string, string> {
|
||||
function getData(data: Partial<ToolData>): ToolData {
|
||||
const tool = data.tool || 'tool';
|
||||
const version = data.version || '';
|
||||
return {
|
||||
tool: data.tool,
|
||||
version: data.version || '',
|
||||
tool,
|
||||
version,
|
||||
url: data.url || '',
|
||||
domain: data.domain || 'https://example.com',
|
||||
extension: data.extension || '.phar',
|
||||
os: data.os || 'linux',
|
||||
php_version: data.php_version || '7.4',
|
||||
release: data.release || [data.tool, data.version].join(':'),
|
||||
release: data.release || [tool, version].join(':'),
|
||||
repository: data.repository || '',
|
||||
scope: data.scope || 'global',
|
||||
type: data.type || 'phar',
|
||||
fetch_latest: data.fetch_latest || 'false',
|
||||
version_parameter: data.version_parameter || '-V',
|
||||
version_prefix: data.version_prefix || '',
|
||||
github: 'https://github.com',
|
||||
prefix: 'releases',
|
||||
verb: 'download'
|
||||
github: data.github || 'https://github.com',
|
||||
prefix: data.prefix || 'releases',
|
||||
verb: data.verb || 'download',
|
||||
packagist: data.packagist || data.repository || '',
|
||||
function: data.function,
|
||||
alias: data.alias,
|
||||
uri: data.uri,
|
||||
error: data.error
|
||||
};
|
||||
}
|
||||
|
||||
@@ -161,6 +154,18 @@ describe('Tools tests', () => {
|
||||
}
|
||||
);
|
||||
|
||||
it('checking getLatestVersion with fetch_latest=true but no repository', async () => {
|
||||
expect(
|
||||
await tools.getLatestVersion(
|
||||
getData({
|
||||
tool: 'tool',
|
||||
repository: '',
|
||||
fetch_latest: 'true'
|
||||
})
|
||||
)
|
||||
).toBe('latest');
|
||||
});
|
||||
|
||||
it.each`
|
||||
version | tool | type | expected
|
||||
${'latest'} | ${'tool'} | ${'phar'} | ${'latest'}
|
||||
@@ -245,13 +250,15 @@ describe('Tools tests', () => {
|
||||
);
|
||||
|
||||
it('checking getUrl handles undefined version without double slash', async () => {
|
||||
const data = getData({
|
||||
tool: 'cs2pr',
|
||||
repository: 'staabm/annotate-pull-request-from-checkstyle',
|
||||
domain: 'https://github.com'
|
||||
});
|
||||
data['extension'] = '';
|
||||
delete data['version'];
|
||||
const data: ToolInput = {
|
||||
...getData({
|
||||
tool: 'cs2pr',
|
||||
repository: 'staabm/annotate-pull-request-from-checkstyle',
|
||||
domain: 'https://github.com'
|
||||
}),
|
||||
version: undefined
|
||||
};
|
||||
data.extension = '';
|
||||
expect(await tools.getUrl(data)).toBe(
|
||||
'https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/download/cs2pr'
|
||||
);
|
||||
@@ -284,9 +291,9 @@ describe('Tools tests', () => {
|
||||
tool: 'tool',
|
||||
version: 'latest',
|
||||
version_parameter: JSON.stringify('-v'),
|
||||
os: os
|
||||
os: os,
|
||||
url: 'https://example.com/tool.phar'
|
||||
});
|
||||
data['url'] = 'https://example.com/tool.phar';
|
||||
expect(await tools.addArchive(data)).toContain(script);
|
||||
});
|
||||
|
||||
@@ -649,14 +656,43 @@ describe('Tools tests', () => {
|
||||
expect(await tools.addTools(tools_csv, '7.4', 'linux')).toContain(script);
|
||||
});
|
||||
|
||||
it.each`
|
||||
tools_csv | token | script
|
||||
${'cs2pr:1.2'} | ${'invalid_token'} | ${'add_log "$cross" "cs2pr" "Invalid token"'}
|
||||
${'phpunit:1.2'} | ${'invalid_token'} | ${'add_log "$cross" "phpunit" "Invalid token"'}
|
||||
${'phpunit:0.1'} | ${'no_data'} | ${'add_log "$cross" "phpunit" "No version found with prefix 0.1."'}
|
||||
`('checking error: $tools_csv', async ({tools_csv, token, script}) => {
|
||||
process.env['GITHUB_TOKEN'] = token;
|
||||
expect(await tools.addTools(tools_csv, '7.4', 'linux')).toContain(script);
|
||||
it('checking error when custom-function tool is missing function field', async () => {
|
||||
const brokenToolsJson = JSON.stringify({
|
||||
composer: {
|
||||
type: 'custom-function',
|
||||
domain: 'https://getcomposer.org',
|
||||
repository: 'composer/composer',
|
||||
function: 'composer'
|
||||
},
|
||||
'broken-tool': {
|
||||
type: 'custom-function'
|
||||
}
|
||||
});
|
||||
|
||||
let result: string = '';
|
||||
await jest.isolateModulesAsync(async () => {
|
||||
jest.doMock('fs', () => ({
|
||||
...jest.requireActual('fs'),
|
||||
readFileSync: (
|
||||
filePath: fs.PathOrFileDescriptor,
|
||||
options?: unknown
|
||||
) => {
|
||||
if (String(filePath).includes('tools.json')) {
|
||||
return brokenToolsJson;
|
||||
}
|
||||
return (jest.requireActual('fs') as typeof fs).readFileSync(
|
||||
filePath,
|
||||
options as fs.ObjectEncodingOptions & {flag?: string}
|
||||
);
|
||||
}
|
||||
}));
|
||||
const isolatedTools = await import('../src/tools');
|
||||
result = await isolatedTools.addTools('broken-tool', '7.4', 'linux');
|
||||
});
|
||||
|
||||
expect(result).toContain(
|
||||
'add_log "$cross" "broken-tool" "broken-tool has no function defined. Please report this issue."'
|
||||
);
|
||||
});
|
||||
|
||||
it.each`
|
||||
|
||||
@@ -3,16 +3,6 @@ import * as path from 'path';
|
||||
import * as utils from '../src/utils';
|
||||
import * as fetchModule from '../src/fetch';
|
||||
|
||||
/**
|
||||
* Mock @actions/core
|
||||
*/
|
||||
jest.mock('@actions/core', () => ({
|
||||
getInput: jest.fn().mockImplementation(key => {
|
||||
return ['setup-php'].indexOf(key) !== -1 ? key : '';
|
||||
}),
|
||||
info: jest.fn()
|
||||
}));
|
||||
|
||||
describe('Utils tests', () => {
|
||||
it('checking readEnv', async () => {
|
||||
process.env['test'] = 'setup-php';
|
||||
@@ -26,12 +16,14 @@ describe('Utils tests', () => {
|
||||
|
||||
it('checking getInput', async () => {
|
||||
process.env['test'] = 'setup-php';
|
||||
process.env['INPUT_SETUP-PHP'] = 'setup-php';
|
||||
expect(await utils.getInput('test', false)).toBe('setup-php');
|
||||
expect(await utils.getInput('setup-php', false)).toBe('setup-php');
|
||||
expect(await utils.getInput('DoesNotExist', false)).toBe('');
|
||||
await expect(async () => {
|
||||
await utils.getInput('DoesNotExist', true);
|
||||
}).rejects.toThrow('Input required and not supplied: DoesNotExist');
|
||||
delete process.env['INPUT_SETUP-PHP'];
|
||||
});
|
||||
|
||||
it('checking getManifestURL', async () => {
|
||||
@@ -181,9 +173,9 @@ describe('Utils tests', () => {
|
||||
});
|
||||
|
||||
it('checking suppressOutput', async () => {
|
||||
expect(await utils.suppressOutput('win32')).toEqual(' ');
|
||||
expect(await utils.suppressOutput('linux')).toEqual(' ');
|
||||
expect(await utils.suppressOutput('darwin')).toEqual(' ');
|
||||
expect(await utils.suppressOutput('win32')).toEqual(' >$null 2>&1');
|
||||
expect(await utils.suppressOutput('linux')).toEqual(' >/dev/null 2>&1');
|
||||
expect(await utils.suppressOutput('darwin')).toEqual(' >/dev/null 2>&1');
|
||||
expect(await utils.suppressOutput('openbsd')).toContain(
|
||||
'Platform openbsd is not supported'
|
||||
);
|
||||
|
||||
@@ -34,5 +34,5 @@ outputs:
|
||||
php-version:
|
||||
description: 'PHP version in semver format'
|
||||
runs:
|
||||
using: 'node20'
|
||||
using: 'node24'
|
||||
main: 'dist/index.js'
|
||||
|
||||
4
dist/index.js
vendored
4
dist/index.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,39 +1,22 @@
|
||||
import {fixupConfigRules, fixupPluginRules} from '@eslint/compat';
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
||||
import importPlugin from 'eslint-plugin-import';
|
||||
import jest from 'eslint-plugin-jest';
|
||||
import prettierRecommended from 'eslint-plugin-prettier/recommended';
|
||||
import eslintConfigPrettier from 'eslint-config-prettier';
|
||||
import globals from 'globals';
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
import tsParser from '@typescript-eslint/parser';
|
||||
import path from 'node:path';
|
||||
import {fileURLToPath} from 'node:url';
|
||||
import js from '@eslint/js';
|
||||
import {FlatCompat} from '@eslint/eslintrc';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
const compat = new FlatCompat({
|
||||
baseDirectory: __dirname,
|
||||
recommendedConfig: js.configs.recommended,
|
||||
allConfig: js.configs.all
|
||||
});
|
||||
|
||||
export default [
|
||||
...fixupConfigRules(
|
||||
compat.extends(
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:import/errors',
|
||||
'plugin:import/warnings',
|
||||
'plugin:import/typescript',
|
||||
'plugin:prettier/recommended',
|
||||
'prettier'
|
||||
)
|
||||
),
|
||||
js.configs.recommended,
|
||||
...typescriptEslint.configs['flat/recommended'],
|
||||
importPlugin.flatConfigs.errors,
|
||||
importPlugin.flatConfigs.warnings,
|
||||
importPlugin.flatConfigs.typescript,
|
||||
prettierRecommended,
|
||||
eslintConfigPrettier,
|
||||
{
|
||||
plugins: {
|
||||
'@typescript-eslint': fixupPluginRules(typescriptEslint),
|
||||
jest
|
||||
},
|
||||
|
||||
@@ -46,6 +29,21 @@ export default [
|
||||
parser: tsParser,
|
||||
ecmaVersion: 2021,
|
||||
sourceType: 'module'
|
||||
},
|
||||
|
||||
settings: {
|
||||
'import/resolver': {
|
||||
typescript: {
|
||||
alwaysTryTypes: true,
|
||||
project: './tsconfig.json'
|
||||
},
|
||||
node: {
|
||||
extensions: ['.js', '.ts']
|
||||
}
|
||||
},
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts']
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
674
package-lock.json
generated
674
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -34,36 +34,36 @@
|
||||
"author": "shivammathur",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.11.1",
|
||||
"@actions/exec": "^1.1.1",
|
||||
"@actions/io": "^2.0.0",
|
||||
"@actions/exec": "^2.0.0",
|
||||
"compare-versions": "^6.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/compat": "^2.0.0",
|
||||
"@eslint/js": "9.39.1",
|
||||
"@eslint/compat": "^2.0.2",
|
||||
"@eslint/js": "^9.39.1",
|
||||
"@types/jest": "^30.0.0",
|
||||
"@types/node": "^24.10.1",
|
||||
"@typescript-eslint/eslint-plugin": "^8.48.0",
|
||||
"@typescript-eslint/parser": "^8.48.0",
|
||||
"@types/node": "^25.2.2",
|
||||
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
||||
"@typescript-eslint/parser": "^8.54.0",
|
||||
"@vercel/ncc": "^0.38.4",
|
||||
"eslint": "9.39.1",
|
||||
"eslint": "^9.39.1",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-import-resolver-typescript": "^4.4.4",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-jest": "^29.2.1",
|
||||
"eslint-plugin-prettier": "^5.5.4",
|
||||
"globals": "^16.5.0",
|
||||
"eslint-plugin-jest": "^29.12.2",
|
||||
"eslint-plugin-prettier": "^5.5.5",
|
||||
"globals": "^17.3.0",
|
||||
"jest": "^30.2.0",
|
||||
"jest-circus": "^30.2.0",
|
||||
"nock": "^14.0.10",
|
||||
"prettier": "^3.6.2",
|
||||
"prettier": "^3.8.1",
|
||||
"simple-git-hooks": "^2.13.1",
|
||||
"ts-jest": "^29.4.5",
|
||||
"ts-jest": "^29.4.6",
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"overrides": {
|
||||
"test-exclude": "^7.0.1",
|
||||
"glob": "^11.1.0"
|
||||
"glob": "^11.1.0",
|
||||
"minimatch": "^10.2.1"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/shivammathur/setup-php/issues"
|
||||
|
||||
@@ -17,7 +17,7 @@ export async function addINIValuesUnix(
|
||||
return (
|
||||
'echo "' +
|
||||
ini_values.join('\n') +
|
||||
'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" ' +
|
||||
'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1' +
|
||||
script
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,29 +1,40 @@
|
||||
amqp=amqp
|
||||
apcu=apcu
|
||||
ast=ast
|
||||
brotli=brotli
|
||||
couchbase=couchbase
|
||||
ds=ds
|
||||
event=event
|
||||
excimer=excimer
|
||||
expect=expect
|
||||
gearman=gearman
|
||||
gmagick=gmagick
|
||||
gnupg=gnupg
|
||||
grpc=grpc
|
||||
igbinary=igbinary
|
||||
imagick=imagick
|
||||
imap=imap
|
||||
interbase=interbase
|
||||
lua=lua
|
||||
mailparse=mailparse
|
||||
maxminddb=maxminddb
|
||||
mcrypt=mcrypt
|
||||
memcache=memcache
|
||||
memcached=memcached
|
||||
mongodb=mongodb
|
||||
mongodb1=mongodb1
|
||||
msgpack=msgpack
|
||||
newrelic=newrelic
|
||||
oauth=oauth
|
||||
opentelemetry=opentelemetry
|
||||
pcov=pcov
|
||||
pdo_firebird=pdo_firebird
|
||||
pdo_sqlsrv=pdo_sqlsrv
|
||||
pecl_http=http
|
||||
phalcon3=phalcon
|
||||
phalcon4=phalcon
|
||||
phalcon5=phalcon
|
||||
pinba=pinba
|
||||
propro=propro
|
||||
protobuf=protobuf
|
||||
psr=psr
|
||||
@@ -31,16 +42,24 @@ raphf=raphf
|
||||
rdkafka=rdkafka
|
||||
phpredis=redis
|
||||
redis=redis
|
||||
seaslog=seaslog
|
||||
scalar_objects=scalar_objects
|
||||
snmp=snmp
|
||||
sqlsrv=sqlsrv
|
||||
spx=spx
|
||||
ssh2=ssh2
|
||||
swoole=swoole
|
||||
swow=swow
|
||||
uopz=uopz
|
||||
uploadprogress=uploadprogress
|
||||
uuid=uuid
|
||||
v8js=v8js
|
||||
vips=vips
|
||||
vld=vld
|
||||
xdebug=xdebug
|
||||
xdebug2=xdebug
|
||||
xhprof=xhprof
|
||||
xlswriter=xlswriter
|
||||
yaml=yaml
|
||||
zmq=zmq
|
||||
zstd=zstd
|
||||
|
||||
112
src/core.ts
Normal file
112
src/core.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
import {EOL} from 'os';
|
||||
|
||||
/**
|
||||
* Commands
|
||||
*
|
||||
* Command Format:
|
||||
* ::name key=value,key=value::message
|
||||
*
|
||||
* @see https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
|
||||
*/
|
||||
|
||||
interface CommandProperties {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitizes the message for use in a workflow command.
|
||||
* @param message
|
||||
*/
|
||||
function toCommandValue(message: string | Error): string {
|
||||
if (message instanceof Error) {
|
||||
return message.toString();
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escapes data for safe use in workflow command messages.
|
||||
* @param s
|
||||
*/
|
||||
function escapeData(s: string | Error): string {
|
||||
return toCommandValue(s)
|
||||
.replace(/%/g, '%25')
|
||||
.replace(/\r/g, '%0D')
|
||||
.replace(/\n/g, '%0A');
|
||||
}
|
||||
|
||||
/**
|
||||
* Escapes property values for safe use in workflow command properties.
|
||||
* @param s
|
||||
*/
|
||||
function escapeProperty(s: string): string {
|
||||
return s
|
||||
.replace(/%/g, '%25')
|
||||
.replace(/\r/g, '%0D')
|
||||
.replace(/\n/g, '%0A')
|
||||
.replace(/:/g, '%3A')
|
||||
.replace(/,/g, '%2C');
|
||||
}
|
||||
|
||||
/**
|
||||
* Issues a command to the GitHub Actions runner.
|
||||
*
|
||||
* @param command - The command name to issue
|
||||
* @param properties - Additional properties for the command (key-value pairs)
|
||||
* @param message - The message to include with the command
|
||||
*/
|
||||
export function issueCommand(
|
||||
command: string,
|
||||
properties: CommandProperties,
|
||||
message: string | Error
|
||||
): void {
|
||||
let cmdStr = `::${command}`;
|
||||
|
||||
if (properties && Object.keys(properties).length > 0) {
|
||||
cmdStr += ' ';
|
||||
const props = Object.entries(properties)
|
||||
.filter(([, val]) => val)
|
||||
.map(([key, val]) => `${key}=${escapeProperty(val)}`)
|
||||
.join(',');
|
||||
cmdStr += props;
|
||||
}
|
||||
|
||||
cmdStr += `::${escapeData(message)}`;
|
||||
process.stdout.write(cmdStr + EOL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an error issue.
|
||||
* @param message - error issue message
|
||||
*/
|
||||
export function error(message: string | Error): void {
|
||||
issueCommand('error', {}, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the action status to failed.
|
||||
* When the action exits it will be with an exit code of 1.
|
||||
* @param message - add error issue message
|
||||
*/
|
||||
export function setFailed(message: string | Error): void {
|
||||
process.exitCode = 1;
|
||||
error(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of an input.
|
||||
* The value is trimmed.
|
||||
* Returns an empty string if the value is not defined.
|
||||
*
|
||||
* @param name - name of the input to get
|
||||
* @param required - whether the input is required
|
||||
* @returns string
|
||||
*/
|
||||
export function getInput(name: string, required = false): string {
|
||||
const val: string =
|
||||
process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
|
||||
if (required && !val) {
|
||||
throw new Error(`Input required and not supplied: ${name}`);
|
||||
}
|
||||
return val.trim();
|
||||
}
|
||||
@@ -85,13 +85,14 @@ export async function addExtensionDarwin(
|
||||
add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
|
||||
return;
|
||||
// match brew extensions
|
||||
case /(?<!5\.[3-5])(amqp|apcu|expect|gnupg|grpc|igbinary|imagick|imap|mailparse|mcrypt|memcache|memcached|mongodb|msgpack|protobuf|psr|raphf|rdkafka|redis|snmp|ssh2|swoole|uuid|vld|xdebug|xdebug2|yaml|zmq)/.test(
|
||||
case /(?<!5\.[3-5])(amqp|apcu|brotli|excimer|expect|gmagick|gnupg|grpc|igbinary|imagick|imap|interbase|mailparse|maxminddb|mcrypt|memcache|memcached|mongodb|mongodb1|msgpack|newrelic|oauth|opentelemetry|pdo_firebird|pinba|protobuf|psr|raphf|rdkafka|redis|scalar_objects|seaslog|snmp|spx|ssh2|swoole|uopz|uploadprogress|uuid|vld|xdebug|xdebug2|xhprof|yaml|zmq|zstd)/.test(
|
||||
version_extension
|
||||
):
|
||||
case /(?<!5\.[3-6])(ds|v8js)/.test(version_extension):
|
||||
case /(5\.6|7\.[0-4])(propro|lua)/.test(version_extension):
|
||||
case /(?<!5\.[3-6]|7\.0)pcov/.test(version_extension):
|
||||
case /(?<!5\.[3-6])(ast|vips|xlswriter)/.test(version_extension):
|
||||
case /^(8\.[0-5])swow$/.test(version_extension):
|
||||
add_script += await utils.joins(
|
||||
'\nadd_brew_extension',
|
||||
ext_name,
|
||||
|
||||
70
src/fetch.ts
70
src/fetch.ts
@@ -1,9 +1,10 @@
|
||||
import {IncomingMessage, OutgoingHttpHeaders} from 'http';
|
||||
import * as https from 'https';
|
||||
import * as url from 'url';
|
||||
/**
|
||||
* Redirect status codes set for O(1) lookup
|
||||
*/
|
||||
const REDIRECT_CODES = new Set([301, 302, 303, 307, 308]);
|
||||
|
||||
/**
|
||||
* Function to fetch a URL
|
||||
* Function to fetch a URL using native fetch API (Node 24+)
|
||||
*
|
||||
* @param input_url
|
||||
* @param auth_token
|
||||
@@ -14,43 +15,28 @@ export async function fetch(
|
||||
auth_token?: string,
|
||||
redirect_count = 5
|
||||
): Promise<Record<string, string>> {
|
||||
const fetch_promise: Promise<Record<string, string>> = new Promise(
|
||||
resolve => {
|
||||
const url_object: url.UrlObject = new url.URL(input_url);
|
||||
const headers: OutgoingHttpHeaders = {
|
||||
'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
|
||||
};
|
||||
if (auth_token) {
|
||||
headers.authorization = 'Bearer ' + auth_token;
|
||||
}
|
||||
const options: https.RequestOptions = {
|
||||
hostname: url_object.hostname,
|
||||
path: url_object.pathname,
|
||||
headers: headers,
|
||||
agent: new https.Agent({keepAlive: false})
|
||||
};
|
||||
const req = https.get(options, (res: IncomingMessage) => {
|
||||
if (res.statusCode === 200) {
|
||||
let body = '';
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', chunk => (body += chunk));
|
||||
res.on('end', () => resolve({data: `${body}`}));
|
||||
} else if (
|
||||
[301, 302, 303, 307, 308].includes(res.statusCode as number)
|
||||
) {
|
||||
if (redirect_count > 0 && res.headers.location) {
|
||||
fetch(res.headers.location, auth_token, redirect_count--).then(
|
||||
resolve
|
||||
);
|
||||
} else {
|
||||
resolve({error: `${res.statusCode}: Redirect error`});
|
||||
}
|
||||
} else {
|
||||
resolve({error: `${res.statusCode}: ${res.statusMessage}`});
|
||||
}
|
||||
});
|
||||
req.end();
|
||||
const headers: Record<string, string> = {
|
||||
'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
|
||||
};
|
||||
if (auth_token) {
|
||||
headers['Authorization'] = 'Bearer ' + auth_token;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await globalThis.fetch(input_url, {
|
||||
headers,
|
||||
redirect: redirect_count > 0 ? 'follow' : 'manual'
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const data = await response.text();
|
||||
return {data};
|
||||
} else if (REDIRECT_CODES.has(response.status) && redirect_count <= 0) {
|
||||
return {error: `${response.status}: Redirect error`};
|
||||
} else {
|
||||
return {error: `${response.status}: ${response.statusText}`};
|
||||
}
|
||||
);
|
||||
return await fetch_promise;
|
||||
} catch (error) {
|
||||
return {error: `Fetch error: ${(error as Error).message}`};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import {exec} from '@actions/exec';
|
||||
import * as core from '@actions/core';
|
||||
import * as config from './config';
|
||||
import * as core from './core';
|
||||
import * as coverage from './coverage';
|
||||
import * as extensions from './extensions';
|
||||
import * as tools from './tools';
|
||||
|
||||
@@ -13,9 +13,9 @@ handle_dependency_extensions() {
|
||||
suffix="$(get_php_formula_suffix)"
|
||||
if [[ -n "$suffix" ]]; then
|
||||
brew_opts=(-sf)
|
||||
patch_abstract_file
|
||||
patch_abstract_file >/dev/null 2>&1
|
||||
for dependency_extension in "${dependency_extensions[@]}"; do
|
||||
brew install "${brew_opts[@]}" "$ext_tap/$dependency_extension@$version" && copy_brew_extensions "$dependency_extension"
|
||||
safe_brew install "${brew_opts[@]}" "$ext_tap/$dependency_extension@$version" >/dev/null 2>&1 && copy_brew_extensions "$dependency_extension"
|
||||
done
|
||||
fi
|
||||
}
|
||||
@@ -31,7 +31,7 @@ disable_extension_helper() {
|
||||
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
|
||||
sudo rm -rf "$scan_dir"/*"$extension"* /tmp/php"$version"_extensions
|
||||
mkdir -p /tmp/extdisabled/"$version"
|
||||
echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension"
|
||||
echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to get extension name from brew formula.
|
||||
@@ -81,9 +81,9 @@ add_brew_extension() {
|
||||
add_brew_tap "$php_tap"
|
||||
add_brew_tap "$ext_tap"
|
||||
formula="$(get_renamed_formula "$formula")"
|
||||
update_dependencies
|
||||
handle_dependency_extensions "$formula" "$extension"
|
||||
(brew install "${brew_opts[@]}" "$ext_tap/$formula@$version" && copy_brew_extensions "$formula") || pecl_install "$extension"
|
||||
update_dependencies >/dev/null 2>&1
|
||||
handle_dependency_extensions "$formula" "$extension" >/dev/null 2>&1
|
||||
(safe_brew install "${brew_opts[@]}" "$ext_tap/$formula@$version" >/dev/null 2>&1 && copy_brew_extensions "$formula") || pecl_install "$extension" >/dev/null 2>&1
|
||||
add_extension_log "$extension" "Installed and enabled"
|
||||
fi
|
||||
}
|
||||
@@ -92,7 +92,7 @@ add_brew_extension() {
|
||||
patch_abstract_file() {
|
||||
abstract_path="$tap_dir"/"$ext_tap"/Abstract/abstract-php-extension.rb
|
||||
if [[ -e "$abstract_path" && ! -e /tmp/abstract_patch ]]; then
|
||||
echo '' | sudo tee /tmp/abstract_patch
|
||||
echo '' | sudo tee /tmp/abstract_patch >/dev/null 2>&1
|
||||
sudo sed -i '' -e "s|php@#{\(.*\)}|php@#{\1}$suffix|g" -e "s|php_version /|\"#{php_version}$suffix\" /|g" "$abstract_path"
|
||||
fi
|
||||
}
|
||||
@@ -102,9 +102,9 @@ add_extension_helper() {
|
||||
local extension=$1
|
||||
prefix=$2
|
||||
if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
|
||||
run_script "php5-darwin" "${version/./}" "$extension"
|
||||
run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
|
||||
else
|
||||
pecl_install "$extension" &&
|
||||
pecl_install "$extension" >/dev/null 2>&1 &&
|
||||
if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
|
||||
fi
|
||||
add_extension_log "$extension" "Installed and enabled"
|
||||
@@ -118,8 +118,8 @@ add_devtools() {
|
||||
|
||||
# Function to handle request to add PECL.
|
||||
add_pecl() {
|
||||
enable_extension xml extension
|
||||
configure_pecl
|
||||
enable_extension xml extension >/dev/null 2>&1
|
||||
configure_pecl >/dev/null 2>&1
|
||||
pear_version=$(get_tool_version "pecl" "version")
|
||||
add_log "${tick:?}" "PECL" "Found PECL $pear_version"
|
||||
}
|
||||
@@ -151,7 +151,7 @@ update_dependencies() {
|
||||
git_retry -C "$repo" fetch origin main && git -C "$repo" reset --hard origin/main
|
||||
fi
|
||||
done
|
||||
echo '' | sudo tee /tmp/update_dependencies
|
||||
echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -181,14 +181,14 @@ add_php() {
|
||||
fi
|
||||
if [[ "$existing_version" != "false" && -z "$suffix" ]]; then
|
||||
if [ "$action" = "upgrade" ]; then
|
||||
brew install --only-dependencies "$php_formula"
|
||||
brew upgrade -f --overwrite "$php_formula"
|
||||
safe_brew install --only-dependencies "$php_formula"
|
||||
safe_brew upgrade -f --overwrite "$php_formula"
|
||||
else
|
||||
brew unlink "$php_keg"
|
||||
fi
|
||||
else
|
||||
brew install --only-dependencies "$php_formula"
|
||||
brew install -f --overwrite "$php_formula" 2>/dev/null || brew upgrade -f --overwrite "$php_formula"
|
||||
safe_brew install --only-dependencies "$php_formula"
|
||||
safe_brew install -f --overwrite "$php_formula" 2>/dev/null || safe_brew upgrade -f --overwrite "$php_formula"
|
||||
fi
|
||||
brew link --force --overwrite "$php_keg" || (sudo chown -R "$(id -un)":"$(id -gn)" "$brew_prefix" && brew link --force --overwrite "$php_keg")
|
||||
}
|
||||
@@ -217,7 +217,7 @@ add_php_config() {
|
||||
if [[ "$ini" = "production" || "$ini" = "development" ]]; then
|
||||
sudo cp "$ini_dir"/php.ini-"$ini" "$ini_dir"/php.ini
|
||||
elif [ "$ini" = "none" ]; then
|
||||
echo '' | sudo tee "${ini_file[@]}"
|
||||
echo '' | sudo tee "${ini_file[@]}" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ get_scan_dir() {
|
||||
|
||||
# Function to handle self-hosted runner setup.
|
||||
self_hosted_helper() {
|
||||
sudo mkdir -p /opt/hostedtoolcache || true
|
||||
sudo mkdir -p /opt/hostedtoolcache >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
# Function to Setup PHP.
|
||||
@@ -244,15 +244,15 @@ setup_php() {
|
||||
existing_version=$(get_brewed_php)
|
||||
status="Found"
|
||||
if [[ "$version" =~ ${old_versions:?} ]]; then
|
||||
run_script "php5-darwin" "${version/./}"
|
||||
run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
|
||||
status="Installed"
|
||||
elif [ "${existing_version:0:3}" != "$version" ]; then
|
||||
add_php "install" "$existing_version"
|
||||
add_php "install" "$existing_version" >/dev/null 2>&1
|
||||
status="Installed"
|
||||
elif [[ "${existing_version:0:3}" = "$version" && "${update:?}" = "true" ]]; then
|
||||
brew_php_version="$(brew info --json "php@$version" 2>/dev/null | jq -r '.[].versions.stable')"
|
||||
if [ "$brew_php_version" != "$existing_version" ]; then
|
||||
add_php "upgrade" "$existing_version"
|
||||
add_php "upgrade" "$existing_version" >/dev/null 2>&1
|
||||
status="Upgraded"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -50,7 +50,7 @@ enable_extension() {
|
||||
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
|
||||
enable_extension_dependencies "$1" "$2"
|
||||
enable_cache_extension_dependencies "$1" "$2"
|
||||
if ! [[ "${version:?}" =~ ${old_versions:?} ]] && command -v phpenmod ; then
|
||||
if ! [[ "${version:?}" =~ ${old_versions:?} ]] && command -v phpenmod >/dev/null 2>&1; then
|
||||
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?\"?$/d" "$pecl_file"
|
||||
mod="${ini_dir:?}"/../mods-available/"$1".ini
|
||||
if ! [ -e "$mod" ]; then
|
||||
@@ -59,7 +59,7 @@ enable_extension() {
|
||||
[ -n "$mod_priority_line" ] && priority=$(echo "$mod_priority_line" | cut -d'=' -f 2)
|
||||
(echo "; priority=$priority"; echo "$2=${ext_dir:?}/$1.so") | sudo tee "$mod" >/dev/null
|
||||
fi
|
||||
sudo phpenmod -v "$version" "$1"
|
||||
sudo phpenmod -v "$version" "$1" >/dev/null 2>&1
|
||||
else
|
||||
echo "$2=${ext_dir:?}/$1.so" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
|
||||
fi
|
||||
@@ -71,7 +71,7 @@ enable_extensions() {
|
||||
local extensions=("$@")
|
||||
to_wait=()
|
||||
for ext in "${extensions[@]}"; do
|
||||
enable_extension "$ext" extension &
|
||||
enable_extension "$ext" extension >/dev/null 2>&1 &
|
||||
to_wait+=($!)
|
||||
done
|
||||
wait "${to_wait[@]}"
|
||||
@@ -79,7 +79,7 @@ enable_extensions() {
|
||||
|
||||
# Function to get a map of extensions and their dependent shared extensions.
|
||||
get_extension_map() {
|
||||
php -d'error_reporting=0' "${src:?}"/scripts/extensions/extension_map.php /tmp/map"$version".orig
|
||||
php -d'error_reporting=0' "${src:?}"/scripts/extensions/extension_map.php /tmp/map"$version".orig >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to enable extension dependencies which are also extensions.
|
||||
@@ -125,7 +125,7 @@ disable_extension() {
|
||||
disable_all_shared() {
|
||||
get_extension_map
|
||||
sudo sed -i.orig -E -e "/^(zend_)?extension\s*=/d" "${ini_file[@]}" "$pecl_file" 2>/dev/null || true
|
||||
sudo find "${ini_dir:-$scan_dir}"/.. -name "*.ini" -not -path "*php.ini" -not -path "*phar.ini" -not -path "*pecl.ini" -not -path "*mods-available*" -delete || true
|
||||
sudo find "${ini_dir:-$scan_dir}"/.. -name "*.ini" -not -path "*php.ini" -not -path "*phar.ini" -not -path "*pecl.ini" -not -path "*mods-available*" -delete >/dev/null 2>&1 || true
|
||||
mkdir -p /tmp/extdisabled/"$version"
|
||||
sudo rm -f /tmp/php"$version"_extensions
|
||||
sudo find "$ext_dir" -name '*.so' -print0 | xargs -0 -n 1 basename -s .so | xargs -I{} touch /tmp/extdisabled/"$version"/{}
|
||||
@@ -139,7 +139,7 @@ configure_pecl() {
|
||||
for script in pear pecl; do
|
||||
sudo "$script" channel-update "$script".php.net
|
||||
done
|
||||
echo '' | sudo tee /tmp/pecl_config
|
||||
echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -177,8 +177,8 @@ get_pecl_version() {
|
||||
pecl_install() {
|
||||
local extension=$1
|
||||
local prefix=${2:-extension}
|
||||
add_pecl
|
||||
disable_extension_helper "${extension%-*}"
|
||||
add_pecl >/dev/null 2>&1
|
||||
disable_extension_helper "${extension%-*}" >/dev/null 2>&1
|
||||
# Compare version with 8.3 so it runs only on 8.4 and above
|
||||
# Install using the source interface as it allows for patching.
|
||||
if [[ $(printf "%s\n%s" "${version:?}" "8.3" | sort -V | head -n1) != "$version" ]]; then
|
||||
@@ -191,11 +191,11 @@ pecl_install() {
|
||||
prefix_opts="$(parse_args "$extension" CONFIGURE_PREFIX_OPTS) MAKEFLAGS='-j $cpu_count'"
|
||||
suffix_opts="$(parse_args "$extension" CONFIGURE_OPTS) $(parse_args "$extension" CONFIGURE_SUFFIX_OPTS)"
|
||||
IFS=' ' read -r -a libraries <<<"$(parse_args "$extension" LIBS) $(parse_args "$extension" "$(uname -s)"_LIBS)"
|
||||
(( ${#libraries[@]} )) && add_libs "${libraries[@]}"
|
||||
(( ${#libraries[@]} )) && add_libs "${libraries[@]}" >/dev/null 2>&1
|
||||
if [ "$version" = "5.3" ]; then
|
||||
yes '' 2>/dev/null | sudo "$prefix_opts" pecl install -f "$extension"
|
||||
yes '' 2>/dev/null | sudo "$prefix_opts" pecl install -f "$extension" >/dev/null 2>&1
|
||||
else
|
||||
yes '' 2>/dev/null | sudo "$prefix_opts" pecl install -f -D "$(parse_pecl_configure_options "$suffix_opts")" "$extension"
|
||||
yes '' 2>/dev/null | sudo "$prefix_opts" pecl install -f -D "$(parse_pecl_configure_options "$suffix_opts")" "$extension" >/dev/null 2>&1
|
||||
fi
|
||||
local exit_code=$?
|
||||
sudo pecl info "$extension" | grep -iq 'zend extension' && prefix=zend_extension
|
||||
@@ -218,7 +218,7 @@ add_pecl_extension() {
|
||||
add_log "${tick:?}" "$extension" "Enabled"
|
||||
else
|
||||
[ -n "$pecl_version" ] && pecl_version="-$pecl_version"
|
||||
pecl_install "$extension$pecl_version" || ( [ "${fail_fast:?}" = "false" ] && add_extension "$extension" "$(get_extension_prefix "$extension")" )
|
||||
pecl_install "$extension$pecl_version" || ( [ "${fail_fast:?}" = "false" ] && add_extension "$extension" "$(get_extension_prefix "$extension")" >/dev/null 2>&1)
|
||||
extension_version="$(php -r "echo phpversion('$extension');")"
|
||||
[ -n "$extension_version" ] && extension_version="-$extension_version"
|
||||
add_extension_log "$extension$extension_version" "Installed and enabled"
|
||||
|
||||
@@ -19,11 +19,11 @@ add_blackfire() {
|
||||
extension_version=$(get -s -n "" https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)
|
||||
fi
|
||||
fi
|
||||
get -q -n "${ext_dir:?}/blackfire.so" https://packages.blackfire.io/binaries/blackfire-php/"$extension_version"/blackfire-php-"$platform"_"$arch_name"-php-"$no_dot_version".so
|
||||
get -q -n "${ext_dir:?}/blackfire.so" https://packages.blackfire.io/binaries/blackfire-php/"$extension_version"/blackfire-php-"$platform"_"$arch_name"-php-"$no_dot_version".so >/dev/null 2>&1
|
||||
fi
|
||||
if [ -e "${ext_dir:?}/blackfire.so" ]; then
|
||||
disable_extension xdebug
|
||||
disable_extension pcov
|
||||
disable_extension xdebug >/dev/null 2>&1
|
||||
disable_extension pcov >/dev/null 2>&1
|
||||
enable_extension blackfire extension
|
||||
add_extension_log blackfire "$status"
|
||||
else
|
||||
|
||||
@@ -59,9 +59,9 @@ add_couchbase() {
|
||||
ext=$(get_couchbase_version)
|
||||
fi
|
||||
if [[ "$ext" =~ couchbase-[2-3].+ ]]; then
|
||||
add_couchbase_clibs "$ext"
|
||||
add_couchbase_clibs "$ext" >/dev/null 2>&1
|
||||
else
|
||||
add_couchbase_cxxlibs
|
||||
add_couchbase_cxxlibs >/dev/null 2>&1
|
||||
fi
|
||||
enable_extension "couchbase" "extension"
|
||||
if check_extension "couchbase"; then
|
||||
@@ -72,9 +72,9 @@ add_couchbase() {
|
||||
n_proc="$(nproc)"
|
||||
export COUCHBASE_SUFFIX_OPTS="CMAKE_BUILD_TYPE=Release"
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL="$n_proc"
|
||||
add_extension_from_source couchbase https://pecl.php.net couchbase couchbase "${ext##*-}" extension pecl
|
||||
add_extension_from_source couchbase https://pecl.php.net couchbase couchbase "${ext##*-}" extension pecl >/dev/null 2>&1
|
||||
else
|
||||
pecl_install "${ext}"
|
||||
pecl_install "${ext}" >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log "couchbase" "Installed and enabled"
|
||||
fi
|
||||
|
||||
@@ -42,7 +42,7 @@ add_cubrid_helper() {
|
||||
add_cubrid() {
|
||||
ext=$1
|
||||
status='Enabled'
|
||||
add_cubrid_helper "$ext"
|
||||
add_cubrid_helper "$ext" >/dev/null 2>&1
|
||||
add_extension_log "$ext" "$status"
|
||||
check_extension "$ext" && add_license_log
|
||||
}
|
||||
|
||||
@@ -39,9 +39,9 @@ add_event() {
|
||||
add_log "${tick:?}" "event" "Enabled"
|
||||
else
|
||||
if ! [[ "${version:?}" =~ ${old_versions:?} ]] && [ "$os" = "Darwin" ]; then
|
||||
add_brew_extension event extension
|
||||
add_brew_extension event extension >/dev/null 2>&1
|
||||
else
|
||||
add_event_helper "$ext"
|
||||
add_event_helper "$ext" >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log "event" "Installed and enabled"
|
||||
fi
|
||||
|
||||
@@ -1,17 +1,3 @@
|
||||
add_firebird_client_darwin() {
|
||||
firebird_tag='v5.0.0'
|
||||
arch_name='x64'
|
||||
arch="$(uname -m)"
|
||||
[[ "$arch" = "arm64" || "$arch" = "aarch64" ]] && arch_name='arm64'
|
||||
pkg_name=$(get -s -n "" https://api.github.com/repos/FirebirdSQL/firebird/releases/tags/"$firebird_tag" | grep -Eo "Firebird-.*.-$arch_name.pkg" | head -n 1)
|
||||
[ -z "$pkg_name" ] && pkg_name=$(get -s -n "" https://github.com/FirebirdSQL/firebird/releases/expanded_assets/"$firebird_tag" | grep -Eo "Firebird-.*.-$arch_name.pkg" | head -n 1)
|
||||
get -q -e "/tmp/firebird.pkg" https://github.com/FirebirdSQL/firebird/releases/download/"$firebird_tag"/"$pkg_name"
|
||||
sudo installer -pkg /tmp/firebird.pkg -target /
|
||||
sudo mkdir -p /opt/firebird/include /opt/firebird/lib
|
||||
sudo cp -a /Library/Frameworks/Firebird.framework/Headers/* /opt/firebird/include/
|
||||
sudo find /Library/Frameworks/Firebird.framework -name '*.dylib' -exec cp "{}" /opt/firebird/lib \;
|
||||
}
|
||||
|
||||
add_firebird_helper() {
|
||||
firebird_dir=$1
|
||||
tag="$(php_src_tag)"
|
||||
@@ -23,22 +9,19 @@ add_firebird_helper() {
|
||||
}
|
||||
|
||||
add_firebird() {
|
||||
if [ "$(uname -s )" = "Darwin" ]; then
|
||||
add_firebird_client_darwin
|
||||
fi
|
||||
enable_extension pdo_firebird extension
|
||||
status="Enabled"
|
||||
if ! check_extension pdo_firebird; then
|
||||
status="Installed and enabled"
|
||||
if check_extension pdo_firebird; then
|
||||
add_log "${tick:?}" pdo_firebird Enabled
|
||||
else
|
||||
if [ "$(uname -s)" = "Linux" ]; then
|
||||
if [[ "${version:?}" =~ 5.3|${nightly_versions:?} ]]; then
|
||||
add_firebird_helper /usr
|
||||
if [[ "${version:?}" =~ 5.3|${php_builder_versions:?} ]]; then
|
||||
add_firebird_helper /usr >/dev/null 2>&1
|
||||
else
|
||||
add_pdo_extension firebird
|
||||
add_pdo_extension firebird >/dev/null 2>&1
|
||||
fi
|
||||
else
|
||||
add_firebird_helper /opt/firebird
|
||||
add_brew_extension pdo_firebird extension >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log pdo_firebird "Installed and enabled"
|
||||
fi
|
||||
add_extension_log pdo_firebird "$status"
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ add_gearman_helper() {
|
||||
add_gearman() {
|
||||
status="Enabled"
|
||||
if [ "$(uname -s)" = 'Linux' ]; then
|
||||
add_gearman_helper
|
||||
add_gearman_helper >/dev/null 2>&1
|
||||
add_extension_log "gearman" "$status"
|
||||
else
|
||||
add_brew_extension gearman extension
|
||||
|
||||
@@ -11,7 +11,7 @@ add_geos() {
|
||||
if check_extension "geos"; then
|
||||
add_log "${tick:?}" "geos" "Enabled"
|
||||
else
|
||||
add_geos_helper
|
||||
add_geos_helper >/dev/null 2>&1
|
||||
add_extension_log "geos" "Installed and enabled"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -40,12 +40,12 @@ Function Repair-ICU() {
|
||||
}
|
||||
|
||||
Function Add-Http() {
|
||||
Add-Extension iconv
|
||||
Add-Extension raphf
|
||||
Add-Extension iconv >$null 2>&1
|
||||
Add-Extension raphf >$null 2>&1
|
||||
if($version -lt '8.0') {
|
||||
Add-Extension propro
|
||||
Add-Extension propro >$null 2>&1
|
||||
}
|
||||
Add-Extension pecl_http
|
||||
Add-Extension pecl_http >$null 2>&1
|
||||
Repair-ICU
|
||||
Add-ExtensionLog http "Installed and enabled"
|
||||
}
|
||||
@@ -61,7 +61,7 @@ add_http_helper() {
|
||||
export HTTP_CONFIGURE_OPTS="$http_configure_opts"
|
||||
export HTTP_LINUX_LIBS="zlib1g libbrotli-dev libcurl4-openssl-dev libevent-dev libicu-dev libidn2-dev"
|
||||
export HTTP_DARWIN_LIBS="brotli curl icu4c libevent libidn2"
|
||||
if [[ "${version:?}" =~ ${nightly_versions:?} ]]; then
|
||||
if ! [[ ${version:?} =~ 5.[3-6]|7.[0-4] ]]; then
|
||||
add_extension_from_source http https://github.com m6w6 ext-http master extension
|
||||
else
|
||||
add_extension_from_source pecl_http https://pecl.php.net http http "${ext##*-}" extension pecl
|
||||
@@ -75,7 +75,7 @@ add_http_latest() {
|
||||
if [ "$os" = "Linux" ]; then
|
||||
add_http_dependencies
|
||||
package="php$version-http"
|
||||
add_ppa ondrej/php || update_ppa ondrej/php
|
||||
add_ppa ondrej/php >/dev/null 2>&1 || update_ppa ondrej/php
|
||||
(check_package "$package" && install_packages "$package") || add_http_helper "$(get_http_version)" "$os"
|
||||
else
|
||||
if ! [[ "${version:?}" =~ ${old_versions:?} ]]; then
|
||||
@@ -103,9 +103,9 @@ add_http() {
|
||||
ext=$1
|
||||
status="Enabled"
|
||||
if [[ "$ext" =~ ^(pecl_http|http)$ ]]; then
|
||||
add_http_latest
|
||||
add_http_latest >/dev/null 2>&1
|
||||
else
|
||||
add_http_version "$ext"
|
||||
add_http_version "$ext" >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log "http" "$status"
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ add_cli_driver() {
|
||||
else
|
||||
libs='/usr/local/lib'
|
||||
sudo mkdir -p "$libs"
|
||||
sudo ln -sf "$ibm_cli"/lib/*.dylib "$libs" || true
|
||||
sudo ln -sf "$ibm_cli"/lib/*.dylib "$libs" >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -93,11 +93,11 @@ add_ibm() {
|
||||
status='Enabled'
|
||||
ibm_home='/opt/ibm'
|
||||
ibm_cli=$ibm_home/clidriver
|
||||
if ! add_cli_driver ; then
|
||||
if ! add_cli_driver >/dev/null 2>&1; then
|
||||
add_log "${cross:?}" "$ext" "IBM Db2 CLI driver is not available on $(uname -s)/$(uname -m)"
|
||||
return 1
|
||||
fi
|
||||
add_ibm_helper
|
||||
add_ibm_helper >/dev/null 2>&1
|
||||
add_extension_log "$ext" "$status"
|
||||
check_extension "$ext" && add_license_log
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ add_intl() {
|
||||
add_log "${cross:?}" "intl" "ICU $icu is not supported for PHP $version"
|
||||
else
|
||||
[ "${ts:?}" = 'zts' ] && suffix='-zts'
|
||||
install_icu "$icu"
|
||||
install_icu "$icu" >/dev/null 2>&1
|
||||
get -q -n "${ext_dir:?}/intl.so" "https://github.com/shivammathur/icu-intl/releases/download/intl-$icu/php${version:?}-intl-$icu$suffix$arch_suffix.so"
|
||||
enable_extension intl extension
|
||||
add_extension_log intl "Installed and enabled with ICU $icu"
|
||||
|
||||
@@ -24,10 +24,10 @@ add_ioncube() {
|
||||
if [ -e "$loader_file" ]; then
|
||||
sudo mv /tmp/ioncube/ioncube_loader_"${os_suffix%%_*}_${version:?}$ts_part".so "${ext_dir:?}/ioncube.so"
|
||||
sudo cp /tmp/ioncube/LICENSE.txt "$ext_dir"/IONCUBE_LICENSE.txt
|
||||
echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini"
|
||||
echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini" >/dev/null 2>&1
|
||||
fi
|
||||
else
|
||||
echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini"
|
||||
echo "zend_extension=$ext_dir/ioncube.so" | sudo tee "${scan_dir:?}/00-ioncube.ini" >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log "ioncube" "$status"
|
||||
check_extension "ioncube" && add_license_log
|
||||
|
||||
@@ -71,7 +71,7 @@ Function Add-Oci() {
|
||||
}
|
||||
} else {
|
||||
$status = 'Installed and enabled'
|
||||
Add-Extension $extension
|
||||
Add-Extension $extension >$null 2>&1
|
||||
}
|
||||
Add-ExtensionLog $extension $status
|
||||
Add-LicenseLog
|
||||
|
||||
@@ -72,8 +72,8 @@ add_oci() {
|
||||
oracle_home='/opt/oracle'
|
||||
oracle_client=$oracle_home/instantclient
|
||||
os=$(uname -s)
|
||||
add_client
|
||||
add_oci_helper
|
||||
add_client >/dev/null 2>&1
|
||||
add_oci_helper >/dev/null 2>&1
|
||||
add_extension_log "$ext" "$status"
|
||||
check_extension "$ext" && add_license_log
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ add_phalcon_helper() {
|
||||
add_brew_extension "$extension" extension
|
||||
else
|
||||
package="php${version:?}-$extension"
|
||||
add_ppa ondrej/php || update_ppa ondrej/php
|
||||
add_ppa ondrej/php >/dev/null 2>&1 || update_ppa ondrej/php
|
||||
[[ "$extension" =~ phalcon[4|5] ]] && (install_packages "php${version:?}-psr" || pecl_install psr || pecl_install psr-1.1.0)
|
||||
(check_package "$package" && install_packages "$package") || pecl_install phalcon-"$(get_phalcon_version)" || add_phalcon_from_repo
|
||||
fi
|
||||
@@ -94,7 +94,7 @@ add_phalcon() {
|
||||
[ "$extension" = "phalcon" ] && extension=phalcon5
|
||||
extension_major_version=${extension: -1}
|
||||
if [[ "$extension_major_version" =~ [3-5] ]]; then
|
||||
add_phalcon"$extension_major_version"
|
||||
add_phalcon"$extension_major_version" >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log "phalcon" "$status"
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ get_openssl_suffix() {
|
||||
change_library_paths() {
|
||||
if [ "$os" = "Darwin" ]; then
|
||||
otool -L "${ext_dir:?}"/relay.so | grep -q 'ssl.1' && openssl_version='1.1' || openssl_version='3'
|
||||
[ -e "${brew_prefix:?}"/opt/openssl@"$openssl_version" ] || brew install openssl@"$openssl_version"
|
||||
[ -e "${brew_prefix:?}"/opt/openssl@"$openssl_version" ] || safe_brew install openssl@"$openssl_version"
|
||||
dylibs="$(otool -L "${ext_dir:?}"/relay.so | grep -Eo '.*\.dylib' | cut -f1 -d ' ')"
|
||||
install_name_tool -change "$(echo "${dylibs}" | grep -E "libzstd.*dylib" | xargs)" "$brew_prefix"/opt/zstd/lib/libzstd.dylib "$ext_dir"/relay.so
|
||||
install_name_tool -change "$(echo "${dylibs}" | grep -E "liblz4.*dylib" | xargs)" "$brew_prefix"/opt/lz4/lib/liblz4.dylib "$ext_dir"/relay.so
|
||||
@@ -54,7 +54,7 @@ add_relay_dependencies() {
|
||||
if [ "$os" = "Darwin" ]; then
|
||||
. "${0%/*}"/tools/brew.sh
|
||||
configure_brew
|
||||
brew install lz4 hiredis zstd concurrencykit
|
||||
safe_brew install lz4 hiredis zstd concurrencykit
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -142,14 +142,14 @@ add_relay() {
|
||||
error="Relay extension is not available for macOS x86_64 architecture"
|
||||
else
|
||||
relay_version=$(get_relay_version "$ext")
|
||||
add_relay_dependencies
|
||||
add_relay_dependencies >/dev/null 2>&1
|
||||
if shared_extension relay; then
|
||||
message="Enabled"
|
||||
else
|
||||
add_relay_helper "$arch"
|
||||
add_relay_helper "$arch" >/dev/null 2>&1
|
||||
message="Installed and enabled ${relay_version}"
|
||||
fi
|
||||
configure_relay
|
||||
configure_relay >/dev/null 2>&1
|
||||
fi
|
||||
add_extension_log relay "$message" "$error"
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ check_lib() {
|
||||
add_linux_libs() {
|
||||
local lib=$1
|
||||
if ! check_lib "$lib"; then
|
||||
install_packages "$lib" || true
|
||||
install_packages "$lib" >/dev/null 2>&1 || true
|
||||
fi
|
||||
add_lib_log "$lib"
|
||||
}
|
||||
@@ -60,9 +60,9 @@ add_linux_libs() {
|
||||
add_darwin_libs() {
|
||||
local lib=$1
|
||||
if ! check_lib "$lib"; then
|
||||
brew install "$lib" || true
|
||||
safe_brew install "$lib" >/dev/null 2>&1 || true
|
||||
if [[ "$lib" = *@* ]]; then
|
||||
brew link --overwrite --force "$lib" || true
|
||||
brew link --overwrite --force "$lib" >/dev/null 2>&1 || true
|
||||
fi
|
||||
fi
|
||||
add_lib_log "$lib"
|
||||
@@ -97,7 +97,7 @@ get_libraries() {
|
||||
run_group() {
|
||||
local command=$1
|
||||
local log=$2
|
||||
echo "$command" | sudo tee ./run_group.sh
|
||||
echo "$command" | sudo tee ./run_group.sh >/dev/null 2>&1
|
||||
echo "$GROUP$log"
|
||||
. ./run_group.sh
|
||||
local status=$?
|
||||
@@ -161,7 +161,7 @@ add_extension_from_source() {
|
||||
sub_dir="$(parse_args "$extension" PATH)"
|
||||
step_log "Setup $slug"
|
||||
(
|
||||
add_devtools phpize
|
||||
add_devtools phpize >/dev/null 2>&1
|
||||
disable_extension_helper "$extension"
|
||||
fetch_extension "$extension" "$fetch"
|
||||
if ! [ "$(find . -maxdepth 1 -name '*.m4' -exec grep -H 'PHP_NEW_EXTENSION' {} \; | wc -l)" != "0" ]; then
|
||||
@@ -169,7 +169,7 @@ add_extension_from_source() {
|
||||
else
|
||||
[[ -n "${libraries// }" ]] && run_group "add_libs $libraries" "add libraries"
|
||||
[ "${debug:?}" = "debug" ] && suffix_opts="$suffix_opts --enable-debug"
|
||||
patch_extension "$extension"
|
||||
patch_extension "$extension" >/dev/null 2>&1
|
||||
run_group "phpize" "phpize" && \
|
||||
run_group "sudo $prefix_opts ./configure $suffix_opts $opts" "configure" && \
|
||||
run_group "sudo $prefix_opts make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)" "make" && \
|
||||
|
||||
@@ -9,6 +9,8 @@ Function Get-SqlsrvReleaseVersion() {
|
||||
return '5.10.1'
|
||||
} elseif ($version -eq '8.0') {
|
||||
return '5.11.1'
|
||||
} elseif ($version -match '8.[1-2]') {
|
||||
return '5.12.0'
|
||||
} else {
|
||||
return 'latest'
|
||||
}
|
||||
@@ -67,10 +69,10 @@ Function Add-Sqlsrv() {
|
||||
Add-ExtensionFromGithub $extension > $null 2>&1
|
||||
} catch {}
|
||||
if (-not(Test-Extension $extension)) {
|
||||
Add-SqlsrvFromMSGithub $extension
|
||||
Add-SqlsrvFromMSGithub $extension >$null 2>&1
|
||||
}
|
||||
if (-not(Test-Extension $extension)) {
|
||||
Add-Extension $extension
|
||||
Add-Extension $extension >$null 2>&1
|
||||
}
|
||||
$status = 'Installed and enabled'
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ get_sqlsrv_version() {
|
||||
echo '5.10.1'
|
||||
elif [[ "${version:?}" =~ 8.0 ]]; then
|
||||
echo '5.11.1'
|
||||
elif [[ "${version:?}" =~ 8.[1-2] ]]; then
|
||||
echo '5.12.0'
|
||||
else
|
||||
# Return an empty string so that pecl will install the latest version.
|
||||
echo ''
|
||||
|
||||
@@ -77,7 +77,7 @@ Function Add-ZephirParser() {
|
||||
try {
|
||||
Add-ZephirParserFromGitHub $extension
|
||||
} catch {
|
||||
Add-Extension $extension
|
||||
Add-Extension $extension >$null 2>&1
|
||||
}
|
||||
}
|
||||
Add-ExtensionLog zephir_parser $status
|
||||
|
||||
@@ -33,7 +33,7 @@ add_zephir_parser() {
|
||||
zp_releases=https://github.com/"$repo"/releases
|
||||
if ! shared_extension zephir_parser; then
|
||||
message='Installed and enabled'
|
||||
add_zephir_parser_helper "$ext"
|
||||
add_zephir_parser_helper "$ext" >/dev/null 2>&1
|
||||
else
|
||||
message='Enabled'
|
||||
enable_extension zephir_parser extension
|
||||
|
||||
@@ -20,23 +20,23 @@ self_hosted_helper() {
|
||||
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
|
||||
trap "sudo rm -f /usr/bin/apt-fast 2>/dev/null" exit
|
||||
fi
|
||||
sudo mkdir -p /opt/hostedtoolcache || true
|
||||
sudo mkdir -p /opt/hostedtoolcache >/dev/null 2>&1 || true
|
||||
install_packages apt-transport-https ca-certificates curl file make jq unzip autoconf automake gcc g++ gnupg
|
||||
}
|
||||
|
||||
# Function to fix broken packages.
|
||||
fix_broken_packages() {
|
||||
sudo apt --fix-broken install
|
||||
sudo apt --fix-broken install >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to install a package
|
||||
install_packages() {
|
||||
packages=("$@")
|
||||
if ! [ -e /etc/dpkg/dpkg.cfg.d/force-confnew ]; then
|
||||
echo "force-confnew" | sudo tee /etc/dpkg/dpkg.cfg.d/force-confnew
|
||||
echo "force-confnew" | sudo tee /etc/dpkg/dpkg.cfg.d/force-confnew >/dev/null 2>&1
|
||||
trap "sudo rm -f /etc/dpkg/dpkg.cfg.d/force-confnew 2>/dev/null" exit
|
||||
fi
|
||||
$apt_install "${packages[@]}" || (update_lists && fix_broken_packages && $apt_install "${packages[@]}" )
|
||||
$apt_install "${packages[@]}" >/dev/null 2>&1 || (update_lists && fix_broken_packages && $apt_install "${packages[@]}" >/dev/null 2>&1)
|
||||
}
|
||||
|
||||
# Function to disable an extension.
|
||||
@@ -48,10 +48,10 @@ disable_extension_helper() {
|
||||
disable_extension_dependents "$extension"
|
||||
fi
|
||||
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?\"?$/d" "${ini_file[@]}" "$pecl_file"
|
||||
sudo find "$ini_dir"/.. -name "*-$extension.ini" -not -path "*phar.ini" -not -path "*pecl.ini" -not -path "*mods-available*" -delete || true
|
||||
sudo find "$ini_dir"/.. -name "*-$extension.ini" -not -path "*phar.ini" -not -path "*pecl.ini" -not -path "*mods-available*" -delete >/dev/null 2>&1 || true
|
||||
sudo rm -f /tmp/php"$version"_extensions
|
||||
mkdir -p /tmp/extdisabled/"$version"
|
||||
echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension"
|
||||
echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to add PDO extension.
|
||||
@@ -64,7 +64,7 @@ add_pdo_extension() {
|
||||
ext_name=$1
|
||||
if shared_extension pdo; then
|
||||
disable_extension_helper pdo
|
||||
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}"
|
||||
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1
|
||||
fi
|
||||
if [ "$ext" = "mysql" ]; then
|
||||
enable_extension "mysqlnd" "extension"
|
||||
@@ -72,15 +72,15 @@ add_pdo_extension() {
|
||||
elif [ "$ext" = "dblib" ]; then
|
||||
ext_name="sybase"
|
||||
elif [ "$ext" = "firebird" ]; then
|
||||
install_packages libfbclient2
|
||||
install_packages libfbclient2 >/dev/null 2>&1
|
||||
enable_extension "pdo_firebird" "extension"
|
||||
ext_name="interbase"
|
||||
elif [ "$ext" = "sqlite" ]; then
|
||||
ext="sqlite3"
|
||||
ext_name="sqlite3"
|
||||
fi
|
||||
add_extension "$ext_name" "extension"
|
||||
add_extension "$pdo_ext" "extension"
|
||||
add_extension "$ext_name" "extension" >/dev/null 2>&1
|
||||
add_extension "$pdo_ext" "extension" >/dev/null 2>&1
|
||||
add_extension_log "$pdo_ext" "Enabled"
|
||||
fi
|
||||
}
|
||||
@@ -94,7 +94,7 @@ check_package() {
|
||||
add_extension_helper() {
|
||||
local extension=$1
|
||||
packages=(php"$version"-"$extension")
|
||||
add_ppa ondrej/php || update_ppa ondrej/php
|
||||
add_ppa ondrej/php >/dev/null 2>&1 || update_ppa ondrej/php
|
||||
[ "${debug:?}" = "debug" ] && check_package php"$version"-"$extension"-dbgsym && packages+=(php"$version"-"$extension"-dbgsym)
|
||||
(check_package "${packages[0]}" && install_packages "${packages[@]}") || pecl_install "$extension"
|
||||
add_extension_log "$extension" "Installed and enabled"
|
||||
@@ -108,7 +108,7 @@ add_devtools() {
|
||||
install_packages "php$version-dev"
|
||||
fi
|
||||
switch_version "phpize" "php-config"
|
||||
add_extension xml extension
|
||||
add_extension xml extension >/dev/null 2>&1
|
||||
add_log "${tick:?}" "$tool" "Added $tool $semver"
|
||||
}
|
||||
|
||||
@@ -129,11 +129,11 @@ setup_cached_versions() {
|
||||
|
||||
# Function to add PECL.
|
||||
add_pecl() {
|
||||
add_devtools phpize
|
||||
add_devtools phpize >/dev/null 2>&1
|
||||
if ! command -v pecl >/dev/null; then
|
||||
install_packages php-pear
|
||||
fi
|
||||
configure_pecl
|
||||
configure_pecl >/dev/null 2>&1
|
||||
pear_version=$(get_tool_version "pecl" "version")
|
||||
add_log "${tick:?}" "PECL" "Added PECL $pear_version"
|
||||
}
|
||||
@@ -167,7 +167,7 @@ get_php_packages() {
|
||||
|
||||
# Function to install packaged PHP
|
||||
add_packaged_php() {
|
||||
add_ppa ondrej/php || update_ppa ondrej/php
|
||||
add_ppa ondrej/php >/dev/null 2>&1 || update_ppa ondrej/php
|
||||
IFS=' ' read -r -a packages <<<"$(get_php_packages)"
|
||||
install_packages "${packages[@]}"
|
||||
}
|
||||
@@ -187,11 +187,11 @@ update_php() {
|
||||
# Function to install PHP.
|
||||
add_php() {
|
||||
if [ "${runner:?}" = "self-hosted" ] || [ "${use_package_cache:-true}" = "false" ]; then
|
||||
if [[ "$version" =~ ${nightly_versions:?} || "$ts" = "zts" ]]; then
|
||||
if [[ "$version" =~ ${php_builder_versions:?} || "$ts" = "zts" ]]; then
|
||||
setup_php_builder
|
||||
else
|
||||
add_packaged_php
|
||||
switch_version
|
||||
switch_version >/dev/null 2>&1
|
||||
add_pecl
|
||||
fi
|
||||
elif [[ "$version" =~ ${old_versions:?} ]]; then
|
||||
@@ -204,7 +204,7 @@ add_php() {
|
||||
|
||||
# Function to ini file for pear and link it to each SAPI.
|
||||
link_pecl_file() {
|
||||
echo '' | sudo tee "$pecl_file"
|
||||
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
|
||||
for file in "${ini_file[@]}"; do
|
||||
sapi_scan_dir="$(realpath -m "$(dirname "$file")")/conf.d"
|
||||
if [ "$sapi_scan_dir" != "$scan_dir" ] && ! [ -h "$sapi_scan_dir" ]; then
|
||||
@@ -237,9 +237,9 @@ add_php_config() {
|
||||
elif [ "$ini" = "development" ]; then
|
||||
echo "${ini_file[@]}" | xargs -n 1 -P 6 sudo cp "$php_lib_dir"/php.ini-development
|
||||
elif [ "$ini" = "none" ]; then
|
||||
echo '' | sudo tee "${ini_file[@]}"
|
||||
echo '' | sudo tee "${ini_file[@]}" >/dev/null 2>&1
|
||||
fi
|
||||
echo "$ini" | sudo tee "$current_ini"
|
||||
echo "$ini" | sudo tee "$current_ini" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to Setup PHP
|
||||
@@ -250,13 +250,13 @@ setup_php() {
|
||||
check_pre_installed
|
||||
if [[ -z "$php_config" ]] || [ "$(php_semver | cut -c 1-3)" != "$version" ]; then
|
||||
if [ ! -e "/usr/bin/php$version" ] || [ ! -e "/usr/bin/php-config$version" ]; then
|
||||
add_php
|
||||
add_php >/dev/null 2>&1
|
||||
else
|
||||
if ! [[ "$version" =~ ${old_versions:?} ]]; then
|
||||
switch_version
|
||||
switch_version >/dev/null 2>&1
|
||||
fi
|
||||
if [ "${update:?}" = "true" ]; then
|
||||
update_php
|
||||
update_php >/dev/null 2>&1
|
||||
else
|
||||
status="Switched to"
|
||||
fi
|
||||
@@ -264,7 +264,7 @@ setup_php() {
|
||||
php_config="$(command -v php-config)"
|
||||
else
|
||||
if [ "$update" = "true" ]; then
|
||||
update_php
|
||||
update_php >/dev/null 2>&1
|
||||
else
|
||||
status="Found"
|
||||
fi
|
||||
@@ -284,7 +284,7 @@ setup_php() {
|
||||
link_pecl_file
|
||||
configure_php
|
||||
set_output "php-version" "$semver"
|
||||
sudo rm -rf /usr/local/bin/phpunit
|
||||
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
|
||||
sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}"
|
||||
sudo cp "$src"/configs/pm/*.json "$RUNNER_TOOL_CACHE/"
|
||||
add_log "${tick:?}" "PHP" "$status PHP $semver$extra_version"
|
||||
@@ -298,8 +298,8 @@ debconf_fix="DEBIAN_FRONTEND=noninteractive"
|
||||
apt_install="sudo $debconf_fix apt-fast install -y --no-install-recommends"
|
||||
scripts="$src"/scripts
|
||||
|
||||
add_sudo
|
||||
link_apt_fast
|
||||
add_sudo >/dev/null 2>&1
|
||||
link_apt_fast >/dev/null 2>&1
|
||||
|
||||
. /etc/os-release
|
||||
# shellcheck source=.
|
||||
|
||||
@@ -158,12 +158,7 @@ Function Add-ToolsHelper() {
|
||||
} elseif($tool -eq "cs2pr") {
|
||||
(Get-Content $bin_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $bin_dir/cs2pr
|
||||
} elseif($tool -eq "deployer") {
|
||||
if(Test-Path $composer_bin\deployer.phar.bat) {
|
||||
Copy-Item $composer_bin\deployer.phar.bat -Destination $composer_bin\dep.bat
|
||||
}
|
||||
if(Test-Path $composer_bin\dep.bat) {
|
||||
Copy-Item $composer_bin\dep.bat -Destination $composer_bin\deployer.bat
|
||||
}
|
||||
Copy-Item $bin_dir\deployer.bat -Destination $bin_dir\dep.bat
|
||||
} elseif($tool -eq "phan") {
|
||||
$extensions += @('fileinfo', 'ast')
|
||||
} elseif($tool -eq "phinx") {
|
||||
@@ -176,7 +171,7 @@ Function Add-ToolsHelper() {
|
||||
$extensions += @('json', 'tokenizer')
|
||||
} elseif($tool -eq "phpDocumentor") {
|
||||
$extensions+=('ctype', 'hash', 'json', 'fileinfo', 'iconv', 'mbstring', 'simplexml', 'xml')
|
||||
Add-Extension fileinfo
|
||||
Add-Extension fileinfo >$null 2>&1
|
||||
Copy-Item $bin_dir\phpDocumentor.bat -Destination $bin_dir\phpdoc.bat
|
||||
} elseif($tool -eq "phpunit") {
|
||||
$extensions += @('dom', 'json', 'libxml', 'mbstring', 'xml', 'xmlwriter')
|
||||
@@ -189,7 +184,7 @@ Function Add-ToolsHelper() {
|
||||
Copy-Item $bin_dir\wp-cli.bat -Destination $bin_dir\wp.bat
|
||||
}
|
||||
foreach($extension in $extensions) {
|
||||
Add-Extension $extension
|
||||
Add-Extension $extension >$null 2>&1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,30 +200,48 @@ Function Add-Tool() {
|
||||
[Parameter(Position = 2, Mandatory = $false)]
|
||||
$ver_param
|
||||
)
|
||||
if (Test-Path $bin_dir\$tool) {
|
||||
Copy-Item $bin_dir\$tool -Destination $bin_dir\$tool.old -Force
|
||||
}
|
||||
$urls = $urls -split ','
|
||||
$tool_path = "$bin_dir\$tool"
|
||||
foreach ($url in $urls){
|
||||
if (($url | Split-Path -Extension) -eq ".exe") {
|
||||
$tool_path = "$tool_path.exe"
|
||||
}
|
||||
try {
|
||||
$status_code = (Invoke-WebRequest -Passthru -Uri $url -OutFile $tool_path).StatusCode
|
||||
} catch {
|
||||
if($url -match '.*github.com.*releases.*latest.*') {
|
||||
try {
|
||||
$url = $url.replace("releases/latest/download", "releases/download/" + ([regex]::match((Get-File -Url ($url.split('/release')[0] + "/releases")).Content, "([0-9]+\.[0-9]+\.[0-9]+)/" + ($url.Substring($url.LastIndexOf("/") + 1))).Groups[0].Value).split('/')[0])
|
||||
$status_code = (Invoke-WebRequest -Passthru -Uri $url -OutFile $tool_path).StatusCode
|
||||
} catch { }
|
||||
$is_exe = ((($urls[0] | Split-Path -Extension).ToLowerInvariant()) -eq '.exe')
|
||||
if ($is_exe) { $tool_path = "$tool_path.exe" }
|
||||
$tool_ext = if ($is_exe) { '.exe' } else { '' }
|
||||
$url_stream = [System.IO.MemoryStream]::New([System.Text.Encoding]::UTF8.GetBytes($urls[0]))
|
||||
$cache_key = (Get-FileHash -InputStream $url_stream -Algorithm SHA256).Hash.Substring(0, 16)
|
||||
$cache_path = "$env:TEMP\$tool-$cache_key$tool_ext"
|
||||
$status_code = 200
|
||||
if (Test-Path $cache_path -PathType Leaf) {
|
||||
Copy-Item $cache_path -Destination $tool_path -Force
|
||||
} else {
|
||||
$backup_path = "$tool_path.bak"
|
||||
if (Test-Path $tool_path) { Copy-Item $tool_path -Destination $backup_path -Force }
|
||||
foreach ($url in $urls){
|
||||
try {
|
||||
$status_code = (Invoke-WebRequest -Passthru -Uri $url -OutFile $tool_path).StatusCode
|
||||
} catch {
|
||||
if($url -match '.*github.com.*releases.*latest.*') {
|
||||
try {
|
||||
$url = $url.replace("releases/latest/download", "releases/download/" + ([regex]::match((Get-File -Url ($url.split('/release')[0] + "/releases")).Content, "([0-9]+\.[0-9]+\.[0-9]+)/" + ($url.Substring($url.LastIndexOf("/") + 1))).Groups[0].Value).split('/')[0])
|
||||
$status_code = (Invoke-WebRequest -Passthru -Uri $url -OutFile $tool_path).StatusCode
|
||||
} catch {
|
||||
$status_code = 0
|
||||
}
|
||||
} else {
|
||||
$status_code = 0
|
||||
}
|
||||
}
|
||||
if($status_code -eq 200 -and (Test-Path $tool_path)) {
|
||||
Copy-Item $tool_path -Destination $cache_path -Force
|
||||
break
|
||||
}
|
||||
}
|
||||
if($status_code -eq 200 -and (Test-Path $tool_path)) {
|
||||
break
|
||||
if ($status_code -ne 200 -and (Test-Path $backup_path)) {
|
||||
Copy-Item $backup_path -Destination $tool_path -Force
|
||||
}
|
||||
Remove-Item $backup_path -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
if (((Get-ChildItem -Path $bin_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) {
|
||||
$escaped_tool = [regex]::Escape($tool)
|
||||
if (((Get-ChildItem -Path $bin_dir/* | Where-Object Name -Match "^$escaped_tool(\.exe|\.phar)?$").Count -gt 0)) {
|
||||
$bat_content = @()
|
||||
$bat_content += "@ECHO off"
|
||||
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
|
||||
@@ -236,14 +249,12 @@ Function Add-Tool() {
|
||||
$bat_content += "php %BIN_TARGET% %*"
|
||||
Set-Content -Path $bin_dir\$tool.bat -Value $bat_content
|
||||
Add-ToolsHelper $tool
|
||||
Add-ToProfile $current_profile $tool "New-Alias $tool $bin_dir\$tool.bat"
|
||||
Add-ToProfile $current_profile $tool "New-Alias $tool $bin_dir\$tool.bat" >$null 2>&1
|
||||
$tool_version = Get-ToolVersion $tool $ver_param
|
||||
Add-Log $tick $tool "Added $tool $tool_version"
|
||||
} else {
|
||||
if($tool -eq "composer") {
|
||||
$env:fail_fast = 'true'
|
||||
} elseif (Test-Path $bin_dir\$tool.old) {
|
||||
Copy-Item $bin_dir\$tool.old -Destination $bin_dir\$tool -Force
|
||||
}
|
||||
Add-Log $cross $tool "Could not add $tool"
|
||||
}
|
||||
@@ -276,9 +287,9 @@ Function Add-ComposerToolHelper() {
|
||||
Remove-Item -Path $composer_lock -Force
|
||||
}
|
||||
if((composer global show $prefix$tool $tool_version -a 2>&1 | findstr '^type *: *composer-plugin') -and ($composer_args -ne '')) {
|
||||
composer global config --no-plugins allow-plugins."$prefix$tool" true
|
||||
composer global config --no-plugins allow-plugins."$prefix$tool" true >$null 2>&1
|
||||
}
|
||||
composer global require $prefix$release $composer_args
|
||||
composer global require $prefix$release $composer_args >$null 2>&1
|
||||
return composer global show $prefix$tool 2>&1 | findstr '^versions'
|
||||
} else {
|
||||
$release_stream = [System.IO.MemoryStream]::New([System.Text.Encoding]::ASCII.GetBytes($release))
|
||||
@@ -289,9 +300,9 @@ Function Add-ComposerToolHelper() {
|
||||
New-Item -ItemType Directory -Force -Path $scoped_dir > $null 2>&1
|
||||
Set-Content -Path $scoped_dir\composer.json -Value "{}"
|
||||
if((composer show $prefix$tool $tool_version -d $unix_scoped_dir -a 2>&1 | findstr '^type *: *composer-plugin') -and ($composer_args -ne '')) {
|
||||
composer config -d $unix_scoped_dir --no-plugins allow-plugins."$prefix$tool" true
|
||||
composer config -d $unix_scoped_dir --no-plugins allow-plugins."$prefix$tool" true >$null 2>&1
|
||||
}
|
||||
composer require $prefix$release -d $unix_scoped_dir $composer_args
|
||||
composer require $prefix$release -d $unix_scoped_dir $composer_args >$null 2>&1
|
||||
}
|
||||
[System.Environment]::SetEnvironmentVariable(($tool.replace('-', '_') + '_bin'), "$scoped_dir\vendor\bin")
|
||||
Add-Path $scoped_dir\vendor\bin
|
||||
|
||||
@@ -67,7 +67,7 @@ update_auth_json() {
|
||||
|
||||
# Function to check if public GitHub token authentication is possible.
|
||||
can_access_public_github() {
|
||||
curl --fail -s -H "Authorization: token $1" 'https://api.github.com/'
|
||||
curl --fail -s -H "Authorization: token $1" 'https://api.github.com/' >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to setup authentication in composer.
|
||||
@@ -108,7 +108,7 @@ set_composer_env() {
|
||||
add_env_path "$composer_env"
|
||||
if [ -n "$COMPOSER_ALLOW_PLUGINS" ]; then
|
||||
echo "$COMPOSER_ALLOW_PLUGINS" | tr ',' '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$' | while IFS= read -r plugin; do
|
||||
composer global config --no-plugins "allow-plugins.$plugin" true
|
||||
composer global config --no-plugins "allow-plugins.$plugin" true >/dev/null 2>&1
|
||||
done
|
||||
fi
|
||||
}
|
||||
@@ -123,19 +123,15 @@ add_tools_helper() {
|
||||
extensions+=(iconv mbstring phar sodium)
|
||||
elif [ "$tool" = "codeception" ]; then
|
||||
extensions+=(json mbstring)
|
||||
sudo ln -s "$scoped_dir"/vendor/bin/codecept "$scoped_dir"/vendor/bin/codeception
|
||||
sudo ln -s "$scoped_dir"/vendor/bin/codecept "$scoped_dir"/vendor/bin/codeception 2>/dev/null || true
|
||||
elif [ "$tool" = "composer" ]; then
|
||||
configure_composer "$tool_path"
|
||||
elif [ "$tool" = "cs2pr" ]; then
|
||||
sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path" 2>/dev/null ||
|
||||
sudo sed -i '' 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
|
||||
elif [ "$tool" = "deployer" ]; then
|
||||
if [ -e "$composer_bin"/deployer.phar ]; then
|
||||
sudo ln -s "$composer_bin"/deployer.phar "$composer_bin"/dep
|
||||
fi
|
||||
if [ -e "$composer_bin"/dep ]; then
|
||||
sudo ln -s "$composer_bin"/dep "$composer_bin"/deployer
|
||||
fi
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/deployer 2>/dev/null || true
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/dep 2>/dev/null || true
|
||||
elif [ "$tool" = "phan" ]; then
|
||||
extensions+=(fileinfo ast)
|
||||
elif [ "$tool" = "phinx" ]; then
|
||||
@@ -151,7 +147,7 @@ add_tools_helper() {
|
||||
elif [ "$tool" = "phpDocumentor" ]; then
|
||||
extensions+=(ctype hash json fileinfo iconv mbstring simplexml xml)
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/phpdocumentor 2>/dev/null || true
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/phpdoc
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/phpdoc 2>/dev/null || true
|
||||
elif [ "$tool" = "phpunit" ]; then
|
||||
extensions+=(dom json libxml mbstring xml xmlwriter)
|
||||
elif [ "$tool" = "phpunit-bridge" ]; then
|
||||
@@ -162,12 +158,12 @@ add_tools_helper() {
|
||||
fi
|
||||
elif [ "$tool" = "vapor-cli" ]; then
|
||||
extensions+=(fileinfo json mbstring zip simplexml)
|
||||
sudo ln -s "$scoped_dir"/vendor/bin/vapor "$scoped_dir"/vendor/bin/vapor-cli
|
||||
sudo ln -s "$scoped_dir"/vendor/bin/vapor "$scoped_dir"/vendor/bin/vapor-cli 2>/dev/null || true
|
||||
elif [ "$tool" = wp-cli ]; then
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/"${tool%-*}"
|
||||
sudo ln -s "$tool_path" "$tool_path_dir"/"${tool%-*}" 2>/dev/null || true
|
||||
fi
|
||||
for extension in "${extensions[@]}"; do
|
||||
add_extension "$extension" extension
|
||||
add_extension "$extension" extension >/dev/null 2>&1
|
||||
done
|
||||
}
|
||||
|
||||
@@ -180,25 +176,39 @@ add_tool() {
|
||||
if ! [ -d "$tool_path_dir" ]; then
|
||||
sudo mkdir -p "$tool_path_dir"
|
||||
fi
|
||||
add_path "$tool_path_dir"
|
||||
if [ -e "$tool_path" ]; then
|
||||
sudo cp -aL "$tool_path" /tmp/"$tool"
|
||||
if ! [ -d "$tool_cache_path_dir" ]; then
|
||||
sudo mkdir -p "$tool_cache_path_dir"
|
||||
fi
|
||||
add_path "$tool_path_dir" verify
|
||||
add_path "$tool_cache_path_dir"
|
||||
IFS="," read -r -a url <<<"$url"
|
||||
status_code=$(get -v -e "$tool_path" "${url[@]}")
|
||||
if [ "$status_code" != "200" ] && [[ "${url[0]}" =~ .*github.com.*releases.*latest.* ]]; then
|
||||
url[0]="${url[0]//releases\/latest\/download/releases/download/$(get -s -n "" "$(echo "${url[0]}" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "${url[0]}" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
|
||||
status_code=$(get -v -e "$tool_path" "${url[0]}")
|
||||
cache_key=$(get_sha256 "${url[0]}" | head -c 16)
|
||||
cache_path="$tool_cache_path_dir/${tool}-${cache_key}"
|
||||
status_code="200"
|
||||
if [ -f "$cache_path" ]; then
|
||||
sudo cp -a "$cache_path" "$tool_path"
|
||||
else
|
||||
[ -f "$tool_path" ] && sudo cp -a "$tool_path" "$tool_path.bak"
|
||||
status_code=$(get -v -e "$tool_path" "${url[@]}")
|
||||
if [ "$status_code" != "200" ] && [[ "${url[0]}" =~ .*github.com.*releases.*latest.* ]]; then
|
||||
url[0]="${url[0]//releases\/latest\/download/releases/download/$(get -s -n "" "$(echo "${url[0]}" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "${url[0]}" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
|
||||
status_code=$(get -v -e "$tool_path" "${url[0]}")
|
||||
fi
|
||||
if [ "$status_code" = "200" ]; then
|
||||
sudo cp -a "$tool_path" "$cache_path"
|
||||
elif [ -f "$tool_path.bak" ]; then
|
||||
sudo mv "$tool_path.bak" "$tool_path"
|
||||
fi
|
||||
sudo rm -f "$tool_path.bak"
|
||||
fi
|
||||
if [ "$status_code" = "200" ]; then
|
||||
add_tools_helper "$tool"
|
||||
[ -L "$tool_cache_path_dir/$tool" ] || sudo ln -s "$tool_path" "$tool_cache_path_dir/$tool" 2>/dev/null || true
|
||||
tool_version=$(get_tool_version "$tool" "$ver_param")
|
||||
add_log "${tick:?}" "$tool" "Added $tool $tool_version"
|
||||
else
|
||||
if [ "$tool" = "composer" ]; then
|
||||
export fail_fast=true
|
||||
elif [ -e /tmp/"$tool" ]; then
|
||||
sudo cp -a /tmp/"$tool" "$tool_path"
|
||||
fi
|
||||
if [ "$status_code" = "404" ]; then
|
||||
add_log "$cross" "$tool" "Failed to download $tool from ${url[*]}"
|
||||
@@ -218,22 +228,22 @@ add_composer_tool_helper() {
|
||||
enable_extensions curl mbstring openssl
|
||||
tool_version=${release##*:}; [ "$tool_version" = "$tool" ] && tool_version="*"
|
||||
if [ "$scope" = "global" ]; then
|
||||
sudo rm -f "$composer_lock" || true
|
||||
sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
|
||||
if composer global show "$prefix$tool" "$tool_version" -a 2>&1 | grep -qE '^type *: *composer-plugin' && [ -n "$composer_args" ]; then
|
||||
composer global config --no-plugins allow-plugins."$prefix$tool" true
|
||||
composer global config --no-plugins allow-plugins."$prefix$tool" true >/dev/null 2>&1
|
||||
fi
|
||||
composer global require "$prefix$release" "$composer_args"
|
||||
composer global show "$prefix$tool" 2>&1 | grep -E ^versions | sudo tee /tmp/composer.log
|
||||
composer global require "$prefix$release" "$composer_args" >/dev/null 2>&1
|
||||
composer global show "$prefix$tool" 2>&1 | grep -E ^versions | sudo tee /tmp/composer.log >/dev/null 2>&1
|
||||
else
|
||||
scoped_dir="$composer_bin/_tools/$tool-$(echo -n "$release" | shasum -a 256 | cut -d ' ' -f 1)"
|
||||
if ! [ -d "$scoped_dir" ]; then
|
||||
mkdir -p "$scoped_dir"
|
||||
echo '{}' | tee "$scoped_dir/composer.json" >/dev/null
|
||||
if composer show "$prefix$tool" "$tool_version" -d "$scoped_dir" -a 2>&1 | grep -qE '^type *: *composer-plugin' && [ -n "$composer_args" ]; then
|
||||
composer config -d "$scoped_dir" --no-plugins allow-plugins."$prefix$tool" true
|
||||
composer config -d "$scoped_dir" --no-plugins allow-plugins."$prefix$tool" true >/dev/null 2>&1
|
||||
fi
|
||||
composer require "$prefix$release" -d "$scoped_dir" "$composer_args"
|
||||
composer show "$prefix$tool" -d "$scoped_dir" 2>&1 | grep -E ^versions | sudo tee /tmp/composer.log
|
||||
composer require "$prefix$release" -d "$scoped_dir" "$composer_args" >/dev/null 2>&1
|
||||
composer show "$prefix$tool" -d "$scoped_dir" 2>&1 | grep -E ^versions | sudo tee /tmp/composer.log >/dev/null 2>&1
|
||||
fi
|
||||
add_path "$scoped_dir"/vendor/bin
|
||||
fi
|
||||
|
||||
@@ -6,14 +6,14 @@ Function Add-Blackfire() {
|
||||
}
|
||||
$cli_version = (Invoke-RestMethod https://blackfire.io/api/v1/releases).cli
|
||||
$url = "https://packages.blackfire.io/binaries/blackfire/${cli_version}/blackfire-windows_${arch_name}.zip"
|
||||
Get-File -Url $url -OutFile $bin_dir\blackfire.zip
|
||||
Expand-Archive -Path $bin_dir\blackfire.zip -DestinationPath $bin_dir -Force
|
||||
Get-File -Url $url -OutFile $bin_dir\blackfire.zip >$null 2>&1
|
||||
Expand-Archive -Path $bin_dir\blackfire.zip -DestinationPath $bin_dir -Force >$null 2>&1
|
||||
Add-ToProfile $current_profile 'blackfire' "New-Alias blackfire $bin_dir\blackfire.exe"
|
||||
if ((Test-Path env:BLACKFIRE_SERVER_ID) -and (Test-Path env:BLACKFIRE_SERVER_TOKEN)) {
|
||||
blackfire agent:config --server-id=$env:BLACKFIRE_SERVER_ID --server-token=$env:BLACKFIRE_SERVER_TOKEN
|
||||
blackfire agent:config --server-id=$env:BLACKFIRE_SERVER_ID --server-token=$env:BLACKFIRE_SERVER_TOKEN >$null 2>&1
|
||||
}
|
||||
if ((Test-Path env:BLACKFIRE_CLIENT_ID) -and (Test-Path env:BLACKFIRE_CLIENT_TOKEN)) {
|
||||
blackfire client:config --client-id=$env:BLACKFIRE_CLIENT_ID --client-token=$env:BLACKFIRE_CLIENT_TOKEN --ca-cert=$php_dir\ssl\cacert.pem
|
||||
blackfire client:config --client-id=$env:BLACKFIRE_CLIENT_ID --client-token=$env:BLACKFIRE_CLIENT_TOKEN --ca-cert=$php_dir\ssl\cacert.pem >$null 2>&1
|
||||
}
|
||||
Add-Log $tick "blackfire" "Added blackfire $cli_version"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ add_blackfire_linux() {
|
||||
add_blackfire_darwin() {
|
||||
sudo mkdir -p /usr/local/var/run
|
||||
add_brew_tap blackfireio/homebrew-blackfire
|
||||
brew install blackfire
|
||||
safe_brew install blackfire
|
||||
}
|
||||
|
||||
blackfire_config() {
|
||||
@@ -32,9 +32,9 @@ blackfire_config() {
|
||||
# Function to add blackfire cli.
|
||||
add_blackfire() {
|
||||
os="$(uname -s)"
|
||||
[ "$os" = "Linux" ] && add_blackfire_linux
|
||||
[ "$os" = "Darwin" ] && add_blackfire_darwin
|
||||
blackfire_config
|
||||
[ "$os" = "Linux" ] && add_blackfire_linux >/dev/null 2>&1
|
||||
[ "$os" = "Darwin" ] && add_blackfire_darwin >/dev/null 2>&1
|
||||
blackfire_config >/dev/null 2>&1
|
||||
tool_version=$(get_tool_version "blackfire" "version")
|
||||
add_log "${tick:?}" "blackfire" "Added blackfire $tool_version"
|
||||
}
|
||||
|
||||
@@ -14,11 +14,11 @@ add_brew_tap() {
|
||||
tap=$1
|
||||
if ! [ -d "$tap_dir/$tap" ]; then
|
||||
if [ "${runner:?}" = "self-hosted" ]; then
|
||||
brew tap "$tap"
|
||||
brew tap "$tap" >/dev/null 2>&1
|
||||
else
|
||||
fetch_brew_tap "$tap"
|
||||
fetch_brew_tap "$tap" >/dev/null 2>&1
|
||||
if ! [ -d "$tap_dir/$tap" ]; then
|
||||
brew tap "$tap"
|
||||
brew tap "$tap" >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -44,12 +44,141 @@ add_brew_bins_to_path() {
|
||||
add_path "$brew_prefix"/sbin
|
||||
}
|
||||
|
||||
# Function to get file modification time.
|
||||
get_file_mtime() {
|
||||
local file=$1
|
||||
if [ "$(uname -s)" = "Darwin" ]; then
|
||||
stat -f "%m" "$file" 2>/dev/null || echo 0
|
||||
else
|
||||
stat -c "%Y" "$file" 2>/dev/null || echo 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to terminate a process and its direct children.
|
||||
terminate_process_tree() {
|
||||
local pid=$1
|
||||
local children child
|
||||
children=$(pgrep -P "$pid" 2>/dev/null || true)
|
||||
kill -TERM "$pid" >/dev/null 2>&1 || true
|
||||
for child in $children; do
|
||||
terminate_process_tree "$child"
|
||||
done
|
||||
sleep 2
|
||||
kill -KILL "$pid" >/dev/null 2>&1 || true
|
||||
for child in $children; do
|
||||
terminate_process_tree "$child"
|
||||
done
|
||||
}
|
||||
|
||||
# Function to run a command with an inactivity watchdog.
|
||||
run_with_inactivity_watchdog() {
|
||||
local timeout_secs="${SETUP_PHP_BREW_INACTIVITY_TIMEOUT:-180}"
|
||||
local poll_secs="${SETUP_PHP_BREW_WATCHDOG_POLL:-5}"
|
||||
local tmp_dir stdout_fifo stderr_fifo stdout_log stderr_log timeout_file
|
||||
local command_pid stdout_reader_pid stderr_reader_pid monitor_pid exit_code
|
||||
tmp_dir="$(mktemp -d "${TMPDIR:-/tmp}/setup-php-brew.XXXXXX")" || return 1
|
||||
stdout_fifo="$tmp_dir/stdout.fifo"
|
||||
stderr_fifo="$tmp_dir/stderr.fifo"
|
||||
stdout_log="$tmp_dir/stdout.log"
|
||||
stderr_log="$tmp_dir/stderr.log"
|
||||
timeout_file="$tmp_dir/timed_out"
|
||||
mkfifo "$stdout_fifo" "$stderr_fifo" || {
|
||||
rm -rf "$tmp_dir"
|
||||
return 1
|
||||
}
|
||||
: >"$stdout_log"
|
||||
: >"$stderr_log"
|
||||
|
||||
("$@" >"$stdout_fifo" 2>"$stderr_fifo") &
|
||||
command_pid=$!
|
||||
|
||||
(
|
||||
while IFS= read -r line || [ -n "$line" ]; do
|
||||
printf '%s\n' "$line"
|
||||
printf '%s\n' "$line" >>"$stdout_log"
|
||||
done <"$stdout_fifo"
|
||||
) &
|
||||
stdout_reader_pid=$!
|
||||
|
||||
(
|
||||
while IFS= read -r line || [ -n "$line" ]; do
|
||||
printf '%s\n' "$line" >&2
|
||||
printf '%s\n' "$line" >>"$stderr_log"
|
||||
done <"$stderr_fifo"
|
||||
) &
|
||||
stderr_reader_pid=$!
|
||||
|
||||
(
|
||||
local last_activity current_activity current_err_activity now
|
||||
last_activity=$(get_file_mtime "$stdout_log")
|
||||
current_err_activity=$(get_file_mtime "$stderr_log")
|
||||
[ "$current_err_activity" -gt "$last_activity" ] && last_activity="$current_err_activity"
|
||||
while kill -0 "$command_pid" >/dev/null 2>&1; do
|
||||
sleep "$poll_secs"
|
||||
current_activity=$(get_file_mtime "$stdout_log")
|
||||
[ "$current_activity" -gt "$last_activity" ] && last_activity="$current_activity"
|
||||
current_err_activity=$(get_file_mtime "$stderr_log")
|
||||
[ "$current_err_activity" -gt "$last_activity" ] && last_activity="$current_err_activity"
|
||||
now=$(date +%s)
|
||||
if [ $((now - last_activity)) -ge "$timeout_secs" ]; then
|
||||
printf "\nsetup-php: brew produced no output for %ss; terminating and retrying...\n" "$timeout_secs" >&2
|
||||
: >"$timeout_file"
|
||||
terminate_process_tree "$command_pid"
|
||||
break
|
||||
fi
|
||||
done
|
||||
) &
|
||||
monitor_pid=$!
|
||||
|
||||
wait "$command_pid"
|
||||
exit_code=$?
|
||||
wait "$stdout_reader_pid" 2>/dev/null || true
|
||||
wait "$stderr_reader_pid" 2>/dev/null || true
|
||||
kill "$monitor_pid" >/dev/null 2>&1 || true
|
||||
wait "$monitor_pid" 2>/dev/null || true
|
||||
|
||||
if [ -e "$timeout_file" ]; then
|
||||
rm -rf "$tmp_dir"
|
||||
return 124
|
||||
fi
|
||||
|
||||
rm -rf "$tmp_dir"
|
||||
return "$exit_code"
|
||||
}
|
||||
|
||||
# Function to run brew with retries and an inactivity watchdog.
|
||||
safe_brew() {
|
||||
local max_attempts="${SETUP_PHP_BREW_RETRY_ATTEMPTS:-3}"
|
||||
local attempt=1
|
||||
local exit_code=0
|
||||
|
||||
if [ "${SETUP_PHP_BREW_WATCHDOG:-true}" = "false" ]; then
|
||||
brew "$@"
|
||||
return $?
|
||||
fi
|
||||
|
||||
while [ "$attempt" -le "$max_attempts" ]; do
|
||||
run_with_inactivity_watchdog brew "$@" && return 0
|
||||
exit_code=$?
|
||||
|
||||
if [ "$attempt" -ge "$max_attempts" ]; then
|
||||
return "$exit_code"
|
||||
fi
|
||||
|
||||
printf "setup-php: retrying brew command (attempt %s/%s, exit %s)\n" "$((attempt + 1))" "$max_attempts" "$exit_code" >&2
|
||||
sleep "$((attempt * 5))"
|
||||
attempt=$((attempt + 1))
|
||||
done
|
||||
|
||||
return "$exit_code"
|
||||
}
|
||||
|
||||
# Function to add brew.
|
||||
add_brew() {
|
||||
brew_prefix="$(get_brew_prefix)"
|
||||
if ! [ -d "$brew_prefix"/bin ]; then
|
||||
step_log "Setup Brew"
|
||||
get -s "" "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/main/install.sh" | bash -s
|
||||
get -s "" "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/main/install.sh" | bash -s >/dev/null 2>&1
|
||||
add_log "${tick:?}" "Brew" "Installed Homebrew"
|
||||
fi
|
||||
add_brew_bins_to_path "$brew_prefix"
|
||||
@@ -74,6 +203,7 @@ configure_brew() {
|
||||
export HOMEBREW_NO_ENV_HINTS=1
|
||||
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
||||
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
|
||||
export HOMEBREW_DOWNLOAD_CONCURRENCY="${HOMEBREW_DOWNLOAD_CONCURRENCY:-6}"
|
||||
export brew_opts
|
||||
export brew_path
|
||||
export brew_path_dir
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Function Add-Msys2() {
|
||||
$msys_location = 'C:\msys64'
|
||||
if (-not(Test-Path $msys_location)) {
|
||||
choco install msys2 -y
|
||||
choco install msys2 -y >$null 2>&1
|
||||
$msys_location = 'C:\tools\msys64'
|
||||
}
|
||||
return $msys_location
|
||||
@@ -15,7 +15,7 @@ Function Add-GrpcPhpPlugin() {
|
||||
} else {
|
||||
$grpc_package = 'mingw-w64-x86_64-grpc'
|
||||
}
|
||||
$logs = . $msys_location\usr\bin\bash -l -c "pacman -S --noconfirm $grpc_package"
|
||||
$logs = . $msys_location\usr\bin\bash -l -c "pacman -S --noconfirm $grpc_package" >$null 2>&1
|
||||
$grpc_version = Get-ToolVersion 'Write-Output' "$logs"
|
||||
Add-Path $msys_location\mingw64\bin
|
||||
Set-Output grpc_php_plugin_path "$msys_location\mingw64\bin\grpc_php_plugin.exe"
|
||||
|
||||
@@ -4,7 +4,7 @@ add_bazel() {
|
||||
add_list bazel/apt https://storage.googleapis.com/bazel-apt https://bazel.build/bazel-release.pub.gpg stable jdk1.8
|
||||
install_packages bazel
|
||||
else
|
||||
brew install bazel
|
||||
safe_brew install bazel
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -25,8 +25,8 @@ add_grpc_php_plugin_brew() {
|
||||
. "${0%/*}"/tools/brew.sh
|
||||
configure_brew
|
||||
[ -e /usr/local/bin/protoc ] && sudo mv /usr/local/bin/protoc /tmp/protoc && sudo mv /usr/local/include/google /tmp
|
||||
brew install grpc
|
||||
brew link --force --overwrite grpc
|
||||
safe_brew install grpc
|
||||
brew link --force --overwrite grpc >/dev/null 2>&1
|
||||
[ -e /tmp/protoc ] && sudo mv /tmp/protoc /usr/local/bin/protoc && sudo mv /tmp/google /usr/local/include/
|
||||
grpc_tag="v$(brew info grpc | grep "grpc:" | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+")"
|
||||
license_path="$(brew --prefix grpc)/LICENSE"
|
||||
@@ -50,9 +50,9 @@ add_grpc_php_plugin() {
|
||||
grpc_tag=$1
|
||||
license_path=""
|
||||
if [ "$grpc_tag" = "latest" ]; then
|
||||
add_grpc_php_plugin_brew
|
||||
add_grpc_php_plugin_brew >/dev/null 2>&1
|
||||
else
|
||||
add_grpc_php_plugin_compile
|
||||
add_grpc_php_plugin_compile >/dev/null 2>&1
|
||||
fi
|
||||
set_output grpc_php_plugin_path "$(command -v grpc_php_plugin)"
|
||||
add_log "${tick:?}" "grpc_php_plugin" "Added grpc_php_plugin ${grpc_tag:1}"
|
||||
|
||||
@@ -28,8 +28,8 @@ Function Add-Mago() {
|
||||
$arch_name = 'i686'
|
||||
}
|
||||
$url = "https://github.com/carthage-software/mago/releases/download/$mago_tag/mago-$mago_tag-$arch_name-pc-windows-msvc.zip"
|
||||
Get-File -Url $url -OutFile $bin_dir\mago.zip
|
||||
Expand-Archive -Path $bin_dir\mago.zip -DestinationPath $bin_dir\mago -Force
|
||||
Get-File -Url $url -OutFile $bin_dir\mago.zip >$null 2>&1
|
||||
Expand-Archive -Path $bin_dir\mago.zip -DestinationPath $bin_dir\mago -Force >$null 2>&1
|
||||
Move-Item -Path $bin_dir\mago\mago-$mago_tag-$arch_name-pc-windows-msvc\mago.exe -Destination $bin_dir\mago.exe -Force
|
||||
Add-ToProfile $current_profile 'mago' "New-Alias mago $bin_dir\mago.exe"
|
||||
Add-Log $tick "mago" "Added mago $mago_tag"
|
||||
|
||||
@@ -24,6 +24,6 @@ add_mago() {
|
||||
sudo tar -xzf /tmp/mago.tar.gz -C /tmp/
|
||||
sudo mv /tmp/mago-$mago_tag-$arch-$platform/mago /usr/local/bin/mago
|
||||
sudo chmod +x /usr/local/bin/mago
|
||||
)
|
||||
) >/dev/null 2>&1
|
||||
add_log "${tick:?}" "mago" "Added mago $mago_tag"
|
||||
}
|
||||
@@ -31,7 +31,7 @@ set_base_version() {
|
||||
else
|
||||
set_base_version_codename
|
||||
set_base_version_id
|
||||
printf "ID=%s\nVERSION_ID=%s\nVERSION_CODENAME=%s\n" "$ID" "$VERSION_ID" "$VERSION_CODENAME" | tee /tmp/os-release
|
||||
printf "ID=%s\nVERSION_ID=%s\nVERSION_CODENAME=%s\n" "$ID" "$VERSION_ID" "$VERSION_CODENAME" | tee /tmp/os-release >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -70,8 +70,8 @@ update_lists() {
|
||||
list="$list_file"
|
||||
fi
|
||||
if [ ! -e "$status_file" ]; then
|
||||
update_lists_helper "$list"
|
||||
echo '' | tee "$status_file"
|
||||
update_lists_helper "$list" >/dev/null 2>&1
|
||||
echo '' | tee "$status_file" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ add_key() {
|
||||
key_urls+=("$ppa_sp/keys/$ppa.gpg")
|
||||
[ ! -e "$key_source" ] && get -q -n "$key_file" "${key_urls[@]}"
|
||||
if [[ "$(file "$key_file")" =~ .*('Public-Key (old)'|'Secret-Key') ]]; then
|
||||
sudo gpg --batch --yes --dearmor "$key_file" && sudo mv "$key_file".gpg "$key_file"
|
||||
sudo gpg --batch --yes --dearmor "$key_file" >/dev/null 2>&1 && sudo mv "$key_file".gpg "$key_file"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ Architectures: $arch
|
||||
Signed-By: $key_file
|
||||
EOF
|
||||
else
|
||||
echo "deb [arch=$arch signed-by=$key_file] $url $suite $components" | sudo tee "$list_dir"/"$list_basename".list
|
||||
echo "deb [arch=$arch signed-by=$key_file] $url $suite $components" | sudo tee "$list_dir"/"$list_basename".list >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -29,8 +29,8 @@ Function Add-Protoc() {
|
||||
$arch_num = '32'
|
||||
}
|
||||
$url = "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-$($protobuf_tag -replace 'v', '')-win$arch_num.zip"
|
||||
Get-File -Url $url -OutFile $bin_dir\protoc.zip
|
||||
Expand-Archive -Path $bin_dir\protoc.zip -DestinationPath $bin_dir\protoc -Force
|
||||
Get-File -Url $url -OutFile $bin_dir\protoc.zip >$null 2>&1
|
||||
Expand-Archive -Path $bin_dir\protoc.zip -DestinationPath $bin_dir\protoc -Force >$null 2>&1
|
||||
Move-Item -Path $bin_dir\protoc\bin\protoc.exe -Destination $bin_dir\protoc.exe
|
||||
Add-ToProfile $current_profile 'protoc' "New-Alias protoc $bin_dir\protoc.exe"
|
||||
Add-Log $tick "protoc" "Added protoc $($protobuf_tag -replace 'v', '')"
|
||||
|
||||
@@ -22,7 +22,7 @@ add_protoc() {
|
||||
get -q -n /tmp/protobuf.zip "https://github.com/protocolbuffers/protobuf/releases/download/$protobuf_tag/protoc-${protobuf_tag:1}-$platform-$arch.zip"
|
||||
sudo unzip /tmp/protobuf.zip -d /usr/local/
|
||||
sudo chmod -R 777 /usr/local/bin/protoc /usr/local/include/google
|
||||
)
|
||||
) >/dev/null 2>&1
|
||||
add_log "${tick:?}" "protoc" "Added protoc ${protobuf_tag:1}"
|
||||
printf "$GROUP\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "protoc" "Click to read the protoc related license information"
|
||||
curl "${curl_opts[@]:?}" https://raw.githubusercontent.com/protocolbuffers/protobuf/main/LICENSE
|
||||
|
||||
@@ -31,7 +31,7 @@ add_symfony() {
|
||||
if ! [[ "$symfony_tag" =~ ^[0-9]+(\.[0-9]+)*$ || "$symfony_tag" == 'latest' ]]; then
|
||||
add_log "${cross:?}" "symfony-cli" "Version '$symfony_tag' is not valid for symfony-cli"
|
||||
else
|
||||
add_symfony_helper "$symfony_tag"
|
||||
add_symfony_helper "$symfony_tag" >/dev/null 2>&1
|
||||
symfony_path="$(command -v symfony)"
|
||||
if [[ -n "$symfony_path" ]]; then
|
||||
sudo ln -s "$symfony_path" "${tool_path_dir:?}"/symfony-cli
|
||||
|
||||
@@ -4,7 +4,7 @@ export cross="✗"
|
||||
export curl_opts=(-sL)
|
||||
export old_versions="5.[3-5]"
|
||||
export jit_versions="8.[0-9]"
|
||||
export nightly_versions="8.[3-9]"
|
||||
export php_builder_versions="8.[3-9]"
|
||||
export xdebug3_versions="7.[2-4]|8.[0-9]"
|
||||
export latest="releases/latest/download"
|
||||
export github="https://github.com/shivammathur"
|
||||
@@ -43,7 +43,7 @@ set_output() {
|
||||
name=$1
|
||||
value=$2
|
||||
if [ "${GITHUB_ACTIONS}" = "true" ]; then
|
||||
echo "${name}=${value}" | tee -a "$GITHUB_OUTPUT"
|
||||
echo "${name}=${value}" | tee -a "$GITHUB_OUTPUT" >/dev/null 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -58,6 +58,7 @@ read_env() {
|
||||
-n "$ACT" || -n "$CONTAINER" ]] && _runner=self-hosted || _runner=github
|
||||
runner="${runner:-${RUNNER:-$_runner}}"
|
||||
tool_path_dir="${setup_php_tools_dir:-${SETUP_PHP_TOOLS_DIR:-/usr/local/bin}}"
|
||||
tool_cache_path_dir="${setup_php_tool_cache_dir:-${SETUP_PHP_TOOL_CACHE_DIR:-${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}/setup-php/tools}}"
|
||||
|
||||
if [[ "$runner" = "github" && $_runner = "self-hosted" ]]; then
|
||||
fail_fast=true
|
||||
@@ -68,7 +69,7 @@ read_env() {
|
||||
if [[ "$runner" = "github" && "${ImageOS}" =~ ubuntu.* ]]; then
|
||||
if ! check_ppa ondrej/php; then
|
||||
update=true
|
||||
echo '' | sudo tee /tmp/sp_update
|
||||
echo '' | sudo tee /tmp/sp_update >/dev/null 2>&1
|
||||
elif [ -e /tmp/sp_update ]; then
|
||||
update=true
|
||||
fi
|
||||
@@ -79,6 +80,7 @@ read_env() {
|
||||
export update
|
||||
export ts
|
||||
export tool_path_dir
|
||||
export tool_cache_path_dir
|
||||
}
|
||||
|
||||
# Function to create a lock.
|
||||
@@ -91,7 +93,7 @@ acquire_lock() {
|
||||
else
|
||||
if sudo test -f "$lock_path/pid"; then
|
||||
lock_pid=$(sudo cat "$lock_path/pid")
|
||||
if ! ps -p "$lock_pid" ; then
|
||||
if ! ps -p "$lock_pid" >/dev/null 2>&1; then
|
||||
sudo rm -rf "$lock_path"
|
||||
continue
|
||||
fi
|
||||
@@ -169,14 +171,15 @@ get_shell_profile() {
|
||||
# Function to add a path to the PATH variable.
|
||||
add_path() {
|
||||
path_to_add=$1
|
||||
[[ ":$PATH:" == *":$path_to_add:"* ]] && return
|
||||
action=$2
|
||||
[[ "$action" == "verify" && ":$PATH:" == *":$path_to_add:"* ]] && return
|
||||
if [[ -n "$GITHUB_PATH" ]]; then
|
||||
echo "$path_to_add" | tee -a "$GITHUB_PATH"
|
||||
printf '%s\n%s' "$path_to_add" "$(grep -v "^${path_to_add}$" "$GITHUB_PATH" 2>/dev/null)" > "$GITHUB_PATH"
|
||||
else
|
||||
profile=$(get_shell_profile)
|
||||
([ -e "$profile" ] && grep -q ":$path_to_add\"" "$profile" 2>/dev/null) || echo "export PATH=\"\${PATH:+\${PATH}:}\"$path_to_add" | sudo tee -a "$profile"
|
||||
([ -e "$profile" ] && grep -q ":$path_to_add\"" "$profile" 2>/dev/null) || echo "export PATH=\"\${PATH:+\${PATH}:}\"$path_to_add" | sudo tee -a "$profile" >/dev/null 2>&1
|
||||
fi
|
||||
export PATH="${PATH:+${PATH}:}$path_to_add"
|
||||
[[ ":$PATH:" == *":$path_to_add:"* ]] || export PATH="${PATH:+${PATH}:}$path_to_add"
|
||||
}
|
||||
|
||||
# Function to add environment variables using a PATH.
|
||||
@@ -196,10 +199,10 @@ add_env() {
|
||||
env_name=$1
|
||||
env_value=$2
|
||||
if [[ -n "$GITHUB_ENV" ]]; then
|
||||
echo "$env_name=$env_value" | tee -a "$GITHUB_ENV"
|
||||
echo "$env_name=$env_value" | tee -a "$GITHUB_ENV" >/dev/null 2>&1
|
||||
else
|
||||
profile=$(get_shell_profile)
|
||||
echo "export $env_name=\"$env_value\"" | sudo tee -a "$profile"
|
||||
echo "export $env_name=\"$env_value\"" | sudo tee -a "$profile" >/dev/null 2>&1
|
||||
fi
|
||||
export "$env_name"="$env_value"
|
||||
}
|
||||
@@ -220,7 +223,7 @@ self_hosted_setup() {
|
||||
add_log "$cross" "PHP" "PHP $version is not supported on self-hosted runner"
|
||||
exit 1
|
||||
else
|
||||
self_hosted_helper
|
||||
self_hosted_helper >/dev/null 2>&1
|
||||
add_env RUNNER_TOOL_CACHE /opt/hostedtoolcache
|
||||
fi
|
||||
fi
|
||||
@@ -248,8 +251,8 @@ configure_php() {
|
||||
[[ "$arch" = "arm64" || "$arch" = "aarch64" ]] && jit_ini="$ini_config_dir"/jit_aarch64.ini || jit_ini="$ini_config_dir"/jit.ini
|
||||
jit_config_files=("$jit_ini")
|
||||
[[ "$version" =~ $xdebug3_versions ]] && ini_config_files+=("$ini_config_dir"/xdebug.ini)
|
||||
cat "${ini_config_files[@]}" | sudo tee -a "${ini_file[@]:?}"
|
||||
[[ "$version" =~ $jit_versions ]] && cat "${jit_config_files[@]}" | sudo tee -a "${pecl_file:-${ini_file[@]}}"
|
||||
cat "${ini_config_files[@]}" | sudo tee -a "${ini_file[@]:?}" >/dev/null 2>&1
|
||||
[[ "$version" =~ $jit_versions ]] && cat "${jit_config_files[@]}" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to get PHP version in semver format.
|
||||
|
||||
@@ -81,9 +81,10 @@ Function Get-PathFromRegistry {
|
||||
# Function to add a location to PATH.
|
||||
Function Add-Path {
|
||||
param(
|
||||
[string]$PathItem
|
||||
[string]$PathItem,
|
||||
[switch]$Force
|
||||
)
|
||||
if("$env:PATH;".contains("$PathItem;")) {
|
||||
if(-not($Force) -and "$env:PATH;".contains("$PathItem;")) {
|
||||
return
|
||||
}
|
||||
if ($env:GITHUB_PATH) {
|
||||
@@ -355,7 +356,7 @@ if(-not($env:ImageOS) -and -not($env:ImageVersion)) {
|
||||
$bin_dir = 'C:\tools\bin'
|
||||
$php_dir = "$php_dir$version"
|
||||
$ext_dir = "$php_dir\ext"
|
||||
Get-CleanPSProfile
|
||||
Get-CleanPSProfile >$null 2>&1
|
||||
New-Item $bin_dir -Type Directory -Force > $null 2>&1
|
||||
Add-Path -PathItem $bin_dir
|
||||
if($version -lt 5.6) {
|
||||
@@ -368,22 +369,23 @@ if(-not($env:ImageOS) -and -not($env:ImageVersion)) {
|
||||
}
|
||||
New-Item $php_dir -Type Directory -Force > $null 2>&1
|
||||
Add-Path -PathItem $php_dir
|
||||
setx PHPROOT $php_dir
|
||||
setx PHPROOT $php_dir >$null 2>&1
|
||||
Add-Env -EnvName RUNNER_TOOL_CACHE -EnvValue $env:TEMP
|
||||
} else {
|
||||
$current_profile = "$PSHOME\Profile.ps1"
|
||||
if(-not(Test-Path -LiteralPath $current_profile)) {
|
||||
New-Item -Path $current_profile -ItemType "file" -Force
|
||||
New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1
|
||||
}
|
||||
Add-Path -PathItem $bin_dir -Force
|
||||
}
|
||||
|
||||
$src = Join-Path -Path $PSScriptRoot -ChildPath \..
|
||||
. $src\scripts\tools\add_tools.ps1
|
||||
. $src\scripts\extensions\add_extensions.ps1
|
||||
|
||||
Add-Printf
|
||||
Add-Printf >$null 2>&1
|
||||
Step-Log "Setup PhpManager"
|
||||
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php
|
||||
Install-PSPackage PhpManager PhpManager\PhpManager "$github/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip" Get-Php >$null 2>&1
|
||||
Add-Log $tick "PhpManager" "Installed"
|
||||
|
||||
Step-Log "Setup PHP"
|
||||
@@ -412,7 +414,7 @@ if($version -eq 'pre') {
|
||||
}
|
||||
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 ($null -eq (Get-Module -ListAvailable -Name VcRedist))) {
|
||||
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList
|
||||
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" Get-VcList >$null 2>&1
|
||||
}
|
||||
try {
|
||||
if ($version -match $nightly_versions) {
|
||||
@@ -425,7 +427,7 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
|
||||
} catch { }
|
||||
} else {
|
||||
if($env:update -eq 'true') {
|
||||
Update-Php $php_dir
|
||||
Update-Php $php_dir >$null 2>&1
|
||||
$status = "Updated to"
|
||||
} else {
|
||||
$status = "Found"
|
||||
@@ -443,7 +445,7 @@ if($installed.MajorMinorVersion -ne $version) {
|
||||
Write-Error "Could not setup PHP $version" -ErrorAction Stop
|
||||
}
|
||||
if($version -lt "5.5") {
|
||||
('libeay32.dll', 'ssleay32.dll') | ForEach-Object -Parallel { Invoke-WebRequest -Uri "$using:php_builder/releases/download/openssl-1.0.2u/$_" -OutFile $using:php_dir\$_ }
|
||||
('libeay32.dll', 'ssleay32.dll') | ForEach-Object -Parallel { Invoke-WebRequest -Uri "$using:php_builder/releases/download/openssl-1.0.2u/$_" -OutFile $using:php_dir\$_ >$null 2>&1 }
|
||||
} elseif($version -lt "8.5") {
|
||||
$enable_extensions += ('opcache')
|
||||
}
|
||||
|
||||
505
src/tools.ts
505
src/tools.ts
@@ -5,14 +5,94 @@ import * as fetch from './fetch';
|
||||
import * as packagist from './packagist';
|
||||
import * as utils from './utils';
|
||||
|
||||
type RS = Record<string, string>;
|
||||
type RSRS = Record<string, RS>;
|
||||
/**
|
||||
* Valid function names for custom tool handlers
|
||||
*/
|
||||
type ToolFunction =
|
||||
| 'castor'
|
||||
| 'composer'
|
||||
| 'deployer'
|
||||
| 'dev_tools'
|
||||
| 'phive'
|
||||
| 'blackfire_player'
|
||||
| 'pecl'
|
||||
| 'phing'
|
||||
| 'phpunit'
|
||||
| 'phpcpd'
|
||||
| 'wp_cli';
|
||||
|
||||
interface IRef {
|
||||
/**
|
||||
* Tool data interface containing all properties for tool installation
|
||||
*/
|
||||
export interface ToolData {
|
||||
tool: string;
|
||||
version: string;
|
||||
os: string;
|
||||
php_version: string;
|
||||
github: string;
|
||||
domain: string;
|
||||
extension: string;
|
||||
repository: string;
|
||||
prefix: string;
|
||||
verb: string;
|
||||
fetch_latest: 'true' | 'false';
|
||||
scope: string;
|
||||
version_parameter: string;
|
||||
version_prefix: string;
|
||||
release: string;
|
||||
packagist: string;
|
||||
type?: string;
|
||||
function?: ToolFunction;
|
||||
alias?: string;
|
||||
url: string;
|
||||
uri?: string;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Input type for functions that may receive partial/unresolved tool data
|
||||
* Used by getUrl, getLatestVersion etc. before version is fully resolved
|
||||
*/
|
||||
export type ToolInput = Omit<ToolData, 'version' | 'url'> & {version?: string};
|
||||
|
||||
/**
|
||||
* Partial tool data from tools.json configuration
|
||||
*/
|
||||
interface ToolConfig {
|
||||
tool?: string;
|
||||
repository?: string;
|
||||
type?: string;
|
||||
function?: ToolFunction;
|
||||
alias?: string;
|
||||
domain?: string;
|
||||
extension?: string;
|
||||
fetch_latest?: 'true' | 'false';
|
||||
scope?: string;
|
||||
version_parameter?: string;
|
||||
version_prefix?: string;
|
||||
packagist?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* GitHub reference object from API response
|
||||
*/
|
||||
interface GitHubRef {
|
||||
ref: string;
|
||||
node_id: string;
|
||||
url: string;
|
||||
object: RS;
|
||||
object: {
|
||||
sha: string;
|
||||
type: string;
|
||||
url: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Deployer manifest entry
|
||||
*/
|
||||
interface DeployerManifestEntry {
|
||||
version: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -20,7 +100,7 @@ interface IRef {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function getSemverVersion(data: RS): Promise<string> {
|
||||
export async function getSemverVersion(data: ToolData): Promise<string> {
|
||||
const fixSemver = (t: string): string => {
|
||||
if (/^\d+\.\d+\.\d+(-|$)/.test(t)) return t;
|
||||
const m = t.match(/^(\d+\.\d+\.\d+)([A-Za-z]+[0-9A-Za-z.]+)$/);
|
||||
@@ -31,14 +111,16 @@ export async function getSemverVersion(data: RS): Promise<string> {
|
||||
const github_token: string =
|
||||
(await utils.readEnv('GITHUB_TOKEN')) ||
|
||||
(await utils.readEnv('COMPOSER_TOKEN'));
|
||||
const response: RS = await fetch.fetch(url, github_token);
|
||||
const response = await fetch.fetch(url, github_token);
|
||||
if (response.error || response.data === '[]') {
|
||||
data['error'] = response.error ?? `No version found with prefix ${search}.`;
|
||||
return data['version'];
|
||||
data.error = response.error ?? `No version found with prefix ${search}.`;
|
||||
return data.version;
|
||||
} else {
|
||||
const refs: IRef[] = JSON.parse(response['data']);
|
||||
const refs: GitHubRef[] = JSON.parse(response.data);
|
||||
const tags = refs
|
||||
.map((i: IRef) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, ''))
|
||||
.map((i: GitHubRef) =>
|
||||
(i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, '')
|
||||
)
|
||||
.filter((t: string) => t.length > 0);
|
||||
const fixedToOriginal = new Map<string, string>();
|
||||
const fixed = tags.map(t => {
|
||||
@@ -46,14 +128,14 @@ export async function getSemverVersion(data: RS): Promise<string> {
|
||||
fixedToOriginal.set(f, t);
|
||||
return f;
|
||||
});
|
||||
fixed.sort((a, b) => {
|
||||
const sorted = fixed.toSorted((a, b) => {
|
||||
try {
|
||||
return cv.compareVersions(b, a);
|
||||
} catch {
|
||||
return b.localeCompare(a, 'en', {numeric: true, sensitivity: 'base'});
|
||||
}
|
||||
});
|
||||
return fixedToOriginal.get(fixed[0]) ?? fixed[0];
|
||||
return fixedToOriginal.get(sorted[0]) ?? sorted[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,25 +144,25 @@ export async function getSemverVersion(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function getLatestVersion(data: RS): Promise<string> {
|
||||
if (!data['version'] && data['fetch_latest'] === 'false') {
|
||||
export async function getLatestVersion(data: ToolInput): Promise<string> {
|
||||
if (!data.version && data.fetch_latest === 'false') {
|
||||
return 'latest';
|
||||
}
|
||||
const resp: Record<string, string> = await fetch.fetch(
|
||||
`${data['github']}/${data['repository']}/releases.atom`
|
||||
if (data.fetch_latest === 'true' && !data.repository) {
|
||||
return 'latest';
|
||||
}
|
||||
const resp = await fetch.fetch(
|
||||
`${data.github}/${data.repository}/releases.atom`
|
||||
);
|
||||
if (resp['data']) {
|
||||
if (resp.data) {
|
||||
const releases: string[] = [
|
||||
...resp['data'].matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+.\d+.\d+)"/g)
|
||||
...resp.data.matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+\.\d+\.\d+)"/g)
|
||||
].map(match => match[2]);
|
||||
|
||||
return (
|
||||
releases
|
||||
.sort((a: string, b: string) =>
|
||||
a.localeCompare(b, undefined, {numeric: true})
|
||||
)
|
||||
.pop() || 'latest'
|
||||
const sorted = releases.toSorted((a: string, b: string) =>
|
||||
a.localeCompare(b, undefined, {numeric: true})
|
||||
);
|
||||
return sorted.at(-1) || 'latest';
|
||||
}
|
||||
return 'latest';
|
||||
}
|
||||
@@ -91,26 +173,29 @@ export async function getLatestVersion(data: RS): Promise<string> {
|
||||
* @param version
|
||||
* @param data
|
||||
*/
|
||||
export async function getVersion(version: string, data: RS): Promise<string> {
|
||||
export async function getVersion(
|
||||
version: string,
|
||||
data: ToolData
|
||||
): Promise<string> {
|
||||
// semver_regex - https://semver.org/
|
||||
const semver_regex =
|
||||
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
||||
const composer_regex = /^composer:(stable|preview|snapshot|[1|2])$/;
|
||||
const composer_regex = /^composer:(stable|preview|snapshot|[12])$/;
|
||||
const constraint_regex = /[><=^~]+.*/;
|
||||
const major_minor_regex = /^\d+(\.\d+)?$/;
|
||||
data['version'] = version.replace(/v?(\d)/, '$1').replace(/\.x/, '');
|
||||
data.version = version.replace(/v?(\d)/, '$1').replace(/\.x/, '');
|
||||
switch (true) {
|
||||
case composer_regex.test(data['release']):
|
||||
case semver_regex.test(data['version']):
|
||||
case constraint_regex.test(data['version']) && data['type'] === 'composer':
|
||||
return data['version'];
|
||||
case major_minor_regex.test(data['version']) && data['type'] === 'composer':
|
||||
data['release'] = `${data['tool']}:${data['version']}.*`;
|
||||
return `${data['version']}.*`;
|
||||
case data['repository'] && major_minor_regex.test(data['version']):
|
||||
case composer_regex.test(data.release):
|
||||
case semver_regex.test(data.version):
|
||||
case constraint_regex.test(data.version) && data.type === 'composer':
|
||||
return data.version;
|
||||
case major_minor_regex.test(data.version) && data.type === 'composer':
|
||||
data.release = `${data.tool}:${data.version}.*`;
|
||||
return `${data.version}.*`;
|
||||
case !!data.repository && major_minor_regex.test(data.version):
|
||||
return await getSemverVersion(data);
|
||||
default:
|
||||
return data['version'].replace(/[><=^~]*/, '');
|
||||
return data.version.replace(/[><=^~]*/, '');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,11 +205,14 @@ export async function getVersion(version: string, data: RS): Promise<string> {
|
||||
* @param release
|
||||
* @param data
|
||||
*/
|
||||
export async function getRelease(release: string, data: RS): Promise<string> {
|
||||
export async function getRelease(
|
||||
release: string,
|
||||
data: ToolData
|
||||
): Promise<string> {
|
||||
release = release.includes('/') ? release.split('/')[1] : release;
|
||||
return release.includes(':')
|
||||
? [data['tool'], release.split(':')[1]].join(':')
|
||||
: data['tool'];
|
||||
? [data.tool, release.split(':')[1]].join(':')
|
||||
: data.tool;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -143,7 +231,7 @@ export async function filterList(tools_list: string[]): Promise<string[]> {
|
||||
case matches[0] == undefined:
|
||||
break;
|
||||
default:
|
||||
composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1');
|
||||
composer = matches.at(-1)!.replace(/v(\d\S*)/, '$1');
|
||||
break;
|
||||
}
|
||||
tools_list.unshift(composer);
|
||||
@@ -155,26 +243,26 @@ export async function filterList(tools_list: string[]): Promise<string[]> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function getUrl(data: RS): Promise<string> {
|
||||
if ((data['version'] ?? 'latest') === 'latest') {
|
||||
export async function getUrl(data: ToolInput): Promise<string> {
|
||||
if ((data.version ?? 'latest') === 'latest') {
|
||||
return [
|
||||
data['domain'],
|
||||
data['repository'],
|
||||
data['prefix'],
|
||||
data['version'],
|
||||
data['verb'],
|
||||
data['tool'] + data['extension']
|
||||
data.domain,
|
||||
data.repository,
|
||||
data.prefix,
|
||||
data.version,
|
||||
data.verb,
|
||||
data.tool + data.extension
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join('/');
|
||||
} else {
|
||||
return [
|
||||
data['domain'],
|
||||
data['repository'],
|
||||
data['prefix'],
|
||||
data['verb'],
|
||||
data['version_prefix'] + data['version'],
|
||||
data['tool'] + data['extension']
|
||||
data.domain,
|
||||
data.repository,
|
||||
data.prefix,
|
||||
data.verb,
|
||||
data.version_prefix + data.version,
|
||||
data.tool + data.extension
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join('/');
|
||||
@@ -186,17 +274,17 @@ export async function getUrl(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function getPharUrl(data: RS): Promise<string> {
|
||||
if (data['version'] === 'latest') {
|
||||
return data['domain'] + '/' + data['tool'] + '.phar';
|
||||
export async function getPharUrl(data: ToolData): Promise<string> {
|
||||
if (data.version === 'latest') {
|
||||
return data.domain + '/' + data.tool + '.phar';
|
||||
} else {
|
||||
return (
|
||||
data['domain'] +
|
||||
data.domain +
|
||||
'/' +
|
||||
data['tool'] +
|
||||
data.tool +
|
||||
'-' +
|
||||
data['version_prefix'] +
|
||||
data['version'] +
|
||||
data.version_prefix +
|
||||
data.version +
|
||||
'.phar'
|
||||
);
|
||||
}
|
||||
@@ -207,10 +295,10 @@ export async function getPharUrl(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addArchive(data: RS): Promise<string> {
|
||||
export async function addArchive(data: ToolData): Promise<string> {
|
||||
return (
|
||||
(await utils.getCommand(data['os'], 'tool')) +
|
||||
(await utils.joins(data['url'], data['tool'], data['version_parameter']))
|
||||
(await utils.getCommand(data.os, 'tool')) +
|
||||
(await utils.joins(data.url, data.tool, data.version_parameter))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -219,14 +307,14 @@ export async function addArchive(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addPackage(data: RS): Promise<string> {
|
||||
const command = await utils.getCommand(data['os'], 'composer_tool');
|
||||
const parts: string[] = data['repository'].split('/');
|
||||
export async function addPackage(data: ToolData): Promise<string> {
|
||||
const command = await utils.getCommand(data.os, 'composer_tool');
|
||||
const parts: string[] = data.repository.split('/');
|
||||
const args: string = await utils.joins(
|
||||
parts[1],
|
||||
data['release'],
|
||||
data.release,
|
||||
parts[0] + '/',
|
||||
data['scope']
|
||||
data.scope
|
||||
);
|
||||
return command + args;
|
||||
}
|
||||
@@ -236,24 +324,24 @@ export async function addPackage(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addBlackfirePlayer(data: RS): Promise<string> {
|
||||
switch (data['os']) {
|
||||
export async function addBlackfirePlayer(data: ToolData): Promise<string> {
|
||||
switch (data.os) {
|
||||
case 'win32':
|
||||
return await utils.addLog(
|
||||
'$cross',
|
||||
data['tool'],
|
||||
data['tool'] + ' is not a windows tool',
|
||||
data.tool,
|
||||
data.tool + ' is not a windows tool',
|
||||
'win32'
|
||||
);
|
||||
default:
|
||||
if (data['version'] == 'latest') {
|
||||
if (/5\.[5-6]|7\.0/.test(data['php_version'])) {
|
||||
data['version'] = '1.9.3';
|
||||
} else if (/7\.[1-4]|8\.0/.test(data['php_version'])) {
|
||||
data['version'] = '1.22.0';
|
||||
if (data.version == 'latest') {
|
||||
if (/5\.[5-6]|7\.0/.test(data.php_version)) {
|
||||
data.version = '1.9.3';
|
||||
} else if (/7\.[1-4]|8\.0/.test(data.php_version)) {
|
||||
data.version = '1.22.0';
|
||||
}
|
||||
}
|
||||
data['url'] = await getPharUrl(data);
|
||||
data.url = await getPharUrl(data);
|
||||
return addArchive(data);
|
||||
}
|
||||
}
|
||||
@@ -263,12 +351,12 @@ export async function addBlackfirePlayer(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addCastor(data: RS): Promise<string> {
|
||||
data['tool'] = 'castor.' + data['os'].replace('win32', 'windows') + '-amd64';
|
||||
data['url'] = await getUrl(data);
|
||||
data['tool'] = 'castor';
|
||||
data['version_parameter'] = fs.existsSync('castor.php')
|
||||
? data['version_parameter']
|
||||
export async function addCastor(data: ToolData): Promise<string> {
|
||||
data.tool = 'castor.' + data.os.replace('win32', 'windows') + '-amd64';
|
||||
data.url = await getUrl(data);
|
||||
data.tool = 'castor';
|
||||
data.version_parameter = fs.existsSync('castor.php')
|
||||
? data.version_parameter
|
||||
: '';
|
||||
return await addArchive(data);
|
||||
}
|
||||
@@ -278,18 +366,18 @@ export async function addCastor(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addComposer(data: RS): Promise<string> {
|
||||
const channel = data['version'].replace('latest', 'stable');
|
||||
const github = data['github'];
|
||||
const getcomposer = data['domain'];
|
||||
export async function addComposer(data: ToolData): Promise<string> {
|
||||
const channel = data.version.replace('latest', 'stable');
|
||||
const github = data.github;
|
||||
const getcomposer = data.domain;
|
||||
const cds = 'https://dl.cloudsmith.io';
|
||||
const spc = 'https://artifacts.setup-php.com';
|
||||
const filename = `composer-${data['php_version']}-${channel}.phar`;
|
||||
const filename = `composer-${data.php_version}-${channel}.phar`;
|
||||
const releases_url = `${github}/shivammathur/composer-cache/releases/latest/download/${filename}`;
|
||||
const cds_url = `${cds}/public/shivammathur/composer-cache/raw/files/${filename}`;
|
||||
const spc_url = `${spc}/composer/${filename}`;
|
||||
const lts_url = `${getcomposer}/download/latest-2.2.x/composer.phar`;
|
||||
const is_lts = /^5\.[3-6]$|^7\.[0-1]$/.test(data['php_version']);
|
||||
const is_lts = /^5\.[3-6]$|^7\.[0-1]$/.test(data.php_version);
|
||||
const channel_source_url = `${getcomposer}/composer-${channel}.phar`;
|
||||
const version_source_url = `${getcomposer}/download/${channel}/composer.phar`;
|
||||
let cache_url = `${releases_url},${spc_url},${cds_url}`;
|
||||
@@ -304,16 +392,16 @@ export async function addComposer(data: RS): Promise<string> {
|
||||
case /^1$/.test(channel):
|
||||
source_url = channel_source_url;
|
||||
break;
|
||||
case /^\d+\.\d+\.\d+[\w-]*$/.test(data['version']):
|
||||
cache_url = `${github}/${data['repository']}/releases/download/${data['version']}/composer.phar`;
|
||||
case /^\d+\.\d+\.\d+[\w-]*$/.test(data.version):
|
||||
cache_url = `${github}/${data.repository}/releases/download/${data.version}/composer.phar`;
|
||||
source_url = version_source_url;
|
||||
break;
|
||||
default:
|
||||
source_url = is_lts ? lts_url : channel_source_url;
|
||||
}
|
||||
const use_cache: boolean = (await utils.readEnv('NO_TOOLS_CACHE')) !== 'true';
|
||||
data['url'] = use_cache ? `${cache_url},${source_url}` : source_url;
|
||||
data['version_parameter'] = data['version'];
|
||||
data.url = use_cache ? `${cache_url},${source_url}` : source_url;
|
||||
data.version_parameter = data.version;
|
||||
return await addArchive(data);
|
||||
}
|
||||
|
||||
@@ -322,27 +410,27 @@ export async function addComposer(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addDeployer(data: RS): Promise<string> {
|
||||
if (data['version'] === 'latest') {
|
||||
data['url'] = data['domain'] + '/deployer.phar';
|
||||
export async function addDeployer(data: ToolData): Promise<string> {
|
||||
if (data.version === 'latest') {
|
||||
data.url = data.domain + '/deployer.phar';
|
||||
} else {
|
||||
const manifest: RS = await fetch.fetch(
|
||||
'https://deployer.org/manifest.json'
|
||||
const manifest = await fetch.fetch('https://deployer.org/manifest.json');
|
||||
const version_data: Record<string, DeployerManifestEntry> = JSON.parse(
|
||||
manifest.data
|
||||
);
|
||||
const version_data: RSRS = JSON.parse(manifest.data);
|
||||
const version_key: string | undefined = Object.keys(version_data).find(
|
||||
(key: string) => {
|
||||
return version_data[key]['version'] === data['version'];
|
||||
return version_data[key].version === data.version;
|
||||
}
|
||||
);
|
||||
if (version_key) {
|
||||
data['url'] = version_data[version_key]['url'];
|
||||
data.url = version_data[version_key].url;
|
||||
} else {
|
||||
return await utils.addLog(
|
||||
'$cross',
|
||||
'deployer',
|
||||
'Version missing in deployer manifest',
|
||||
data['os']
|
||||
data.os
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -354,22 +442,22 @@ export async function addDeployer(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addDevTools(data: RS): Promise<string> {
|
||||
switch (data['os']) {
|
||||
export async function addDevTools(data: ToolData): Promise<string> {
|
||||
switch (data.os) {
|
||||
case 'linux':
|
||||
case 'darwin':
|
||||
return 'add_devtools ' + data['tool'];
|
||||
return 'add_devtools ' + data.tool;
|
||||
case 'win32':
|
||||
return await utils.addLog(
|
||||
'$tick',
|
||||
data['tool'],
|
||||
data['tool'] + ' is not a windows tool',
|
||||
data.tool,
|
||||
data.tool + ' is not a windows tool',
|
||||
'win32'
|
||||
);
|
||||
default:
|
||||
return await utils.log(
|
||||
'Platform ' + data['os'] + ' is not supported',
|
||||
data['os'],
|
||||
'Platform ' + data.os + ' is not supported',
|
||||
data.os,
|
||||
'error'
|
||||
);
|
||||
}
|
||||
@@ -380,8 +468,8 @@ export async function addDevTools(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addPECL(data: RS): Promise<string> {
|
||||
return await utils.getCommand(data['os'], 'pecl');
|
||||
export async function addPECL(data: ToolData): Promise<string> {
|
||||
return await utils.getCommand(data.os, 'pecl');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,14 +477,13 @@ export async function addPECL(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addPhing(data: RS): Promise<string> {
|
||||
data['url'] =
|
||||
data['domain'] + '/get/phing-' + data['version'] + data['extension'];
|
||||
if (data['version'] != 'latest') {
|
||||
[data['prefix'], data['verb']] = ['releases', 'download'];
|
||||
data['domain'] = data['github'];
|
||||
data['extension'] = '-' + data['version'] + data['extension'];
|
||||
data['url'] += ',' + (await getUrl(data));
|
||||
export async function addPhing(data: ToolData): Promise<string> {
|
||||
data.url = data.domain + '/get/phing-' + data.version + data.extension;
|
||||
if (data.version != 'latest') {
|
||||
[data.prefix, data.verb] = ['releases', 'download'];
|
||||
data.domain = data.github;
|
||||
data.extension = '-' + data.version + data.extension;
|
||||
data.url += ',' + (await getUrl(data));
|
||||
}
|
||||
return await addArchive(data);
|
||||
}
|
||||
@@ -406,33 +493,33 @@ export async function addPhing(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addPhive(data: RS): Promise<string> {
|
||||
export async function addPhive(data: ToolData): Promise<string> {
|
||||
switch (true) {
|
||||
case /5\.[3-5]/.test(data['php_version']):
|
||||
case /5\.[3-5]/.test(data.php_version):
|
||||
return await utils.addLog(
|
||||
'$cross',
|
||||
'phive',
|
||||
'Phive is not supported on PHP ' + data['php_version'],
|
||||
data['os']
|
||||
'Phive is not supported on PHP ' + data.php_version,
|
||||
data.os
|
||||
);
|
||||
case /5\.6|7\.0/.test(data['php_version']):
|
||||
data['version'] = '0.12.1';
|
||||
case /5\.6|7\.0/.test(data.php_version):
|
||||
data.version = '0.12.1';
|
||||
break;
|
||||
case /7\.1/.test(data['php_version']):
|
||||
data['version'] = '0.13.5';
|
||||
case /7\.1/.test(data.php_version):
|
||||
data.version = '0.13.5';
|
||||
break;
|
||||
case /7\.2/.test(data['php_version']):
|
||||
data['version'] = '0.14.5';
|
||||
case /7\.2/.test(data.php_version):
|
||||
data.version = '0.14.5';
|
||||
break;
|
||||
case /7\.3|7\.4/.test(data['php_version']):
|
||||
data['version'] = '0.15.3';
|
||||
case /7\.3|7\.4/.test(data.php_version):
|
||||
data.version = '0.15.3';
|
||||
break;
|
||||
case /^latest$/.test(data['version']):
|
||||
data['version'] = await getLatestVersion(data);
|
||||
case /^latest$/.test(data.version):
|
||||
data.version = await getLatestVersion(data);
|
||||
break;
|
||||
}
|
||||
data['extension'] = '-' + data['version'] + data['extension'];
|
||||
data['url'] = await getUrl(data);
|
||||
data.extension = '-' + data.version + data.extension;
|
||||
data.url = await getUrl(data);
|
||||
return await addArchive(data);
|
||||
}
|
||||
|
||||
@@ -441,16 +528,15 @@ export async function addPhive(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addPHPUnitTools(data: RS): Promise<string> {
|
||||
export async function addPHPUnitTools(data: ToolData): Promise<string> {
|
||||
/* istanbul ignore next */
|
||||
if (data['version'] === 'latest') {
|
||||
data['version'] =
|
||||
(await packagist.search(data['packagist'], data['php_version'])) ??
|
||||
'latest';
|
||||
if (data.version === 'latest') {
|
||||
data.version =
|
||||
(await packagist.search(data.packagist, data.php_version)) ?? 'latest';
|
||||
}
|
||||
data['url'] = await getPharUrl(data);
|
||||
if (data['url'].match(/-\d+/)) {
|
||||
data['url'] += ',' + data['url'].replace(/-(\d+)\.\d+\.\d+/, '-$1');
|
||||
data.url = await getPharUrl(data);
|
||||
if (data.url.match(/-\d+/)) {
|
||||
data.url += ',' + data.url.replace(/-(\d+)\.\d+\.\d+/, '-$1');
|
||||
}
|
||||
return await addArchive(data);
|
||||
}
|
||||
@@ -460,13 +546,13 @@ export async function addPHPUnitTools(data: RS): Promise<string> {
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
export async function addWPCLI(data: RS): Promise<string> {
|
||||
if (data['version'] === 'latest') {
|
||||
data['uri'] = 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
|
||||
data['url'] = [data['domain'], data['uri']].join('/');
|
||||
export async function addWPCLI(data: ToolData): Promise<string> {
|
||||
if (data.version === 'latest') {
|
||||
data.uri = 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
|
||||
data.url = [data.domain, data.uri].join('/');
|
||||
} else {
|
||||
data['extension'] = '-' + data['version'] + data['extension'];
|
||||
data['url'] = await getUrl(data);
|
||||
data.extension = '-' + data.version + data.extension;
|
||||
data.url = await getUrl(data);
|
||||
}
|
||||
return await addArchive(data);
|
||||
}
|
||||
@@ -482,56 +568,74 @@ export async function getData(
|
||||
release: string,
|
||||
php_version: string,
|
||||
os: string
|
||||
): Promise<RS> {
|
||||
): Promise<ToolData> {
|
||||
const json_file_path = path.join(__dirname, '../src/configs/tools.json');
|
||||
const json_file: string = fs.readFileSync(json_file_path, 'utf8');
|
||||
const json_objects: RSRS = JSON.parse(json_file);
|
||||
const json_objects: Record<string, ToolConfig> = JSON.parse(json_file);
|
||||
release = release.replace(/\s+/g, '');
|
||||
const parts: string[] = release.split(':');
|
||||
const tool = parts[0];
|
||||
const version = parts[1];
|
||||
let data: RS;
|
||||
if (Object.keys(json_objects).includes(tool)) {
|
||||
data = json_objects[tool];
|
||||
data['tool'] = tool;
|
||||
let config: ToolConfig & {tool: string};
|
||||
if (Object.hasOwn(json_objects, tool)) {
|
||||
config = {...json_objects[tool], tool};
|
||||
} else {
|
||||
const key: string | undefined = Object.keys(json_objects).find(
|
||||
(key: string) => {
|
||||
return json_objects[key]['alias'] == tool;
|
||||
return json_objects[key].alias == tool;
|
||||
}
|
||||
);
|
||||
if (key) {
|
||||
data = json_objects[key];
|
||||
data['tool'] = key;
|
||||
} else {
|
||||
data = {
|
||||
config = {...json_objects[key], tool: key};
|
||||
} else if (tool.includes('/')) {
|
||||
config = {
|
||||
tool: tool.split('/')[1],
|
||||
repository: tool,
|
||||
type: 'composer'
|
||||
};
|
||||
data = !tool.includes('/') ? {tool: tool} : data;
|
||||
} else {
|
||||
config = {tool};
|
||||
}
|
||||
}
|
||||
data['github'] = 'https://github.com';
|
||||
data['domain'] ??= data['github'];
|
||||
data['extension'] ??= '.phar';
|
||||
data['os'] = os;
|
||||
data['php_version'] = php_version;
|
||||
data['packagist'] ??= data['repository'];
|
||||
data['prefix'] = data['github'] === data['domain'] ? 'releases' : '';
|
||||
data['verb'] = data['github'] === data['domain'] ? 'download' : '';
|
||||
data['fetch_latest'] ??= 'false';
|
||||
data['scope'] ??= 'global';
|
||||
data['version_parameter'] = JSON.stringify(data['version_parameter']) || '';
|
||||
data['version_prefix'] ??= '';
|
||||
data['release'] = await getRelease(release, data);
|
||||
data['version'] = version
|
||||
const github = 'https://github.com';
|
||||
const domain = config.domain ?? github;
|
||||
const data: ToolData = {
|
||||
tool: config.tool,
|
||||
version: '',
|
||||
url: '',
|
||||
os,
|
||||
php_version,
|
||||
github,
|
||||
domain,
|
||||
extension: config.extension ?? '.phar',
|
||||
repository: config.repository ?? '',
|
||||
prefix: domain === github ? 'releases' : '',
|
||||
verb: domain === github ? 'download' : '',
|
||||
fetch_latest: config.fetch_latest ?? 'false',
|
||||
scope: config.scope ?? 'global',
|
||||
version_parameter:
|
||||
config.version_parameter != null
|
||||
? JSON.stringify(config.version_parameter)
|
||||
: '',
|
||||
version_prefix: config.version_prefix ?? '',
|
||||
release: '',
|
||||
packagist: config.packagist ?? config.repository ?? '',
|
||||
type: config.type,
|
||||
function: config.function,
|
||||
alias: config.alias
|
||||
};
|
||||
data.release = await getRelease(release, data);
|
||||
data.version = version
|
||||
? await getVersion(version, data)
|
||||
: await getLatestVersion(data);
|
||||
data.url = await getUrl(data);
|
||||
return data;
|
||||
}
|
||||
|
||||
export const functionRecord: Record<string, (data: RS) => Promise<string>> = {
|
||||
export const functionRecord: Record<
|
||||
ToolFunction,
|
||||
(data: ToolData) => Promise<string>
|
||||
> = {
|
||||
castor: addCastor,
|
||||
composer: addComposer,
|
||||
deployer: addDeployer,
|
||||
@@ -565,43 +669,46 @@ export async function addTools(
|
||||
}
|
||||
const tools_list = await filterList(await utils.CSVArray(tools_csv));
|
||||
await utils.asyncForEach(tools_list, async function (release: string) {
|
||||
const data: RS = await getData(release, php_version, os);
|
||||
const data: ToolData = await getData(release, php_version, os);
|
||||
script += '\n';
|
||||
switch (true) {
|
||||
case data['error'] !== undefined:
|
||||
script += await utils.addLog(
|
||||
'$cross',
|
||||
data['tool'],
|
||||
data['error'],
|
||||
data['os']
|
||||
);
|
||||
case data.error !== undefined:
|
||||
script += await utils.addLog('$cross', data.tool, data.error, data.os);
|
||||
break;
|
||||
case 'phar' === data['type']:
|
||||
data['url'] = await getUrl(data);
|
||||
case 'phar' === data.type:
|
||||
script += await addArchive(data);
|
||||
break;
|
||||
case 'composer' === data['type']:
|
||||
case 'composer' === data.type:
|
||||
script += await addPackage(data);
|
||||
break;
|
||||
case 'custom-package' === data['type']:
|
||||
case 'custom-package' === data.type:
|
||||
script += await utils.customPackage(
|
||||
data['tool'].split('-')[0],
|
||||
data.tool.split('-')[0],
|
||||
'tools',
|
||||
data['version'],
|
||||
data['os']
|
||||
data.version,
|
||||
data.os
|
||||
);
|
||||
break;
|
||||
case 'custom-function' === data['type']:
|
||||
script += await functionRecord[data['function']](data);
|
||||
case 'custom-function' === data.type:
|
||||
if (!data.function) {
|
||||
script += await utils.addLog(
|
||||
'$cross',
|
||||
data.tool,
|
||||
data.tool + ' has no function defined. Please report this issue.',
|
||||
data.os
|
||||
);
|
||||
} else {
|
||||
script += await functionRecord[data.function](data);
|
||||
}
|
||||
break;
|
||||
case /^none$/.test(data['tool']):
|
||||
case /^none$/.test(data.tool):
|
||||
break;
|
||||
default:
|
||||
script += await utils.addLog(
|
||||
'$cross',
|
||||
data['tool'],
|
||||
'Tool ' + data['tool'] + ' is not supported',
|
||||
data['os']
|
||||
data.tool,
|
||||
'Tool ' + data.tool + ' is not supported',
|
||||
data.os
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
15
src/utils.ts
15
src/utils.ts
@@ -1,6 +1,6 @@
|
||||
import fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as core from '@actions/core';
|
||||
import * as core from './core';
|
||||
import * as fetch from './fetch';
|
||||
|
||||
/**
|
||||
@@ -62,7 +62,7 @@ export async function getManifestURLS(): Promise<string[]> {
|
||||
*/
|
||||
export async function parseVersion(version: string): Promise<string> {
|
||||
switch (true) {
|
||||
case /^(latest|lowest|highest|nightly|\d+\.x)$/.test(version):
|
||||
case /^(latest|lowest|highest|nightly|master|\d+\.x)$/.test(version):
|
||||
for (const manifestURL of await getManifestURLS()) {
|
||||
const fetchResult = await fetch.fetch(manifestURL);
|
||||
if (fetchResult['data'] ?? false) {
|
||||
@@ -97,9 +97,8 @@ export async function parseIniFile(ini_file: string): Promise<string> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Async foreach loop
|
||||
* Async foreach loop using modern for...of pattern
|
||||
*
|
||||
* @author https://github.com/Atinux
|
||||
* @param array
|
||||
* @param callback
|
||||
*/
|
||||
@@ -111,8 +110,8 @@ export async function asyncForEach(
|
||||
array: Array<string>
|
||||
) => Promise<void>
|
||||
): Promise<void> {
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
await callback(array[index], index, array);
|
||||
for (const [index, element] of array.entries()) {
|
||||
await callback(element, index, array);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,10 +284,10 @@ export async function getExtensionPrefix(extension: string): Promise<string> {
|
||||
export async function suppressOutput(os: string): Promise<string> {
|
||||
switch (os) {
|
||||
case 'win32':
|
||||
return ' ';
|
||||
return ' >$null 2>&1';
|
||||
case 'linux':
|
||||
case 'darwin':
|
||||
return ' ';
|
||||
return ' >/dev/null 2>&1';
|
||||
default:
|
||||
return await log('Platform ' + os + ' is not supported', os, 'error');
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"declaration": true,
|
||||
"esModuleInterop": true,
|
||||
"lib": [
|
||||
"ES2021"
|
||||
"ES2024"
|
||||
],
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
@@ -13,7 +13,7 @@
|
||||
"rootDir": "./src",
|
||||
"sourceMap": true,
|
||||
"strict": true,
|
||||
"target": "ES2021"
|
||||
"target": "ES2024"
|
||||
},
|
||||
"exclude": ["__tests__", "lib", "node_modules"]
|
||||
}
|
||||
Reference in New Issue
Block a user