cache-extensions 1.13.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  <a href="https://github.com/shivammathur/cache-extensions" title="Cache PHP extensions in GitHub Actions"><img alt="GitHub Actions status" src="https://github.com/shivammathur/cache-extensions/workflows/Node%20test%20workflow/badge.svg"></a>
5
5
  <a href="https://codecov.io/gh/shivammathur/cache-extensions" title="Code coverage"><img alt="Codecov Code Coverage" src="https://codecov.io/gh/shivammathur/cache-extensions/branch/master/graph/badge.svg"></a>
6
6
  <a href="https://github.com/shivammathur/cache-extensions/blob/master/LICENSE" title="license"><img alt="LICENSE" src="https://img.shields.io/badge/license-MIT-428f7e.svg?logo=open%20source%20initiative&logoColor=white&labelColor=555555"></a>
7
- <a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-5.3%20to%208.5-777bb3.svg?logo=php&logoColor=white&labelColor=555555"></a>
7
+ <a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-5.3%20to%208.6-777bb3.svg?logo=php&logoColor=white&labelColor=555555"></a>
8
8
  </p>
9
9
 
10
10
  Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "GitHub Actions"). This action has to be used along with [shivammathur/setup-php](https://github.com/shivammathur/setup-php "Setup PHP") and [actions/cache](https://github.com/actions/cache "Cache in GitHub Actions") GitHub Actions. It configures the environment required to cache PHP extensions. Refer to [Usage](#memo-usage "How to use this") section for details and example workflow.
@@ -15,6 +15,7 @@ Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "Gi
15
15
  - [OS/Platform Support](#cloud-osplatform-support)
16
16
  - [Usage](#memo-usage)
17
17
  - [Inputs](#inputs)
18
+ - [Flags](#flags)
18
19
  - [Workflow](#workflow)
19
20
  - [Thread Safe Setup](#thread-safe-setup)
20
21
  - [License](#scroll-license)
@@ -24,23 +25,24 @@ Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "Gi
24
25
 
25
26
  ## :tada: PHP Support
26
27
 
27
- |PHP Version|Stability|Release Support|
28
- |--- |--- |--- |
29
- |5.3|`Stable`|`End of life`|
30
- |5.4|`Stable`|`End of life`|
31
- |5.5|`Stable`|`End of life`|
32
- |5.6|`Stable`|`End of life`|
33
- |7.0|`Stable`|`End of life`|
34
- |7.1|`Stable`|`End of life`|
35
- |7.2|`Stable`|`End of life`|
36
- |7.3|`Stable`|`End of life`|
37
- |7.4|`Stable`|`End of life`|
38
- |8.0|`Stable`|`End of life`|
39
- |8.1|`Stable`|`Security fixes only`|
40
- |8.2|`Stable`|`Security fixes only`|
41
- |8.3|`Stable`|`Active`|
42
- |8.4|`Stable`|`Active`|
43
- |8.5|`Nightly`|`In development`|
28
+ | PHP Version |Stability|Release Support|
29
+ |-------------|--- |--- |
30
+ | 5.3 |`Stable`|`End of life`|
31
+ | 5.4 |`Stable`|`End of life`|
32
+ | 5.5 |`Stable`|`End of life`|
33
+ | 5.6 |`Stable`|`End of life`|
34
+ | 7.0 |`Stable`|`End of life`|
35
+ | 7.1 |`Stable`|`End of life`|
36
+ | 7.2 |`Stable`|`End of life`|
37
+ | 7.3 |`Stable`|`End of life`|
38
+ | 7.4 |`Stable`|`End of life`|
39
+ | 8.0 |`Stable`|`End of life`|
40
+ | 8.1 |`Stable`|`Security fixes only`|
41
+ | 8.2 |`Stable`|`Security fixes only`|
42
+ | 8.3 |`Stable`|`Active`|
43
+ | 8.4 |`Stable`|`Active`|
44
+ | 8.5 |`Stable`|`Active`|
45
+ | 8.6 |`Nightly`|`In development`|
44
46
 
45
47
  ## :cloud: OS/Platform Support
46
48
 
@@ -52,10 +54,11 @@ Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "Gi
52
54
  | Ubuntu 22.04 | aarch64 | `ubuntu-22.04-arm` |
53
55
  | Windows Server 2025 | x64 | `windows-2025` |
54
56
  | Windows Server 2022 | x64 | `windows-latest` or `windows-2022` |
55
- | Windows Server 2019 | x64 | `windows-2019` |
56
- | macOS Sequoia 15.x | arm64 | `macos-15` |
57
- | macOS Sonoma 14.x | arm64 | `macos-latest` or `macos-14` |
58
- | macOS Ventura 13.x | x86_64 | `macos-13` |
57
+ | macOS Tahoe 26.x | arm64 | `macos-26` |
58
+ | macOS Sequoia 15.x | arm64 | `macos-latest` or `macos-15` |
59
+ | macOS Sonoma 14.x | arm64 | `macos-14` |
60
+ | macOS Tahoe 26.x | x86_64 | `macos-26-intel` |
61
+ | macOS Sequoia 15.x | x86_64 | `macos-15-intel` |
59
62
 
60
63
  **Note**: Support for self-hosted runners for the above operating systems is in beta. If you use this action on a self-hosted runner, please report any issues you find.
61
64
 
@@ -68,7 +71,7 @@ Use this GitHub Action when the extensions you are adding in [setup-php](https:/
68
71
  #### `php-version` (optional)
69
72
 
70
73
  - Specify the PHP version you want to set up.
71
- - Accepts a `string`. For example `'8.0'`.
74
+ - Accepts a `string`. For example `'8.5'`.
72
75
  - Accepts `latest` to set up the latest stable PHP version.
73
76
  - Accepts `nightly` to set up a nightly build from the master branch of PHP.
74
77
  - Accepts the format `d.x`, where `d` is the major version. For example `5.x`, `7.x` and `8.x`.
@@ -97,6 +100,34 @@ Use this GitHub Action when the extensions you are adding in [setup-php](https:/
97
100
 
98
101
  See [action.yml](action.yml "Metadata for this GitHub Action") and usage below for more info.
99
102
 
103
+ ### Flags
104
+
105
+ > Specify using the `env` keyword
106
+
107
+ #### `share-cache-across-jobs` (optional)
108
+
109
+ - Specify `true` to share the cache across jobs in the same workflow.
110
+ - By default, it is set to `false` and the job ID is included in the cache key.
111
+
112
+ #### `share-cache-across-workflows` (optional)
113
+
114
+ - Specify `true` to share the cache across workflows for the same job ID.
115
+ - By default, it is set to `false` and the workflow ID is included in the cache key.
116
+ - Enable both flags to share the cache across all jobs and workflows in the repository.
117
+
118
+ ```yaml
119
+ - name: Setup cache environment
120
+ id: extcache
121
+ uses: shivammathur/cache-extensions@v1
122
+ with:
123
+ php-version: ${{ matrix.php-versions }}
124
+ extensions: ${{ env.extensions }}
125
+ key: ${{ env.key }}
126
+ env:
127
+ share-cache-across-jobs: true
128
+ share-cache-across-workflows: true
129
+ ```
130
+
100
131
  ### Workflow
101
132
 
102
133
  > Cache extensions in a PHP workflow
@@ -108,14 +139,14 @@ jobs:
108
139
  strategy:
109
140
  matrix:
110
141
  operating-system: [ubuntu-latest, windows-latest, macos-latest]
111
- php-versions: ['8.1', '8.2', '8.3']
142
+ php-versions: ['8.3', '8.4', '8.5']
112
143
  name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}
113
144
  env:
114
145
  extensions: intl, pcov
115
146
  key: cache-v1 # can be any string, change to clear the extension cache.
116
147
  steps:
117
148
  - name: Checkout
118
- uses: actions/checkout@v4
149
+ uses: actions/checkout@v5
119
150
 
120
151
  - name: Setup cache environment
121
152
  id: extcache
package/lib/cache.d.ts CHANGED
@@ -1,2 +1,8 @@
1
- export declare function handleDependencies(extensions: string, version: string): Promise<void>;
1
+ export declare function getErrorMessage(error: unknown): string;
2
+ export declare function normalizeModulePath(path: string): string;
3
+ export declare function shouldHandleDependencies(version: string, platform?: NodeJS.Platform): boolean;
4
+ export declare function handleDependencies(extensions: string, version: string, platform?: NodeJS.Platform): Promise<void>;
2
5
  export declare function run(): Promise<void>;
6
+ export declare function main(runAction?: () => Promise<void>): Promise<void>;
7
+ export declare function isMainModule(argv1?: string | undefined, moduleUrl?: string): boolean;
8
+ export declare function bootstrap(argv1?: string | undefined, moduleUrl?: string, runAction?: () => Promise<void>): Promise<void>;
package/lib/cache.js CHANGED
@@ -1,86 +1,91 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
1
+ import { exec } from '@actions/exec';
2
+ import * as cache from '@actions/cache';
3
+ import * as core from '@actions/core';
4
+ import * as spu from 'setup-php/lib/utils.js';
5
+ import { existsSync, realpathSync } from 'node:fs';
6
+ import { join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import * as utils from './utils.js';
9
+ const DEPENDENCY_CACHE_DIR = 'deps';
10
+ const DEPENDENCY_CACHE_PLATFORMS = new Set([
11
+ 'darwin',
12
+ 'linux'
13
+ ]);
14
+ const SKIP_DEPENDENCY_CACHE_VERSIONS = /^5\.[3-5]$/;
15
+ export function getErrorMessage(error) {
16
+ return error instanceof Error ? error.message : String(error);
17
+ }
18
+ export function normalizeModulePath(path) {
19
+ const resolvedPath = resolve(path);
20
+ return existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;
21
+ }
22
+ export function shouldHandleDependencies(version, platform = process.platform) {
23
+ return (!SKIP_DEPENDENCY_CACHE_VERSIONS.test(version) &&
24
+ DEPENDENCY_CACHE_PLATFORMS.has(platform));
25
+ }
26
+ export async function handleDependencies(extensions, version, platform = process.platform) {
27
+ if (!shouldHandleDependencies(version, platform)) {
28
+ return;
7
29
  }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.handleDependencies = handleDependencies;
37
- exports.run = run;
38
- const exec_1 = require("@actions/exec");
39
- const cache = __importStar(require("@actions/cache"));
40
- const core = __importStar(require("@actions/core"));
41
- const spu = __importStar(require("setup-php/lib/utils"));
42
- const fs = __importStar(require("fs"));
43
- const path = __importStar(require("path"));
44
- const utils = __importStar(require("./utils"));
45
- async function handleDependencies(extensions, version) {
46
- if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) {
47
- const cache_key = (await utils.getOutput('key')) + '-deps';
48
- const cache_dir = path.join(await spu.readEnv('RUNNER_TOOL_CACHE'), 'deps');
49
- const cache_hit = await cache.restoreCache([cache_dir], cache_key, [cache_key]);
50
- await (0, exec_1.exec)(await utils.scriptCall('dependencies', extensions, version));
51
- if (!cache_hit && fs.existsSync(cache_dir)) {
52
- try {
53
- await cache.saveCache([cache_dir], cache_key);
54
- }
55
- catch {
56
- await cache.saveCache([cache_dir], cache_key + '-take-2');
57
- }
58
- }
30
+ const cacheKey = `${await utils.getOutput('key')}-deps`;
31
+ const cacheDir = join(await spu.readEnv('RUNNER_TOOL_CACHE'), DEPENDENCY_CACHE_DIR);
32
+ const cacheHit = await cache.restoreCache([cacheDir], cacheKey, [cacheKey]);
33
+ const dependencyScript = utils.scriptCall('dependencies', extensions, version);
34
+ await exec(dependencyScript.command, dependencyScript.args);
35
+ if (cacheHit || !existsSync(cacheDir)) {
36
+ return;
37
+ }
38
+ try {
39
+ await cache.saveCache([cacheDir], cacheKey);
40
+ }
41
+ catch {
42
+ await cache.saveCache([cacheDir], `${cacheKey}-take-2`);
59
43
  }
60
44
  }
61
- async function run() {
45
+ export async function run() {
62
46
  try {
63
47
  const version = await spu.parseVersion(await spu.readPHPVersion());
64
- const extensions = await utils.filterExtensions(await spu.getInput('extensions', true));
48
+ const extensions = utils.filterExtensions(await spu.getInput('extensions', true));
65
49
  const key = await spu.getInput('key', true);
66
- await (0, exec_1.exec)(await utils.scriptCall('data', extensions, version, key));
50
+ const shareCacheAcrossJobs = (await spu.readEnv('share-cache-across-jobs')) === 'true'
51
+ ? 'true'
52
+ : 'false';
53
+ const shareCacheAcrossWorkflows = (await spu.readEnv('share-cache-across-workflows')) === 'true'
54
+ ? 'true'
55
+ : 'false';
56
+ const dataScript = utils.scriptCall('data', extensions, version, key, shareCacheAcrossJobs, shareCacheAcrossWorkflows);
57
+ await exec(dataScript.command, dataScript.args);
67
58
  await handleDependencies(extensions, version);
68
59
  }
69
60
  catch (error) {
70
- core.setFailed(error.message);
61
+ core.setFailed(getErrorMessage(error));
71
62
  }
72
63
  }
73
- (async () => {
74
- await run();
75
- })().catch(error => {
76
- if (error.name === cache.ValidationError.name) {
77
- core.setFailed(error.message);
64
+ export async function main(runAction = run) {
65
+ try {
66
+ await runAction();
78
67
  }
79
- else if (error.name === cache.ReserveCacheError.name) {
80
- core.info(error.message);
68
+ catch (error) {
69
+ const message = getErrorMessage(error);
70
+ if (error instanceof cache.ValidationError) {
71
+ core.setFailed(message);
72
+ return;
73
+ }
74
+ if (error instanceof cache.ReserveCacheError) {
75
+ core.info(message);
76
+ return;
77
+ }
78
+ core.warning(message);
81
79
  }
82
- else {
83
- core.warning(error.message);
80
+ }
81
+ export function isMainModule(argv1 = process.argv[1], moduleUrl = import.meta.url) {
82
+ return (!!argv1 &&
83
+ normalizeModulePath(argv1) === normalizeModulePath(fileURLToPath(moduleUrl)));
84
+ }
85
+ export async function bootstrap(argv1 = process.argv[1], moduleUrl = import.meta.url, runAction = main) {
86
+ if (isMainModule(argv1, moduleUrl)) {
87
+ await runAction();
84
88
  }
85
- });
89
+ }
90
+ await bootstrap();
86
91
  //# sourceMappingURL=cache.js.map
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,gDAwBC;AAKD,kBAYC;AAvDD,wCAAmC;AACnC,sDAAwC;AACxC,oDAAsC;AACtC,yDAA2C;AAC3C,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AAQ1B,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,OAAe;IAEf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,SAAS,GAAW,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;QACnE,MAAM,SAAS,GAAW,IAAI,CAAC,IAAI,CACjC,MAAM,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,EACtC,MAAM,CACP,CAAC;QACF,MAAM,SAAS,GAAuB,MAAM,KAAK,CAAC,YAAY,CAC5D,CAAC,SAAS,CAAC,EACX,SAAS,EACT,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,IAAA,WAAI,EAAC,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAKM,KAAK,UAAU,GAAG;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAW,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAW,MAAM,KAAK,CAAC,gBAAgB,CACrD,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CACvC,CAAC;QACF,MAAM,GAAG,GAAW,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,IAAA,WAAI,EAAC,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,SAAS,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAGD,CAAC,KAAK,IAAI,EAAE;IACV,MAAM,GAAG,EAAE,CAAC;AACd,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACjB,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/lib/utils.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ export declare const SCRIPT_PATH: string;
2
+ export type ScriptCall = {
3
+ command: 'bash';
4
+ args: [string, string, ...string[]];
5
+ };
1
6
  export declare function getOutput(output: string): Promise<string>;
2
- export declare function filterExtensions(extension_csv: string): Promise<string>;
3
- export declare function scriptCall(fn: string, ...args: string[]): Promise<string>;
7
+ export declare function filterExtensions(extension_csv: string): string;
8
+ export declare function scriptCall(fn: string, ...args: string[]): ScriptCall;
package/lib/utils.js CHANGED
@@ -1,57 +1,22 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.getOutput = getOutput;
37
- exports.filterExtensions = filterExtensions;
38
- exports.scriptCall = scriptCall;
39
- const fs = __importStar(require("fs"));
40
- const path = __importStar(require("path"));
41
- const spu = __importStar(require("setup-php/lib/utils"));
42
- async function getOutput(output) {
43
- return fs.readFileSync(path.join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import * as spu from 'setup-php/lib/utils.js';
4
+ export const SCRIPT_PATH = join(import.meta.dirname, '../src/scripts/cache.sh');
5
+ export async function getOutput(output) {
6
+ return readFile(join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
44
7
  }
45
- async function filterExtensions(extension_csv) {
46
- return JSON.stringify(extension_csv
8
+ export function filterExtensions(extension_csv) {
9
+ return extension_csv
47
10
  .split(',')
48
11
  .filter(extension => {
49
12
  return extension.trim()[0] != ':';
50
13
  })
51
- .join(','));
14
+ .join(',');
52
15
  }
53
- async function scriptCall(fn, ...args) {
54
- const script = path.join(__dirname, '../src/scripts/cache.sh');
55
- return ['bash', script, fn, ...args].join(' ');
16
+ export function scriptCall(fn, ...args) {
17
+ return {
18
+ command: 'bash',
19
+ args: [SCRIPT_PATH, fn, ...args]
20
+ };
56
21
  }
57
22
  //# sourceMappingURL=utils.js.map
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8BAKC;AAOD,4CASC;AAQD,gCAMC;AA1CD,uCAAyB;AACzB,2CAA6B;AAC7B,yDAA2C;AAKpC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,OAAO,EAAE,CAAC,YAAY,CACpB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,EACnD,MAAM,CACP,CAAC;AACJ,CAAC;AAOM,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IAC1D,OAAO,IAAI,CAAC,SAAS,CACnB,aAAa;SACV,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,SAAS,CAAC,EAAE;QAClB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAQM,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,GAAG,IAAc;IAEjB,MAAM,MAAM,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,KAAK,GAAG,MAAM,wBAAwB,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;AAUhF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAC,aAAqB;IACpD,OAAO,aAAa;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,SAAS,CAAC,EAAE;QAClB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAQD,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,GAAG,IAAc;IACtD,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "cache-extensions",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "private": false,
5
5
  "description": "Cache PHP extensions in GitHub Actions",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=24"
9
+ },
6
10
  "main": "lib/cache.js",
7
11
  "types": "lib/cache.d.ts",
8
12
  "directories": {
@@ -19,8 +23,8 @@
19
23
  "lint": "eslint **/src/*.ts --cache --fix",
20
24
  "format": "prettier --write **/src/*.ts && git add .",
21
25
  "format-check": "prettier --check **/src/*.ts",
22
- "release": "ncc build -m -o dist && git add -f dist/",
23
- "test": "jest"
26
+ "release": "ncc build src/cache.ts -m && git add -f dist/",
27
+ "test": "node --disable-warning=ExperimentalWarning --experimental-vm-modules node_modules/jest/bin/jest.js"
24
28
  },
25
29
  "repository": {
26
30
  "type": "git",
@@ -35,31 +39,40 @@
35
39
  "author": "shivammathur",
36
40
  "license": "MIT",
37
41
  "dependencies": {
38
- "@actions/cache": "^4.0.5",
39
- "@actions/core": "^1.11.1",
40
- "@actions/exec": "^1.1.1",
41
- "setup-php": "2.35.3"
42
+ "@actions/cache": "^6.2.0",
43
+ "@actions/core": "^3.0.1",
44
+ "@actions/exec": "^3.0.0",
45
+ "setup-php": "^2.37.2"
42
46
  },
43
47
  "devDependencies": {
44
- "@eslint/compat": "^1.3.2",
48
+ "@eslint/compat": "^2.1.0",
49
+ "@eslint/eslintrc": "^3.3.6",
50
+ "@eslint/js": "^10.0.1",
45
51
  "@types/jest": "^30.0.0",
46
- "@types/node": "^24.3.0",
47
- "@typescript-eslint/eslint-plugin": "^8.40.0",
48
- "@typescript-eslint/parser": "^8.40.0",
49
- "@vercel/ncc": "^0.38.3",
50
- "eslint": "^9.33.0",
52
+ "@types/node": "^26.2.0",
53
+ "@typescript-eslint/eslint-plugin": "^8.67.0",
54
+ "@typescript-eslint/parser": "^8.67.0",
55
+ "@typescript/native": "npm:typescript@^7.0.2",
56
+ "@vercel/ncc": "^0.44.1",
57
+ "eslint": "^10.8.1",
51
58
  "eslint-config-prettier": "^10.1.8",
52
- "eslint-plugin-import": "^2.32.0",
53
- "eslint-plugin-jest": "^29.0.1",
54
- "eslint-plugin-prettier": "^5.5.4",
55
- "jest": "^30.0.5",
56
- "jest-circus": "^30.0.5",
57
- "prettier": "^3.6.2",
58
- "ts-jest": "^29.4.1",
59
- "typescript": "^5.9.2"
59
+ "eslint-import-resolver-typescript": "^4.4.5",
60
+ "eslint-plugin-import-x": "^4.17.1",
61
+ "eslint-plugin-jest": "^29.16.0",
62
+ "eslint-plugin-prettier": "^5.5.6",
63
+ "globals": "^17.9.0",
64
+ "jest": "^30.4.2",
65
+ "jest-circus": "^30.4.2",
66
+ "prettier": "^3.9.6",
67
+ "ts-jest": "^29.4.12",
68
+ "ts-node": "^10.9.2",
69
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
60
70
  },
61
71
  "overrides": {
62
- "test-exclude": "^7.0.1"
72
+ "brace-expansion@1.x": "^1.1.18",
73
+ "test-exclude": "^7.0.1",
74
+ "glob": "^13.0.6",
75
+ "undici": "^6.23.0"
63
76
  },
64
77
  "bugs": {
65
78
  "url": "https://github.com/shivammathur/cache-extensions/issues"
package/src/cache.ts CHANGED
@@ -1,40 +1,77 @@
1
1
  import {exec} from '@actions/exec';
2
2
  import * as cache from '@actions/cache';
3
3
  import * as core from '@actions/core';
4
- import * as spu from 'setup-php/lib/utils';
5
- import * as fs from 'fs';
6
- import * as path from 'path';
7
- import * as utils from './utils';
4
+ import * as spu from 'setup-php/lib/utils.js';
5
+ import {existsSync, realpathSync} from 'node:fs';
6
+ import {join, resolve} from 'node:path';
7
+ import {fileURLToPath} from 'node:url';
8
+ import * as utils from './utils.js';
9
+
10
+ const DEPENDENCY_CACHE_DIR = 'deps';
11
+ const DEPENDENCY_CACHE_PLATFORMS = new Set<NodeJS.Platform>([
12
+ 'darwin',
13
+ 'linux'
14
+ ]);
15
+ const SKIP_DEPENDENCY_CACHE_VERSIONS = /^5\.[3-5]$/;
16
+
17
+ export function getErrorMessage(error: unknown): string {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+
21
+ export function normalizeModulePath(path: string): string {
22
+ const resolvedPath = resolve(path);
23
+
24
+ return existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;
25
+ }
26
+
27
+ export function shouldHandleDependencies(
28
+ version: string,
29
+ platform: NodeJS.Platform = process.platform
30
+ ): boolean {
31
+ return (
32
+ !SKIP_DEPENDENCY_CACHE_VERSIONS.test(version) &&
33
+ DEPENDENCY_CACHE_PLATFORMS.has(platform)
34
+ );
35
+ }
8
36
 
9
37
  /**
10
38
  * Handle dependencies
11
39
  *
12
40
  * @param extensions
13
41
  * @param version
42
+ * @param platform
14
43
  */
15
44
  export async function handleDependencies(
16
45
  extensions: string,
17
- version: string
46
+ version: string,
47
+ platform: NodeJS.Platform = process.platform
18
48
  ): Promise<void> {
19
- if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) {
20
- const cache_key: string = (await utils.getOutput('key')) + '-deps';
21
- const cache_dir: string = path.join(
22
- await spu.readEnv('RUNNER_TOOL_CACHE'),
23
- 'deps'
24
- );
25
- const cache_hit: string | undefined = await cache.restoreCache(
26
- [cache_dir],
27
- cache_key,
28
- [cache_key]
29
- );
30
- await exec(await utils.scriptCall('dependencies', extensions, version));
31
- if (!cache_hit && fs.existsSync(cache_dir)) {
32
- try {
33
- await cache.saveCache([cache_dir], cache_key);
34
- } catch {
35
- await cache.saveCache([cache_dir], cache_key + '-take-2');
36
- }
37
- }
49
+ if (!shouldHandleDependencies(version, platform)) {
50
+ return;
51
+ }
52
+
53
+ const cacheKey = `${await utils.getOutput('key')}-deps`;
54
+ const cacheDir = join(
55
+ await spu.readEnv('RUNNER_TOOL_CACHE'),
56
+ DEPENDENCY_CACHE_DIR
57
+ );
58
+ const cacheHit = await cache.restoreCache([cacheDir], cacheKey, [cacheKey]);
59
+ const dependencyScript = utils.scriptCall(
60
+ 'dependencies',
61
+ extensions,
62
+ version
63
+ );
64
+
65
+ await exec(dependencyScript.command, dependencyScript.args);
66
+
67
+ if (cacheHit || !existsSync(cacheDir)) {
68
+ return;
69
+ }
70
+
71
+ try {
72
+ await cache.saveCache([cacheDir], cacheKey);
73
+ } catch {
74
+ await cache.saveCache([cacheDir], `${cacheKey}-take-2`);
38
75
  }
39
76
  }
40
77
 
@@ -43,27 +80,75 @@ export async function handleDependencies(
43
80
  */
44
81
  export async function run(): Promise<void> {
45
82
  try {
46
- const version: string = await spu.parseVersion(await spu.readPHPVersion());
47
- const extensions: string = await utils.filterExtensions(
83
+ const version = await spu.parseVersion(await spu.readPHPVersion());
84
+ const extensions = utils.filterExtensions(
48
85
  await spu.getInput('extensions', true)
49
86
  );
50
- const key: string = await spu.getInput('key', true);
51
- await exec(await utils.scriptCall('data', extensions, version, key));
87
+ const key = await spu.getInput('key', true);
88
+ const shareCacheAcrossJobs =
89
+ (await spu.readEnv('share-cache-across-jobs')) === 'true'
90
+ ? 'true'
91
+ : 'false';
92
+ const shareCacheAcrossWorkflows =
93
+ (await spu.readEnv('share-cache-across-workflows')) === 'true'
94
+ ? 'true'
95
+ : 'false';
96
+ const dataScript = utils.scriptCall(
97
+ 'data',
98
+ extensions,
99
+ version,
100
+ key,
101
+ shareCacheAcrossJobs,
102
+ shareCacheAcrossWorkflows
103
+ );
104
+
105
+ await exec(dataScript.command, dataScript.args);
52
106
  await handleDependencies(extensions, version);
53
107
  } catch (error) {
54
- core.setFailed((error as Error).message);
108
+ core.setFailed(getErrorMessage(error));
109
+ }
110
+ }
111
+
112
+ export async function main(
113
+ runAction: () => Promise<void> = run
114
+ ): Promise<void> {
115
+ try {
116
+ await runAction();
117
+ } catch (error) {
118
+ const message = getErrorMessage(error);
119
+
120
+ if (error instanceof cache.ValidationError) {
121
+ core.setFailed(message);
122
+ return;
123
+ }
124
+
125
+ if (error instanceof cache.ReserveCacheError) {
126
+ core.info(message);
127
+ return;
128
+ }
129
+
130
+ core.warning(message);
55
131
  }
56
132
  }
57
133
 
58
- // call the run function
59
- (async () => {
60
- await run();
61
- })().catch(error => {
62
- if (error.name === cache.ValidationError.name) {
63
- core.setFailed(error.message);
64
- } else if (error.name === cache.ReserveCacheError.name) {
65
- core.info(error.message);
66
- } else {
67
- core.warning(error.message);
134
+ export function isMainModule(
135
+ argv1: string | undefined = process.argv[1],
136
+ moduleUrl: string = import.meta.url
137
+ ): boolean {
138
+ return (
139
+ !!argv1 &&
140
+ normalizeModulePath(argv1) === normalizeModulePath(fileURLToPath(moduleUrl))
141
+ );
142
+ }
143
+
144
+ export async function bootstrap(
145
+ argv1: string | undefined = process.argv[1],
146
+ moduleUrl: string = import.meta.url,
147
+ runAction: () => Promise<void> = main
148
+ ): Promise<void> {
149
+ if (isMainModule(argv1, moduleUrl)) {
150
+ await runAction();
68
151
  }
69
- });
152
+ }
153
+
154
+ await bootstrap();
@@ -0,0 +1,65 @@
1
+ amqp
2
+ apcu
3
+ ast
4
+ brotli
5
+ couchbase
6
+ decimal
7
+ ds
8
+ event
9
+ excimer
10
+ expect
11
+ gearman
12
+ gmagick
13
+ gnupg
14
+ grpc
15
+ igbinary
16
+ imagick
17
+ imap
18
+ interbase
19
+ lua
20
+ mailparse
21
+ maxminddb
22
+ mcrypt
23
+ memcache
24
+ memcached
25
+ mongodb
26
+ mongodb1
27
+ msgpack
28
+ newrelic
29
+ oauth
30
+ opentelemetry
31
+ pcov
32
+ pdo_firebird
33
+ pdo_sqlsrv
34
+ pecl_http
35
+ phalcon3
36
+ phalcon4
37
+ phalcon5
38
+ pinba
39
+ propro
40
+ protobuf
41
+ psr
42
+ raphf
43
+ rdkafka
44
+ redis
45
+ scalar_objects
46
+ seaslog
47
+ snmp
48
+ spx
49
+ sqlsrv
50
+ ssh2
51
+ swoole
52
+ swow
53
+ uopz
54
+ uploadprogress
55
+ uuid
56
+ v8js
57
+ vips
58
+ vld
59
+ xdebug
60
+ xdebug2
61
+ xhprof
62
+ xlswriter
63
+ yaml
64
+ zmq
65
+ zstd
@@ -247,10 +247,8 @@ libinih1
247
247
  libintl-perl
248
248
  libintl-xs-perl
249
249
  libio-html-perl
250
- libio-pty-perl
251
250
  libip4tc2
252
251
  libip6tc2
253
- libipc-run-perl
254
252
  libisc-export1105
255
253
  libisl23
256
254
  libisns0
@@ -303,6 +301,9 @@ liblqr-1-0-dev
303
301
  liblsan0
304
302
  libltdl-dev
305
303
  libltdl7
304
+ liblttng-ust-common1
305
+ liblttng-ust-ctl5
306
+ liblttng-ust1
306
307
  liblua5.3-0
307
308
  liblvm2cmd2.03
308
309
  liblwp-mediatypes-perl
@@ -514,6 +515,7 @@ libnsl2
514
515
  libnspr4
515
516
  libnss-systemd
516
517
  libnss3
518
+ libnss3-tools
517
519
  libntfs-3g89
518
520
  libnuma1
519
521
  libobjc-11-dev
@@ -643,7 +645,6 @@ libssl3
643
645
  libstdc++-10-dev
644
646
  libstdc++-11-dev
645
647
  libstdc++-12-dev
646
- libstdc++-9-dev
647
648
  libstdc++6
648
649
  libstemmer0d
649
650
  libsvn1
@@ -95,7 +95,6 @@ libdbus-1-3
95
95
  libdbusmenu-glib4
96
96
  libdbusmenu-gtk3-4
97
97
  libdconf1
98
- libde265-0
99
98
  libdebconfclient0
100
99
  libdeflate0
101
100
  libdevmapper-event1.02.1
@@ -189,7 +188,6 @@ libharfbuzz0b
189
188
  libhashkit2t64
190
189
  libhavege2
191
190
  libheif-plugin-aomdec
192
- libheif-plugin-libde265
193
191
  libheif1
194
192
  libhogweed6t64
195
193
  libhtml-parser-perl
@@ -209,10 +207,8 @@ libinih1
209
207
  libintl-perl
210
208
  libintl-xs-perl
211
209
  libio-html-perl
212
- libio-pty-perl
213
210
  libip4tc2
214
211
  libip6tc2
215
- libipc-run-perl
216
212
  libisl23
217
213
  libisns0t64
218
214
  libitm1
@@ -248,6 +244,7 @@ libllvm16t64
248
244
  libllvm17t64
249
245
  libllvm18
250
246
  libllvm19
247
+ libllvm20
251
248
  liblmdb0
252
249
  liblocale-gettext-perl
253
250
  liblqr-1-0
@@ -306,6 +303,7 @@ libnpth0t64
306
303
  libnspr4
307
304
  libnss-systemd
308
305
  libnss3
306
+ libnss3-tools
309
307
  libntfs-3g89t64
310
308
  libnuma1
311
309
  libnvme1t64
@@ -470,7 +468,6 @@ libvulkan1
470
468
  libwayland-client0
471
469
  libwayland-cursor0
472
470
  libwayland-egl1
473
- libwayland-server0
474
471
  libwbclient0
475
472
  libwebp7
476
473
  libwebpdemux2
@@ -42,6 +42,8 @@ get_api_version() {
42
42
  8.1) echo "20210902" ;;
43
43
  8.2) echo "20220829" ;;
44
44
  8.3) echo "20230831" ;;
45
+ 8.4) echo "20240924" ;;
46
+ 8.5) echo "20250925" ;;
45
47
  *) get_api_version_from_repo ;;
46
48
  esac
47
49
  }
@@ -86,9 +88,20 @@ linux_php_semver() {
86
88
  fi
87
89
  }
88
90
 
91
+ get_cache_scope() {
92
+ local scope="${GITHUB_REPOSITORY}"
93
+ if [ "${share_cache_across_workflows:-false}" != "true" ]; then
94
+ scope="$scope-${GITHUB_WORKFLOW}"
95
+ fi
96
+ if [ "$runner" = "github" ] && [ "${share_cache_across_jobs:-false}" != "true" ]; then
97
+ scope="$scope-${GITHUB_JOB}"
98
+ fi
99
+ echo "$scope"
100
+ }
101
+
89
102
  data() {
90
103
  old_versions="5.[3-5]"
91
- date='20240716'
104
+ date='20260314'
92
105
  arch=$(uname -m)
93
106
  if [ "$os" = "Linux" ]; then
94
107
  . /etc/os-release
@@ -106,12 +119,17 @@ data() {
106
119
  else
107
120
  os="Windows-$arch"
108
121
  dir='C:\\tools\\php\\ext'
122
+ [ "$version" = "8.6" ] && date='20260608'
109
123
  fi
110
- job="${GITHUB_REPOSITORY}-${GITHUB_WORKFLOW}-${GITHUB_JOB}"
124
+ [[ ( -z "$ImageOS" && -z "$ImageVersion" ) ||
125
+ ( -n "$RUNNER_ENVIRONMENT" && "$RUNNER_ENVIRONMENT" = "self-hosted" ) ||
126
+ -n "$ACT" || -n "$CONTAINER" ]] && _runner=self-hosted || _runner=github
127
+ runner="${runner:-${RUNNER:-$_runner}}"
128
+ scope="$(get_cache_scope)"
111
129
  if command -v "sha256sum" >/dev/null; then
112
- key="$(echo -n "$extensions-$key-$job" | sha256sum | cut -d ' ' -f 1)"
130
+ key="$(echo -n "$extensions-$key-$scope" | sha256sum | cut -d ' ' -f 1)"
113
131
  else
114
- key="$(echo -n "$extensions-$key-$job" | openssl dgst -sha256 | cut -d ' ' -f 2)"
132
+ key="$(echo -n "$extensions-$key-$scope" | openssl dgst -sha256 | cut -d ' ' -f 2)"
115
133
  fi
116
134
  key="$os"-"$version"-"$key"-"$date"
117
135
  echo "$dir" > "${RUNNER_TEMP:?}"/dir
@@ -133,9 +151,10 @@ init() {
133
151
  export tick="✓"
134
152
  export cross="✗"
135
153
  script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)
154
+ platform_script="$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh"
136
155
  if [[ "$os" = "Linux" || "$os" = "Darwin" ]]; then
137
156
  # shellcheck disable=SC1090
138
- . "$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh"
157
+ . "$platform_script"
139
158
  self_hosted_helper
140
159
  fi
141
160
  }
@@ -144,6 +163,8 @@ run=$1
144
163
  extensions=$2
145
164
  version=$3
146
165
  key=$4
166
+ share_cache_across_jobs=${5:-false}
167
+ share_cache_across_workflows=${6:-false}
147
168
  os="$(uname -s)"
148
169
  init
149
170
  $run
@@ -21,12 +21,43 @@ add_brew_tap() {
21
21
  fi
22
22
  fi
23
23
  fi
24
+ brew trust "$tap" >/dev/null 2>&1
25
+ }
26
+
27
+ get_lookup_extension_name() {
28
+ extension=$1
29
+ case "$extension" in
30
+ http) echo "pecl_http" ;;
31
+ *) echo "$extension" ;;
32
+ esac
33
+ }
34
+
35
+ get_config_extension_name() {
36
+ extension=$1
37
+ case "$extension" in
38
+ http | pecl_http) echo "http" ;;
39
+ phalcon | phalcon3 | phalcon4 | phalcon5) echo "phalcon" ;;
40
+ redis | phpredis) echo "redis" ;;
41
+ xdebug | xdebug2) echo "xdebug" ;;
42
+ *) echo "$extension" ;;
43
+ esac
44
+ }
45
+
46
+ get_formula_name() {
47
+ extension="$(get_lookup_extension_name "$1")"
48
+ case "$extension" in
49
+ redis) echo "phpredis" ;;
50
+ firebird) echo "interbase" ;;
51
+ *) echo "$extension" ;;
52
+ esac
24
53
  }
25
54
 
26
55
  get_dependencies() {
27
56
  extension=$1
28
- list_deps="$(grep "$extension" "${script_dir:?}"/../lists/darwin-deps | cut -d '=' -f 2)"
29
- formula_file="$tap_dir/$ext_tap/Formula/$extension@${version:?}.rb"
57
+ extension_name="$(get_lookup_extension_name "$extension")"
58
+ list_deps="$(grep "^$extension_name=" "${script_dir:?}"/../lists/darwin-deps | cut -d '=' -f 2)"
59
+ formula_name="$(get_formula_name "$extension")"
60
+ formula_file="$tap_dir/$ext_tap/Formula/$formula_name@${version:?}.rb"
30
61
  if [ -e "$formula_file" ]; then
31
62
  formula_deps="$(grep "depends_on" "$formula_file" | cut -d '"' -f 2 | tr '\n' ' ')"
32
63
  formula_deps_from_macos="$(grep "uses_from_macos \"lib" "$formula_file" | cut -d '"' -f 2 | tr '\n' ' ')"
@@ -42,8 +73,9 @@ filter_extensions() {
42
73
  extensions_array=("$@")
43
74
  filtered_extensions=()
44
75
  for ext in "${extensions_array[@]}"; do
45
- if grep -i -q -w "$ext" "${script_dir:?}"/../lists/darwin-extensions ||
46
- grep -q "$ext=" "${script_dir:?}"/../lists/darwin-deps; then
76
+ extension_name="$(get_lookup_extension_name "$ext")"
77
+ if grep -i -q -w "$extension_name" "${script_dir:?}"/../lists/darwin-extensions ||
78
+ grep -q "^$extension_name=" "${script_dir:?}"/../lists/darwin-deps; then
47
79
  filtered_extensions+=("$ext")
48
80
  fi
49
81
  done
@@ -54,7 +86,7 @@ setup_extensions_helper() {
54
86
  dependent_extension=$1
55
87
  dependency_extension=$2
56
88
  extension_dir=$3
57
- dependency_extension_name="$(basename "$(echo $dependency_extension | cut -d'@' -f 1)")"
89
+ dependency_extension_name="$(basename "$(echo "$dependency_extension" | cut -d'@' -f 1)")"
58
90
  cached_extension="${deps_cache_directory:?}/$dependency_extension_name.so"
59
91
  if ! [ -e "$cached_extension" ]; then
60
92
  brew install "$dependency_extension"
@@ -67,12 +99,13 @@ setup_extensions_helper() {
67
99
  }
68
100
 
69
101
  setup_extensions() {
70
- dependent_extension=$1
102
+ requested_extension=$1
103
+ dependent_extension="$(get_config_extension_name "$requested_extension")"
71
104
  extension_dir=$2
72
105
  shift 2
73
106
  dependency_extensions_array=("$@")
74
- sudo mkdir -p "$cache_directory"/"$extension"
75
- echo "::group::Logs to set up extensions required for $extension"
107
+ sudo mkdir -p "$cache_directory"/"$dependent_extension"
108
+ echo "::group::Logs to set up extensions required for $requested_extension"
76
109
  for dependency_extension in "${dependency_extensions_array[@]}"; do
77
110
  setup_extensions_helper "$dependent_extension" "$dependency_extension" "$extension_dir"
78
111
  done
@@ -161,7 +194,7 @@ setup_dependencies() {
161
194
  extension_dir=$2
162
195
  cache_directory=/tmp/extcache
163
196
  [[ -z "${extensions// /}" ]] && return
164
- IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ /g")"
197
+ IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -Ee "s/^|,\s*/ /g")"
165
198
  IFS=' ' read -r -a extensions_array <<<"$(filter_extensions "${extensions_array[@]}")"
166
199
  if [[ -n "${extensions_array[*]// /}" ]]; then
167
200
  add_brew_tap "$php_tap"
@@ -23,9 +23,8 @@ add_package() {
23
23
 
24
24
  add_ppa_package() {
25
25
  package=$1
26
- package_link="$(get_package_link "$package")"
27
- curl -o /tmp/"$package.deb" -sL "$package_link"
28
- sudo DEBIAN_FRONTEND=noninteractive dpkg -i "/tmp/$package.deb"
26
+ download_ppa_package "$package" "/tmp/$package.deb" &&
27
+ sudo DEBIAN_FRONTEND=noninteractive dpkg -i "/tmp/$package.deb"
29
28
  }
30
29
 
31
30
  link_apt_fast() {
@@ -35,11 +34,34 @@ link_apt_fast() {
35
34
  fi
36
35
  }
37
36
 
37
+ download_ppa_file() {
38
+ local file=$1
39
+ local target=$2
40
+ local root
41
+ local roots=()
42
+ if [[ -n "${preferred_ppa_root:-}" ]]; then
43
+ roots+=("$preferred_ppa_root")
44
+ fi
45
+ for root in "https://ppa.launchpadcontent.net" "https://ppa.setup-php.com"; do
46
+ [[ "$root" = "${preferred_ppa_root:-}" ]] && continue
47
+ roots+=("$root")
48
+ done
49
+ rm -f "$target"
50
+ for root in "${roots[@]}"; do
51
+ if curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" --connect-timeout 5 -o "$target" -fsL "$root/$file"; then
52
+ preferred_ppa_root=$root
53
+ return 0
54
+ fi
55
+ rm -f "$target"
56
+ done
57
+ return 1
58
+ }
59
+
38
60
  fetch_package() {
39
61
  if ! [ -e /tmp/Packages ]; then
40
62
  . /etc/os-release
41
63
  arch=$(dpkg --print-architecture)
42
- curl -o /tmp/Packages.gz -sL "http://ppa.launchpad.net/ondrej/php/ubuntu/dists/$VERSION_CODENAME/main/binary-$arch/Packages.gz"
64
+ download_ppa_file "ondrej/php/ubuntu/dists/$VERSION_CODENAME/main/binary-$arch/Packages.gz" "/tmp/Packages.gz" || return 1
43
65
  gzip -df /tmp/Packages.gz
44
66
  fi
45
67
  }
@@ -55,11 +77,20 @@ get_dependencies() {
55
77
  echo "${deps[@]}"
56
78
  }
57
79
 
58
- get_package_link() {
80
+ get_package_file() {
81
+ package=$1
82
+ awk -v package="$package" '
83
+ $1 == "Package:" && $2 == package { found = 1 }
84
+ found && $1 == "Filename:" { print $2; exit }
85
+ found && /^$/ { found = 0 }
86
+ ' /tmp/Packages | tr -d '\r'
87
+ }
88
+
89
+ download_ppa_package() {
59
90
  package=$1
60
- trunk="http://ppa.launchpad.net/ondrej/php/ubuntu"
61
- file=$(sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Filename.*" | cut -d' ' -f 2 | tr -d '\r')
62
- echo "$trunk/$file"
91
+ target=$2
92
+ file=$(get_package_file "$package")
93
+ download_ppa_file "ondrej/php/ubuntu/$file" "$target"
63
94
  }
64
95
 
65
96
  setup_extensions_helper() {
@@ -68,8 +99,7 @@ setup_extensions_helper() {
68
99
  cached_extension="${deps_cache_directory:?}/$dependency_extension.so"
69
100
  if ! [ -e "$extension_dir/$dependency_extension.so" ]; then
70
101
  if ! [ -e "$cached_extension" ]; then
71
- extension_package_link="$(get_package_link "php${version:?}-$dependency_extension")"
72
- sudo curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" -o "/tmp/$dependency_extension".deb -sL "$extension_package_link"
102
+ download_ppa_package "php${version:?}-$dependency_extension" "/tmp/$dependency_extension".deb || return 1
73
103
  sudo dpkg-deb -x "/tmp/$dependency_extension".deb /
74
104
  sudo cp "$extension_dir/$dependency_extension.so" "$cached_extension"
75
105
  fix_ownership "$extension_dir"
@@ -139,7 +169,7 @@ setup_dependencies() {
139
169
  extension_packages=""
140
170
  for extension_package in "${extensions_array[@]}"; do
141
171
  [[ ! "$extension_package" =~ php[0-9]+\.[0-9]+-[a-zA-Z0-9]+$ ]] && continue
142
- fetch_package
172
+ fetch_package || return 1
143
173
  libraries="$libraries $(get_dependencies "$extension_package" "lib")"
144
174
  IFS=' ' read -r -a dependency_extension_packages_array <<<"$(get_dependencies "$extension_package" "php$version-")"
145
175
  extension_packages="$extension_packages ${dependency_extension_packages_array[*]}"
package/src/utils.ts CHANGED
@@ -1,15 +1,19 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as spu from 'setup-php/lib/utils';
1
+ import {readFile} from 'node:fs/promises';
2
+ import {join} from 'node:path';
3
+ import * as spu from 'setup-php/lib/utils.js';
4
+
5
+ export const SCRIPT_PATH = join(import.meta.dirname, '../src/scripts/cache.sh');
6
+
7
+ export type ScriptCall = {
8
+ command: 'bash';
9
+ args: [string, string, ...string[]];
10
+ };
4
11
 
5
12
  /**
6
13
  * Function to get outputs
7
14
  */
8
15
  export async function getOutput(output: string): Promise<string> {
9
- return fs.readFileSync(
10
- path.join(await spu.readEnv('RUNNER_TEMP'), output),
11
- 'utf8'
12
- );
16
+ return readFile(join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
13
17
  }
14
18
 
15
19
  /**
@@ -17,15 +21,13 @@ export async function getOutput(output: string): Promise<string> {
17
21
  *
18
22
  * @param extension_csv
19
23
  */
20
- export async function filterExtensions(extension_csv: string): Promise<string> {
21
- return JSON.stringify(
22
- extension_csv
23
- .split(',')
24
- .filter(extension => {
25
- return extension.trim()[0] != ':';
26
- })
27
- .join(',')
28
- );
24
+ export function filterExtensions(extension_csv: string): string {
25
+ return extension_csv
26
+ .split(',')
27
+ .filter(extension => {
28
+ return extension.trim()[0] != ':';
29
+ })
30
+ .join(',');
29
31
  }
30
32
 
31
33
  /**
@@ -34,10 +36,9 @@ export async function filterExtensions(extension_csv: string): Promise<string> {
34
36
  * @param fn
35
37
  * @param args
36
38
  */
37
- export async function scriptCall(
38
- fn: string,
39
- ...args: string[]
40
- ): Promise<string> {
41
- const script: string = path.join(__dirname, '../src/scripts/cache.sh');
42
- return ['bash', script, fn, ...args].join(' ');
39
+ export function scriptCall(fn: string, ...args: string[]): ScriptCall {
40
+ return {
41
+ command: 'bash',
42
+ args: [SCRIPT_PATH, fn, ...args]
43
+ };
43
44
  }