setup-php 2.16.0 → 2.18.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.
Files changed (81) hide show
  1. package/README.md +159 -141
  2. package/lib/config.d.ts +3 -0
  3. package/lib/config.js +76 -0
  4. package/lib/config.js.map +1 -0
  5. package/lib/coverage.d.ts +5 -0
  6. package/lib/coverage.js +102 -0
  7. package/lib/coverage.js.map +1 -0
  8. package/lib/extensions.d.ts +4 -0
  9. package/lib/extensions.js +219 -0
  10. package/lib/extensions.js.map +1 -0
  11. package/lib/fetch.d.ts +1 -0
  12. package/lib/fetch.js +67 -0
  13. package/lib/fetch.js.map +1 -0
  14. package/lib/install.d.ts +2 -0
  15. package/lib/install.js +80 -0
  16. package/lib/install.js.map +1 -0
  17. package/lib/tools.d.ts +23 -0
  18. package/lib/tools.js +378 -0
  19. package/lib/tools.js.map +1 -0
  20. package/lib/utils.d.ts +21 -0
  21. package/lib/utils.js +266 -0
  22. package/lib/utils.js.map +1 -0
  23. package/package.json +21 -20
  24. package/src/config.ts +8 -8
  25. package/src/configs/brew_extensions +1 -0
  26. package/src/configs/composer.env +2 -0
  27. package/src/configs/ini/jit.ini +3 -0
  28. package/src/configs/ini/php.ini +2 -0
  29. package/src/configs/ini/xdebug.ini +1 -0
  30. package/src/configs/os_releases.csv +2 -0
  31. package/src/configs/php_packages +12 -0
  32. package/src/configs/tools.json +48 -26
  33. package/src/configs/tools_schema.json +11 -0
  34. package/src/coverage.ts +24 -49
  35. package/src/extensions.ts +28 -24
  36. package/src/fetch.ts +54 -0
  37. package/src/install.ts +28 -41
  38. package/src/scripts/darwin.sh +81 -33
  39. package/src/scripts/extensions/add_extensions.ps1 +194 -0
  40. package/src/scripts/extensions/add_extensions.sh +198 -0
  41. package/src/scripts/{ext → extensions}/blackfire.ps1 +0 -0
  42. package/src/scripts/{ext → extensions}/blackfire.sh +0 -0
  43. package/src/scripts/{ext → extensions}/couchbase.sh +0 -0
  44. package/src/scripts/{ext → extensions}/cubrid.sh +3 -3
  45. package/src/scripts/{ext → extensions}/extension_map.php +36 -13
  46. package/src/scripts/{ext → extensions}/firebird.ps1 +0 -0
  47. package/src/scripts/{ext → extensions}/firebird.sh +0 -0
  48. package/src/scripts/{ext → extensions}/gearman.sh +0 -0
  49. package/src/scripts/{ext → extensions}/geos.sh +0 -0
  50. package/src/scripts/{ext → extensions}/http.ps1 +1 -0
  51. package/src/scripts/{ext → extensions}/http.sh +13 -20
  52. package/src/scripts/{ext → extensions}/intl.sh +0 -0
  53. package/src/scripts/{ext → extensions}/ioncube.ps1 +2 -2
  54. package/src/scripts/{ext → extensions}/ioncube.sh +2 -2
  55. package/src/scripts/{ext → extensions}/oci.ps1 +39 -14
  56. package/src/scripts/{ext → extensions}/oci.sh +3 -3
  57. package/src/scripts/{ext → extensions}/patches/firebird.sh +0 -0
  58. package/src/scripts/{ext → extensions}/patches/geos.sh +0 -0
  59. package/src/scripts/{ext → extensions}/patches/http.sh +0 -0
  60. package/src/scripts/{ext → extensions}/patches/pdo_oci.sh +0 -0
  61. package/src/scripts/{ext → extensions}/patches/phpize.sh +0 -0
  62. package/src/scripts/{ext → extensions}/patches/protobuf.sh +0 -0
  63. package/src/scripts/{ext → extensions}/phalcon.ps1 +0 -0
  64. package/src/scripts/{ext → extensions}/phalcon.sh +4 -5
  65. package/src/scripts/{ext → extensions}/source.sh +36 -22
  66. package/src/scripts/extensions/sqlsrv.sh +15 -0
  67. package/src/scripts/linux.sh +76 -36
  68. package/src/scripts/tools/add_tools.ps1 +220 -10
  69. package/src/scripts/tools/add_tools.sh +164 -17
  70. package/src/scripts/tools/grpc_php_plugin.ps1 +4 -4
  71. package/src/scripts/tools/grpc_php_plugin.sh +3 -3
  72. package/src/scripts/tools/ppa.sh +12 -9
  73. package/src/scripts/tools/protoc.ps1 +2 -2
  74. package/src/scripts/tools/protoc.sh +2 -2
  75. package/src/scripts/tools/symfony.ps1 +18 -0
  76. package/src/scripts/tools/symfony.sh +18 -0
  77. package/src/scripts/unix.sh +186 -0
  78. package/src/scripts/win32.ps1 +137 -336
  79. package/src/tools.ts +62 -82
  80. package/src/utils.ts +57 -145
  81. package/src/scripts/common.sh +0 -366
package/src/coverage.ts CHANGED
@@ -20,13 +20,13 @@ export async function checkXdebugError(
20
20
  *
21
21
  * @param extension
22
22
  * @param version
23
- * @param os_version
23
+ * @param os
24
24
  * @param pipe
25
25
  */
26
26
  export async function addCoverageXdebug(
27
27
  extension: string,
28
28
  version: string,
29
- os_version: string,
29
+ os: string,
30
30
  pipe: string
31
31
  ): Promise<string> {
32
32
  let script = '\n';
@@ -34,20 +34,14 @@ export async function addCoverageXdebug(
34
34
  let status = '$cross';
35
35
  if (!message) {
36
36
  script +=
37
- (await extensions.addExtension(
38
- ':pcov:false',
39
- version,
40
- os_version,
41
- true
42
- )) + pipe;
37
+ (await extensions.addExtension(':pcov:false', version, os, true)) + pipe;
43
38
  extension = extension == 'xdebug3' ? 'xdebug' : extension;
44
39
  script +=
45
- (await extensions.addExtension(extension, version, os_version, true)) +
46
- pipe;
40
+ (await extensions.addExtension(extension, version, os, true)) + pipe;
47
41
  message = 'Xdebug enabled as coverage driver';
48
42
  status = '$tick';
49
43
  }
50
- script += await utils.addLog(status, extension, message, os_version);
44
+ script += await utils.addLog(status, extension, message, os);
51
45
  return script;
52
46
  }
53
47
 
@@ -55,36 +49,30 @@ export async function addCoverageXdebug(
55
49
  * Function to setup PCOV
56
50
  *
57
51
  * @param version
58
- * @param os_version
52
+ * @param os
59
53
  * @param pipe
60
54
  */
61
55
  export async function addCoveragePCOV(
62
56
  version: string,
63
- os_version: string,
57
+ os: string,
64
58
  pipe: string
65
59
  ): Promise<string> {
66
60
  let script = '\n';
67
61
  switch (true) {
68
62
  default:
69
63
  script +=
70
- (await extensions.addExtension(
71
- ':xdebug:false',
72
- version,
73
- os_version,
74
- true
75
- )) + pipe;
76
- script +=
77
- (await extensions.addExtension('pcov', version, os_version, true)) +
64
+ (await extensions.addExtension(':xdebug:false', version, os, true)) +
78
65
  pipe;
79
66
  script +=
80
- (await config.addINIValues('pcov.enabled=1', os_version, true)) + '\n';
67
+ (await extensions.addExtension('pcov', version, os, true)) + pipe;
68
+ script += (await config.addINIValues('pcov.enabled=1', os, true)) + '\n';
81
69
 
82
70
  // success
83
71
  script += await utils.addLog(
84
72
  '$tick',
85
73
  'coverage: pcov',
86
74
  'PCOV enabled as coverage driver',
87
- os_version
75
+ os
88
76
  );
89
77
  // version is not supported
90
78
  break;
@@ -94,7 +82,7 @@ export async function addCoveragePCOV(
94
82
  '$cross',
95
83
  'pcov',
96
84
  'PHP 7.1 or newer is required',
97
- os_version
85
+ os
98
86
  );
99
87
  break;
100
88
  }
@@ -106,31 +94,20 @@ export async function addCoveragePCOV(
106
94
  * Function to disable Xdebug and PCOV
107
95
  *
108
96
  * @param version
109
- * @param os_version
97
+ * @param os
110
98
  * @param pipe
111
99
  */
112
100
  export async function disableCoverage(
113
101
  version: string,
114
- os_version: string,
102
+ os: string,
115
103
  pipe: string
116
104
  ): Promise<string> {
117
105
  let script = '\n';
118
106
  script +=
119
- (await extensions.addExtension(':pcov:false', version, os_version, true)) +
120
- pipe;
107
+ (await extensions.addExtension(':pcov:false', version, os, true)) + pipe;
121
108
  script +=
122
- (await extensions.addExtension(
123
- ':xdebug:false',
124
- version,
125
- os_version,
126
- true
127
- )) + pipe;
128
- script += await utils.addLog(
129
- '$tick',
130
- 'none',
131
- 'Disabled Xdebug and PCOV',
132
- os_version
133
- );
109
+ (await extensions.addExtension(':xdebug:false', version, os, true)) + pipe;
110
+ script += await utils.addLog('$tick', 'none', 'Disabled Xdebug and PCOV', os);
134
111
 
135
112
  return script;
136
113
  }
@@ -140,29 +117,27 @@ export async function disableCoverage(
140
117
  *
141
118
  * @param coverage_driver
142
119
  * @param version
143
- * @param os_version
120
+ * @param os
144
121
  */
145
122
  export async function addCoverage(
146
123
  coverage_driver: string,
147
124
  version: string,
148
- os_version: string
125
+ os: string
149
126
  ): Promise<string> {
150
127
  coverage_driver = coverage_driver.toLowerCase();
151
- const script: string =
152
- '\n' + (await utils.stepLog('Setup Coverage', os_version));
153
- const pipe: string = (await utils.suppressOutput(os_version)) + '\n';
128
+ const script: string = '\n' + (await utils.stepLog('Setup Coverage', os));
129
+ const pipe: string = (await utils.suppressOutput(os)) + '\n';
154
130
  switch (coverage_driver) {
155
131
  case 'pcov':
156
- return script + (await addCoveragePCOV(version, os_version, pipe));
132
+ return script + (await addCoveragePCOV(version, os, pipe));
157
133
  case 'xdebug':
158
134
  case 'xdebug2':
159
135
  case 'xdebug3':
160
136
  return (
161
- script +
162
- (await addCoverageXdebug(coverage_driver, version, os_version, pipe))
137
+ script + (await addCoverageXdebug(coverage_driver, version, os, pipe))
163
138
  );
164
139
  case 'none':
165
- return script + (await disableCoverage(version, os_version, pipe));
140
+ return script + (await disableCoverage(version, os, pipe));
166
141
  default:
167
142
  return '';
168
143
  }
package/src/extensions.ts CHANGED
@@ -31,12 +31,12 @@ export async function addExtensionDarwin(
31
31
  case /.+-.+\/.+@.+/.test(extension):
32
32
  add_script += await utils.parseExtensionSource(extension, ext_prefix);
33
33
  return;
34
- // match 5.3blackfire...8.0blackfire
35
- // match 5.3blackfire-(semver)...8.0blackfire-(semver)
34
+ // match 5.3blackfire...8.1blackfire
35
+ // match 5.3blackfire-(semver)...8.1blackfire-(semver)
36
36
  // match couchbase, geos, pdo_oci, oci8, http, pecl_http
37
37
  // match 5.3ioncube...7.4ioncube
38
38
  // match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
39
- case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
39
+ case /^(5\.[3-6]|7\.[0-4]|8\.[0-1])blackfire(-\d+\.\d+\.\d+)?$/.test(
40
40
  version_extension
41
41
  ):
42
42
  case /^couchbase$|^geos$|^pdo_oci$|^oci8$|^(pecl_)?http|^pdo_firebird$/.test(
@@ -44,9 +44,10 @@ export async function addExtensionDarwin(
44
44
  ):
45
45
  case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
46
46
  case /(5\.6|7\.[0-3])phalcon3|7\.[2-4]phalcon4/.test(version_extension):
47
+ case /(?<!5\.[3-6])(pdo_)?sqlsrv$/.test(version_extension):
47
48
  add_script += await utils.customPackage(
48
49
  ext_name,
49
- 'ext',
50
+ 'extensions',
50
51
  extension,
51
52
  'darwin'
52
53
  );
@@ -73,11 +74,11 @@ export async function addExtensionDarwin(
73
74
  case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
74
75
  add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
75
76
  return;
76
- // match 5.6 and newer - amqp, apcu, expect, grpc, igbinary, imagick, imap, memcache, memcached, mongodb, msgpack, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq
77
+ // match 5.6 and newer - amqp, apcu, expect, gnupg, grpc, igbinary, imagick, imap, memcache, memcached, mongodb, msgpack, protobuf, raphf, rdkafka, redis, ssh2, swoole, xdebug, xdebug2, yaml, zmq
77
78
  // match 7.1 and newer - pcov
78
79
  // match 5.6 to 7.4 - propro
79
80
  // match 7.0 and newer - vips, xlswriter
80
- case /(?<!5\.[3-5])(amqp|apcu|expect|grpc|igbinary|imagick|imap|mailparse|memcache|memcached|mongodb|msgpack|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test(
81
+ case /(?<!5\.[3-5])(amqp|apcu|expect|gnupg|grpc|igbinary|imagick|imap|mailparse|memcache|memcached|mongodb|msgpack|protobuf|psr|raphf|rdkafka|redis|ssh2|swoole|xdebug|xdebug2|yaml|zmq)/.test(
81
82
  version_extension
82
83
  ):
83
84
  case /(5\.6|7\.[0-4])propro/.test(version_extension):
@@ -127,22 +128,22 @@ export async function addExtensionWindows(
127
128
  case /^none$/.test(ext_name):
128
129
  add_script += '\nDisable-AllShared';
129
130
  break;
130
- // match 5.3blackfire...8.0blackfire
131
- // match 5.3blackfire-(semver)...8.0blackfire-(semver)
131
+ // match 5.3blackfire...8.1blackfire
132
+ // match 5.3blackfire-(semver)...8.1blackfire-(semver)
132
133
  // match pdo_oci and oci8
133
134
  // match 5.3ioncube...7.4ioncube
134
135
  // match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
135
- // match 7.1pecl_http...8.0pecl_http and 7.1http...8.0http
136
- case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
136
+ // match 7.1pecl_http...8.1pecl_http and 7.1http...8.1http
137
+ case /^(5\.[3-6]|7\.[0-4]|8\.1)blackfire(-\d+\.\d+\.\d+)?$/.test(
137
138
  version_extension
138
139
  ):
139
140
  case /^pdo_oci$|^oci8$|^pdo_firebird$/.test(extension):
140
141
  case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
141
142
  case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
142
- case /^(7\.[1-4]|8\.0)(pecl_)?http/.test(version_extension):
143
+ case /^(7\.[1-4]|8\.1)(pecl_)?http/.test(version_extension):
143
144
  add_script += await utils.customPackage(
144
145
  ext_name,
145
- 'ext',
146
+ 'extensions',
146
147
  extension,
147
148
  'win32'
148
149
  );
@@ -231,7 +232,9 @@ export async function addExtensionLinux(
231
232
  let remove_script = '';
232
233
  await utils.asyncForEach(extensions, async function (extension: string) {
233
234
  const version_extension: string = version + extension;
234
- const [ext_name, ext_version]: string[] = extension.split('-');
235
+ const [ext_name, ext_version]: string[] = extension
236
+ .split(/-(.+)/)
237
+ .filter(Boolean);
235
238
  const ext_prefix = await utils.getExtensionPrefix(ext_name);
236
239
 
237
240
  switch (true) {
@@ -247,13 +250,13 @@ export async function addExtensionLinux(
247
250
  case /.+-.+\/.+@.+/.test(extension):
248
251
  add_script += await utils.parseExtensionSource(extension, ext_prefix);
249
252
  return;
250
- // match 5.3blackfire...8.0blackfire
251
- // match 5.3blackfire-(semver)...8.0blackfire-(semver)
253
+ // match 5.3blackfire...8.1blackfire
254
+ // match 5.3blackfire-(semver)...8.1blackfire-(semver)
252
255
  // match 5.3pdo_cubrid...7.2php_cubrid, 5.3cubrid...7.4cubrid
253
256
  // match couchbase, geos, pdo_oci, oci8, http, pecl_http
254
257
  // match 5.3ioncube...7.4ioncube
255
258
  // match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
256
- case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
259
+ case /^(5\.[3-6]|7\.[0-4]|8\.[0-1])blackfire(-\d+\.\d+\.\d+)?$/.test(
257
260
  version_extension
258
261
  ):
259
262
  case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test(
@@ -265,9 +268,10 @@ export async function addExtensionLinux(
265
268
  case /(?<!5\.[3-5])intl-[\d]+\.[\d]+$/.test(version_extension):
266
269
  case /^(5\.[3-6]|7\.[0-4])ioncube$/.test(version_extension):
267
270
  case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
271
+ case /(?<!5\.[3-6])(pdo_)?sqlsrv$/.test(version_extension):
268
272
  add_script += await utils.customPackage(
269
273
  ext_name,
270
- 'ext',
274
+ 'extensions',
271
275
  extension,
272
276
  'linux'
273
277
  );
@@ -325,20 +329,20 @@ export async function addExtensionLinux(
325
329
  *
326
330
  * @param extension_csv
327
331
  * @param version
328
- * @param os_version
332
+ * @param os
329
333
  * @param no_step
330
334
  */
331
335
  export async function addExtension(
332
336
  extension_csv: string,
333
337
  version: string,
334
- os_version: string,
338
+ os: string,
335
339
  no_step = false
336
340
  ): Promise<string> {
337
- const log: string = await utils.stepLog('Setup Extensions', os_version);
341
+ const log: string = await utils.stepLog('Setup Extensions', os);
338
342
  let script = '\n';
339
343
  switch (no_step) {
340
344
  case true:
341
- script += log + (await utils.suppressOutput(os_version));
345
+ script += log + (await utils.suppressOutput(os));
342
346
  break;
343
347
  case false:
344
348
  default:
@@ -346,7 +350,7 @@ export async function addExtension(
346
350
  break;
347
351
  }
348
352
 
349
- switch (os_version) {
353
+ switch (os) {
350
354
  case 'win32':
351
355
  return script + (await addExtensionWindows(extension_csv, version));
352
356
  case 'darwin':
@@ -355,8 +359,8 @@ export async function addExtension(
355
359
  return script + (await addExtensionLinux(extension_csv, version));
356
360
  default:
357
361
  return await utils.log(
358
- 'Platform ' + os_version + ' is not supported',
359
- os_version,
362
+ 'Platform ' + os + ' is not supported',
363
+ os,
360
364
  'error'
361
365
  );
362
366
  }
package/src/fetch.ts ADDED
@@ -0,0 +1,54 @@
1
+ import {IncomingMessage, OutgoingHttpHeaders} from 'http';
2
+ import * as https from 'https';
3
+ import * as url from 'url';
4
+
5
+ /**
6
+ * Function to fetch an URL
7
+ *
8
+ * @param input_url
9
+ * @param auth_token
10
+ */
11
+ export async function fetch(
12
+ input_url: string,
13
+ auth_token?: string,
14
+ redirect_count = 5
15
+ ): Promise<Record<string, string>> {
16
+ const fetch_promise: Promise<Record<string, string>> = new Promise(
17
+ resolve => {
18
+ const url_object: url.UrlObject = new url.URL(input_url);
19
+ const headers: OutgoingHttpHeaders = {
20
+ 'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
21
+ };
22
+ if (auth_token) {
23
+ headers.authorization = 'Bearer ' + auth_token;
24
+ }
25
+ const options: https.RequestOptions = {
26
+ hostname: url_object.hostname,
27
+ path: url_object.pathname,
28
+ headers: headers
29
+ };
30
+ const req = https.get(options, (res: IncomingMessage) => {
31
+ if (res.statusCode === 200) {
32
+ let body = '';
33
+ res.setEncoding('utf8');
34
+ res.on('data', chunk => (body += chunk));
35
+ res.on('end', () => resolve({data: `${body}`}));
36
+ } else if (
37
+ [301, 302, 303, 307, 308].includes(res.statusCode as number)
38
+ ) {
39
+ if (redirect_count > 0 && res.headers.location) {
40
+ fetch(res.headers.location, auth_token, redirect_count--).then(
41
+ resolve
42
+ );
43
+ } else {
44
+ resolve({error: `${res.statusCode}: Redirect error`});
45
+ }
46
+ } else {
47
+ resolve({error: `${res.statusCode}: ${res.statusMessage}`});
48
+ }
49
+ });
50
+ req.end();
51
+ }
52
+ );
53
+ return await fetch_promise;
54
+ }
package/src/install.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
1
3
  import {exec} from '@actions/exec';
2
4
  import * as core from '@actions/core';
3
5
  import * as config from './config';
@@ -9,66 +11,51 @@ import * as utils from './utils';
9
11
  /**
10
12
  * Build the script
11
13
  *
12
- * @param filename
13
- * @param version
14
- * @param os_version
14
+ * @param os
15
15
  */
16
- export async function getScript(
17
- filename: string,
18
- version: string,
19
- os_version: string
20
- ): Promise<string> {
21
- const url = 'https://setup-php.com/sponsor';
22
- // taking inputs
16
+ export async function getScript(os: string): Promise<string> {
17
+ const url = 'https://setup-php.com/support-ukraine';
18
+ const filename = os + (await utils.scriptExtension(os));
19
+ const script_path = path.join(__dirname, '../src/scripts', filename);
20
+ const run_path = script_path.replace(os, 'run');
23
21
  process.env['fail_fast'] = await utils.getInput('fail-fast', false);
24
22
  const extension_csv: string = await utils.getInput('extensions', false);
25
23
  const ini_values_csv: string = await utils.getInput('ini-values', false);
26
24
  const coverage_driver: string = await utils.getInput('coverage', false);
27
25
  const tools_csv: string = await utils.getInput('tools', false);
28
-
29
- let script: string = await utils.readFile(filename, 'src/scripts');
30
- script += await tools.addTools(tools_csv, version, os_version);
26
+ const version: string = await utils.parseVersion(
27
+ await utils.getInput('php-version', true)
28
+ );
29
+ const ini_file: string = await utils.parseIniFile(
30
+ await utils.getInput('ini-file', false)
31
+ );
32
+ let script = await utils.joins('.', script_path, version, ini_file);
31
33
  if (extension_csv) {
32
- script += await extensions.addExtension(extension_csv, version, os_version);
34
+ script += await extensions.addExtension(extension_csv, version, os);
33
35
  }
36
+ script += await tools.addTools(tools_csv, version, os);
34
37
  if (coverage_driver) {
35
- script += await coverage.addCoverage(coverage_driver, version, os_version);
38
+ script += await coverage.addCoverage(coverage_driver, version, os);
36
39
  }
37
40
  if (ini_values_csv) {
38
- script += await config.addINIValues(ini_values_csv, os_version);
41
+ script += await config.addINIValues(ini_values_csv, os);
39
42
  }
40
- script += '\n' + (await utils.stepLog(`Sponsor setup-php`, os_version));
41
- script += '\n' + (await utils.addLog('$tick', 'setup-php', url, os_version));
43
+ script += '\n' + (await utils.stepLog(`#StandWithUkraine`, os));
44
+ script += '\n' + (await utils.addLog('$tick', 'read-more', url, os));
45
+
46
+ fs.writeFileSync(run_path, script, {mode: 0o755});
42
47
 
43
- return await utils.writeScript(filename, script);
48
+ return run_path;
44
49
  }
45
50
 
46
51
  /**
47
52
  * Run the script
48
53
  */
49
54
  export async function run(): Promise<void> {
50
- try {
51
- if ((await utils.readEnv('ImageOS')) == 'ubuntu16') {
52
- core.setFailed(
53
- 'setup-php is not supported on Ubuntu 16.04. Please upgrade to Ubuntu 18.04 or Ubuntu 20.04 - https://setup-php.com/i/452'
54
- );
55
- return;
56
- }
57
- const version: string = await utils.parseVersion(
58
- await utils.getInput('php-version', true)
59
- );
60
- if (version) {
61
- const os_version: string = process.platform;
62
- const tool = await utils.scriptTool(os_version);
63
- const script = os_version + (await utils.scriptExtension(os_version));
64
- const location = await getScript(script, version, os_version);
65
- await exec(await utils.joins(tool, location, version, __dirname));
66
- } else {
67
- core.setFailed('Unable to get the PHP version');
68
- }
69
- } catch (error) {
70
- core.setFailed((error as Error).message);
71
- }
55
+ const os: string = process.platform;
56
+ const tool = await utils.scriptTool(os);
57
+ const run_path = await getScript(os);
58
+ await exec(tool + run_path);
72
59
  }
73
60
 
74
61
  // call the run function
@@ -23,11 +23,14 @@ disable_dependency_extensions() {
23
23
  disable_extension_helper() {
24
24
  local extension=$1
25
25
  local disable_dependents=${2:-false}
26
+ get_extension_map
26
27
  if [ "$disable_dependents" = "true" ]; then
27
28
  disable_extension_dependents "$extension"
28
29
  fi
29
30
  sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
30
- sudo rm -rf "$scan_dir"/*"$extension"*
31
+ sudo rm -rf "$scan_dir"/*"$extension"* /tmp/php"$version"_extensions
32
+ mkdir -p /tmp/extdisabled/"$version"
33
+ echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension" >/dev/null 2>&1
31
34
  }
32
35
 
33
36
  # Function to fetch a brew tap.
@@ -57,12 +60,32 @@ add_brew_tap() {
57
60
  fi
58
61
  }
59
62
 
63
+ # Function to get extension name from brew formula.
64
+ get_extension_from_formula() {
65
+ local formula=$1
66
+ local extension
67
+ extension=$(grep "$formula=" "$src"/configs/brew_extensions | cut -d '=' -f 2)
68
+ [[ -z "$extension" ]] && extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")"
69
+ echo "$extension"
70
+ }
71
+
72
+ # Function to copy extension binaries to the extension directory.
73
+ copy_brew_extensions() {
74
+ local formula=$1
75
+ formula_file="$tap_dir/$ext_tap/Formula/$formula@$version.rb"
76
+ deps="$(grep -Eo 'depends_on "shivammathur[^"]+' "$formula_file" | cut -d '/' -f 3 | tr '\n' ' ')"
77
+ IFS=' ' read -r -a deps <<< "$formula@$version $deps"
78
+ for dependency in "${deps[@]}"; do
79
+ extension_file="$brew_prefix/opt/$dependency/$(get_extension_from_formula "${dependency%@*}").so"
80
+ [ -e "$extension_file" ] && sudo cp "$extension_file" "$ext_dir"
81
+ done
82
+ }
83
+
60
84
  # Function to install a php extension from shivammathur/extensions tap.
61
85
  add_brew_extension() {
62
86
  formula=$1
63
87
  prefix=$2
64
- extension=$(grep "$formula=" "$dist"/../src/configs/brew_extensions | cut -d '=' -f 2)
65
- [[ -z "$extension" ]] && extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")"
88
+ extension="$(get_extension_from_formula "$formula")"
66
89
  enable_extension "$extension" "$prefix"
67
90
  if check_extension "$extension"; then
68
91
  add_log "${tick:?}" "$extension" "Enabled"
@@ -73,27 +96,22 @@ add_brew_extension() {
73
96
  update_dependencies >/dev/null 2>&1
74
97
  disable_dependency_extensions "$extension" >/dev/null 2>&1
75
98
  brew install -f "$formula@$version" >/dev/null 2>&1
76
- sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
99
+ copy_brew_extensions "$formula"
77
100
  add_extension_log "$extension" "Installed and enabled"
78
101
  fi
79
102
  }
80
103
 
81
- # Function to setup extensions.
82
- add_extension() {
104
+ # Helper function to add an extension.
105
+ add_extension_helper() {
83
106
  local extension=$1
84
107
  prefix=$2
85
- enable_extension "$extension" "$prefix"
86
- if check_extension "$extension"; then
87
- add_log "${tick:?}" "$extension" "Enabled"
108
+ if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
109
+ run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
88
110
  else
89
- if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
90
- run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
91
- else
92
- pecl_install "$extension" >/dev/null 2>&1 &&
93
- if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
94
- fi
95
- add_extension_log "$extension" "Installed and enabled"
111
+ pecl_install "$extension" >/dev/null 2>&1 &&
112
+ if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
96
113
  fi
114
+ add_extension_log "$extension" "Installed and enabled"
97
115
  }
98
116
 
99
117
  # Function to handle request to add phpize and php-config.
@@ -104,6 +122,7 @@ add_devtools() {
104
122
 
105
123
  # Function to handle request to add PECL.
106
124
  add_pecl() {
125
+ enable_extension xml extension >/dev/null 2>&1
107
126
  configure_pecl >/dev/null 2>&1
108
127
  pear_version=$(get_tool_version "pecl" "version")
109
128
  add_log "${tick:?}" "PECL" "Found PECL $pear_version"
@@ -168,7 +187,7 @@ fix_dependencies() {
168
187
  get_brewed_php() {
169
188
  php_cellar="$brew_prefix"/Cellar/php
170
189
  if [ -d "$php_cellar" ] && ! [[ "$(find "$php_cellar" -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]]; then
171
- php-config --version 2>/dev/null | cut -c 1-3
190
+ php_semver | cut -c 1-3
172
191
  else
173
192
  echo 'false';
174
193
  fi
@@ -196,9 +215,31 @@ php_extra_version() {
196
215
  fi
197
216
  }
198
217
 
218
+ # Function to set php.ini
219
+ add_php_config() {
220
+ if ! [ -e "$ini_dir"/php.ini-development ]; then
221
+ sudo cp "$ini_dir"/php.ini "$ini_dir"/php.ini-development
222
+ fi
223
+ if [[ "$ini" = "production" || "$ini" = "development" ]]; then
224
+ sudo cp "$ini_dir"/php.ini-"$ini" "$ini_dir"/php.ini
225
+ elif [ "$ini" = "none" ]; then
226
+ echo '' | sudo tee "${ini_file[@]}" >/dev/null 2>&1
227
+ fi
228
+ }
229
+
230
+ # Function to get scan directory.
231
+ get_scan_dir() {
232
+ if [[ "$version" =~ ${old_versions:?} ]]; then
233
+ php --ini | grep additional | sed -e "s|.*: s*||"
234
+ else
235
+ echo "$ini_dir"/conf.d
236
+ fi
237
+ }
238
+
199
239
  # Function to Setup PHP.
200
240
  setup_php() {
201
241
  step_log "Setup PHP"
242
+ php_config="$(command -v php-config 2>/dev/null)"
202
243
  existing_version=$(get_brewed_php)
203
244
  if [[ "$version" =~ ${old_versions:?} ]]; then
204
245
  run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
@@ -213,45 +254,52 @@ setup_php() {
213
254
  status="Found"
214
255
  fix_dependencies >/dev/null 2>&1
215
256
  fi
216
- ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
257
+ php_config="$(command -v php-config)"
258
+ ext_dir="$(grep 'extension_dir=' "$php_config" | cut -d "'" -f 2)"
259
+ ini_dir="$(php_ini_path)"
260
+ scan_dir="$(get_scan_dir)"
261
+ ini_file="$ini_dir"/php.ini
262
+ sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
217
263
  sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
264
+ semver="$(php_semver)"
265
+ extra_version="$(php_extra_version)"
218
266
  configure_php
219
- ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
220
- scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
221
- sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
222
- semver=$(php_semver)
223
- extra_version=$(php_extra_version)
267
+ set_output "php-version" "$semver"
224
268
  if [ "${semver%.*}" != "$version" ]; then
225
269
  add_log "${cross:?}" "PHP" "Could not setup PHP $version"
226
270
  exit 1
227
271
  fi
228
272
 
229
- sudo cp "$dist"/../src/configs/pm/*.json "$RUNNER_TOOL_CACHE/"
230
- echo "::set-output name=php-version::$semver"
273
+ sudo cp "$src"/configs/pm/*.json "$RUNNER_TOOL_CACHE/"
231
274
  add_log "$tick" "PHP" "$status PHP $semver$extra_version"
232
275
  }
233
276
 
234
277
  # Variables
235
- version=$1
236
- dist=$2
278
+ version=${1:-'8.1'}
279
+ ini=${2:-'production'}
280
+ src=${0%/*}/..
237
281
  php_formula=shivammathur/php/php@"$version"
238
- brew_prefix="$(brew --prefix)"
239
- brew_repo="$(brew --repository)"
282
+ brew_path="$(command -v brew)"
283
+ brew_path_dir="$(dirname "$brew_path")"
284
+ brew_prefix="$brew_path_dir"/..
285
+ brew_repo="$brew_path_dir/$(dirname "$(readlink "$brew_path")")"/..
240
286
  tap_dir="$brew_repo"/Library/Taps
241
287
  core_repo="$tap_dir"/homebrew/homebrew-core
242
- scripts="${dist}"/../src/scripts
288
+ scripts="$src"/scripts
243
289
  ext_tap=shivammathur/homebrew-extensions
244
290
  php_tap=shivammathur/homebrew-php
245
291
  export HOMEBREW_CHANGE_ARCH_TO_ARM=1
246
292
  export HOMEBREW_DEVELOPER=1
247
- export HOMEBREW_NO_INSTALL_CLEANUP=1
248
293
  export HOMEBREW_NO_AUTO_UPDATE=1
294
+ export HOMEBREW_NO_ENV_HINTS=1
295
+ export HOMEBREW_NO_INSTALL_CLEANUP=1
249
296
  export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
250
297
 
251
298
  # shellcheck source=.
252
- . "${scripts:?}"/ext/source.sh
299
+ . "${scripts:?}"/unix.sh
253
300
  . "${scripts:?}"/tools/add_tools.sh
254
- . "${scripts:?}"/common.sh
301
+ . "${scripts:?}"/extensions/source.sh
302
+ . "${scripts:?}"/extensions/add_extensions.sh
255
303
  read_env
256
304
  self_hosted_setup
257
305
  setup_php