setup-php 1.11.2 → 1.11.6

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 (80) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +433 -458
  3. package/lib/config.d.ts +3 -0
  4. package/lib/config.js +71 -71
  5. package/lib/config.js.map +1 -1
  6. package/lib/coverage.d.ts +4 -0
  7. package/lib/coverage.js +97 -87
  8. package/lib/coverage.js.map +1 -1
  9. package/lib/extensions.d.ts +4 -0
  10. package/lib/extensions.js +188 -200
  11. package/lib/extensions.js.map +1 -1
  12. package/lib/install.d.ts +2 -0
  13. package/lib/install.js +96 -81
  14. package/lib/install.js.map +1 -1
  15. package/lib/tools.d.ts +18 -0
  16. package/lib/tools.js +306 -386
  17. package/lib/tools.js.map +1 -1
  18. package/lib/utils.d.ts +15 -0
  19. package/lib/utils.js +205 -291
  20. package/lib/utils.js.map +1 -1
  21. package/package.json +66 -56
  22. package/src/config.ts +82 -82
  23. package/src/configs/brew_extensions +28 -0
  24. package/src/configs/php-versions.json +5 -5
  25. package/src/configs/phpunit.json +24 -24
  26. package/src/coverage.ts +146 -146
  27. package/src/extensions.ts +235 -233
  28. package/src/install.ts +104 -104
  29. package/src/scripts/darwin.sh +341 -339
  30. package/src/scripts/ext/gearman.sh +22 -22
  31. package/src/scripts/ext/phalcon.ps1 +55 -55
  32. package/src/scripts/ext/phalcon.sh +70 -70
  33. package/src/scripts/linux.sh +361 -361
  34. package/src/scripts/win32.ps1 +326 -333
  35. package/src/tools.ts +472 -469
  36. package/src/utils.ts +319 -316
  37. package/.eslintrc.json +0 -16
  38. package/.github/CODE_OF_CONDUCT.md +0 -76
  39. package/.github/CONTRIBUTING.md +0 -69
  40. package/.github/FUNDING.yml +0 -7
  41. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -23
  42. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  43. package/.github/PULL_REQUEST_TEMPLATE.md +0 -38
  44. package/.github/SECURITY.md +0 -29
  45. package/.github/workflows/main-workflow.yml +0 -56
  46. package/.github/workflows/node-workflow.yml +0 -47
  47. package/.idea/workspace.xml +0 -113
  48. package/.prettierrc.json +0 -12
  49. package/__tests__/config.test.ts +0 -52
  50. package/__tests__/coverage.test.ts +0 -110
  51. package/__tests__/extensions.test.ts +0 -120
  52. package/__tests__/install.test.ts +0 -181
  53. package/__tests__/tools.test.ts +0 -476
  54. package/__tests__/utils.test.ts +0 -213
  55. package/action.yml +0 -38
  56. package/dist/index.js +0 -2854
  57. package/examples/bedrock.yml +0 -32
  58. package/examples/cakephp-mysql.yml +0 -114
  59. package/examples/cakephp-postgres.yml +0 -112
  60. package/examples/cakephp.yml +0 -92
  61. package/examples/codeigniter.yml +0 -34
  62. package/examples/laravel-mysql.yml +0 -74
  63. package/examples/laravel-postgres.yml +0 -74
  64. package/examples/laravel.yml +0 -42
  65. package/examples/lumen-mysql.yml +0 -74
  66. package/examples/lumen-postgres.yml +0 -74
  67. package/examples/lumen.yml +0 -38
  68. package/examples/phalcon-mysql.yml +0 -74
  69. package/examples/phalcon-postgres.yml +0 -73
  70. package/examples/sage.yml +0 -57
  71. package/examples/slim-framework.yml +0 -34
  72. package/examples/symfony-mysql.yml +0 -56
  73. package/examples/symfony-postgres.yml +0 -54
  74. package/examples/symfony.yml +0 -39
  75. package/examples/yii2-mysql.yml +0 -73
  76. package/examples/yii2-postgres.yml +0 -71
  77. package/examples/zend-framework.yml +0 -36
  78. package/jest.config.js +0 -12
  79. package/lib/sapi.js +0 -64
  80. package/tsconfig.json +0 -18
@@ -1,361 +1,361 @@
1
- # Function to log start of a operation
2
- step_log() {
3
- message=$1
4
- printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
5
- }
6
-
7
- # Function to log result of a operation
8
- add_log() {
9
- mark=$1
10
- subject=$2
11
- message=$3
12
- if [ "$mark" = "$tick" ]; then
13
- printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
14
- else
15
- printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
16
- fi
17
- }
18
-
19
- # Function to backup and cleanup package lists.
20
- cleanup_lists() {
21
- ppa_prefix=${1-ondrej}
22
- if [ ! -e /etc/apt/sources.list.d.save ]; then
23
- sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
24
- sudo mkdir /etc/apt/sources.list.d
25
- sudo mv /etc/apt/sources.list.d.save/*"${ppa_prefix}"*.list /etc/apt/sources.list.d/
26
- trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/ 2>/dev/null" exit
27
- fi
28
- }
29
-
30
- # Function to add ppa:ondrej/php.
31
- add_ppa() {
32
- ppa=${1:-ondrej/php}
33
- if ! apt-cache policy | grep -q "$ppa"; then
34
- cleanup_lists "$(dirname "$ppa")"
35
- LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y
36
- fi
37
- }
38
-
39
- # Function to update the package lists.
40
- update_lists() {
41
- if [ ! -e /tmp/setup_php ]; then
42
- add_ppa ondrej/php >/dev/null 2>&1
43
- cleanup_lists
44
- sudo "$debconf_fix" apt-get update >/dev/null 2>&1
45
- echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1
46
- fi
47
- }
48
-
49
- # Function to configure PECL
50
- configure_pecl() {
51
- if ! [ -e /tmp/pecl_config ]; then
52
- if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then
53
- add_pecl >/dev/null 2>&1
54
- fi
55
- for script in pear pecl; do
56
- sudo "$script" config-set php_ini "${pecl_file:-$ini_file}" >/dev/null 2>&1
57
- sudo "$script" channel-update "$script".php.net >/dev/null 2>&1
58
- done
59
- echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
60
- fi
61
- }
62
-
63
- # Function to get the PECL version
64
- get_pecl_version() {
65
- extension=$1
66
- stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")"
67
- pecl_rest='https://pecl.php.net/rest/r/'
68
- response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
69
- pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)")
70
- if [ ! "$pecl_version" ]; then
71
- pecl_version=$(echo "$response" | grep -m 1 -Eo "([0-9]+\.[0-9]+\.[0-9]+)")
72
- fi
73
- echo "$pecl_version"
74
- }
75
-
76
- # Function to install PECL extensions and accept default options
77
- pecl_install() {
78
- local extension=$1
79
- yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
80
- }
81
-
82
- # Function to enable existing extensions.
83
- enable_extension() {
84
- sudo find /var/lib/php/modules/"$version" -path "*disabled*$1" -delete
85
- if ! check_extension "$1" && [ -e "$ext_dir/$1.so" ]; then
86
- echo "$2=$ext_dir/$1.so" | sudo tee -a "$pecl_file" >/dev/null
87
- fi
88
- }
89
-
90
- # Function to test if extension is loaded
91
- check_extension() {
92
- extension=$1
93
- if [ "$extension" != "mysql" ]; then
94
- php -m | grep -i -q -w "$extension"
95
- else
96
- php -m | grep -i -q "$extension"
97
- fi
98
- }
99
-
100
- # Function to delete extensions
101
- delete_extension() {
102
- extension=$1
103
- sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file"
104
- sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file"
105
- sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
106
- sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
107
- sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status
108
- }
109
-
110
- # Function to disable and delete extensions
111
- remove_extension() {
112
- extension=$1
113
- if [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
114
- sudo phpdismod -v "$version" "$extension"
115
- fi
116
- delete_extension "$extension"
117
- }
118
-
119
- # Function to setup extensions
120
- add_extension() {
121
- extension=$1
122
- install_command=$2
123
- prefix=$3
124
- enable_extension "$extension" "$prefix"
125
- if check_extension "$extension"; then
126
- add_log "$tick" "$extension" "Enabled"
127
- elif ! check_extension "$extension"; then
128
- eval "$install_command" >/dev/null 2>&1 ||
129
- (update_lists && eval "$install_command" >/dev/null 2>&1) || pecl_install "$extension"
130
- (check_extension "$extension" && add_log "$tick" "$extension" "Installed and enabled") ||
131
- add_log "$cross" "$extension" "Could not install $extension on PHP $semver"
132
- fi
133
- sudo chmod 777 "$ini_file"
134
- }
135
-
136
- # Function to install a PECL version
137
- add_pecl_extension() {
138
- extension=$1
139
- pecl_version=$2
140
- prefix=$3
141
- configure_pecl
142
- if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
143
- pecl_version=$(get_pecl_version "$extension" "$pecl_version")
144
- fi
145
- enable_extension "$extension" "$prefix"
146
- ext_version=$(php -r "echo phpversion('$extension');")
147
- if [ "$ext_version" = "$pecl_version" ]; then
148
- add_log "$tick" "$extension" "Enabled"
149
- else
150
- delete_extension "$extension"
151
- (
152
- sudo pecl install -f "$extension-$pecl_version" >/dev/null 2>&1 &&
153
- check_extension "$extension" &&
154
- add_log "$tick" "$extension" "Installed and enabled"
155
- ) || add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver"
156
- fi
157
- }
158
-
159
- # Function to pre-release extensions using PECL
160
- add_unstable_extension() {
161
- extension=$1
162
- stability=$2
163
- prefix=$3
164
- pecl_version=$(get_pecl_version "$extension" "$stability")
165
- add_pecl_extension "$extension" "$pecl_version" "$prefix"
166
- }
167
-
168
- # Function to configure composer
169
- configure_composer() {
170
- tool_path=$1
171
- sudo ln -sf "$tool_path" "$tool_path.phar"
172
- php -r "try {\$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception \$e) {exit(1);}"
173
- if [ $? -eq 1 ]; then
174
- add_log "$cross" "composer" "Could not download composer"
175
- exit 1;
176
- fi
177
- if ! [ -d "$composer_home" ]; then
178
- sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home"
179
- else
180
- sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home"
181
- fi
182
- if ! [ -e "$composer_json" ]; then
183
- echo '{}' | tee "$composer_json" >/dev/null
184
- chmod 644 "$composer_json"
185
- fi
186
- composer -q config -g process-timeout 0
187
- echo "$composer_bin" >> "$GITHUB_PATH"
188
- if [ -n "$COMPOSER_TOKEN" ]; then
189
- composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
190
- fi
191
- }
192
-
193
- # Function to setup a remote tool.
194
- add_tool() {
195
- url=$1
196
- tool=$2
197
- tool_path="$tool_path_dir/$tool"
198
- if [ ! -e "$tool_path" ]; then
199
- rm -rf "$tool_path"
200
- fi
201
- if [ "$tool" = "composer" ]; then
202
- IFS="," read -r -a urls <<< "$url"
203
- status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
204
- status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
205
- else
206
- status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
207
- fi
208
- if [ "$status_code" != "200" ] && [[ "$url" =~ .*github.com.*releases.*latest.* ]]; then
209
- url="${url//releases\/latest\/download/releases/download/$(curl "${curl_opts[@]}" "$(echo "$url" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "$url" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
210
- status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
211
- fi
212
- if [ "$status_code" = "200" ]; then
213
- sudo chmod a+x "$tool_path"
214
- if [ "$tool" = "composer" ]; then
215
- configure_composer "$tool_path"
216
- elif [ "$tool" = "cs2pr" ]; then
217
- sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
218
- elif [ "$tool" = "phive" ]; then
219
- add_extension curl "$apt_install php$version-curl" extension >/dev/null 2>&1
220
- add_extension mbstring "$apt_install php$version-mbstring" extension >/dev/null 2>&1
221
- add_extension xml "$apt_install php$version-xml" extension >/dev/null 2>&1
222
- fi
223
- add_log "$tick" "$tool" "Added"
224
- else
225
- add_log "$cross" "$tool" "Could not setup $tool"
226
- [ "$tool" = "composer" ] && exit 1
227
- fi
228
- }
229
-
230
- # Function to setup a tool using composer
231
- add_composertool() {
232
- tool=$1
233
- release=$2
234
- prefix=$3
235
- (
236
- sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
237
- composer global require "$prefix$release" >/dev/null 2>&1 &&
238
- add_log "$tick" "$tool" "Added"
239
- ) || add_log "$cross" "$tool" "Could not setup $tool"
240
- if [ -e "$composer_bin/composer" ]; then
241
- sudo cp -p "$tool_path_dir/composer" "$composer_bin"
242
- fi
243
- if [ "$tool" = "codeception" ]; then
244
- sudo ln -s "$composer_bin"/codecept "$composer_bin"/codeception
245
- fi
246
- }
247
-
248
- # Function to setup phpize and php-config
249
- add_devtools() {
250
- if ! [ -e "/usr/bin/phpize$version" ] || ! [ -e "/usr/bin/php-config$version" ]; then
251
- update_lists && $apt_install php"$version"-dev php"$version"-xml >/dev/null 2>&1
252
- fi
253
- sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
254
- sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
255
- configure_pecl
256
- }
257
-
258
- # Function to setup the nightly build from master branch
259
- setup_master() {
260
- curl "${curl_opts[@]}" https://github.com/shivammathur/php-builder/releases/latest/download/install.sh | bash -s "github"
261
- }
262
-
263
- add_packaged_php() {
264
- if [ "${use_package_cache:-true}" = "false" ]; then
265
- update_lists
266
- IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
267
- $apt_install "${packages[@]}"
268
- else
269
- curl "${curl_opts[@]}" https://github.com/shivammathur/php-ubuntu/releases/latest/download/install.sh | bash -s "$version"
270
- fi
271
- }
272
-
273
- # Function to setup PECL
274
- add_pecl() {
275
- add_devtools
276
- if [ ! -e /usr/bin/pecl ]; then
277
- $apt_install php-pear >/dev/null 2>&1
278
- fi
279
- configure_pecl
280
- add_log "$tick" "PECL" "Added"
281
- }
282
-
283
- # Function to switch versions of PHP binaries
284
- switch_version() {
285
- for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
286
- if [ -e "/usr/bin/$tool$version" ]; then
287
- sudo update-alternatives --set $tool /usr/bin/"$tool$version"
288
- fi
289
- done
290
- }
291
-
292
- # Function to get PHP version in semver format
293
- php_semver() {
294
- if [ ! "$version" = "8.0" ]; then
295
- php"$version" -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-'
296
- else
297
- php -v | head -n 1 | cut -f 2 -d ' '
298
- fi
299
- }
300
-
301
- # Function to configure PHP
302
- configure_php() {
303
- (
304
- echo -e "date.timezone=UTC\nmemory_limit=-1"
305
- [[ "$version" =~ 8.0 ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
306
- [[ "$version" =~ 7.[2-4]|8.0 ]] && echo -e "xdebug.mode=coverage"
307
- ) | sudo tee -a "$pecl_file" >/dev/null
308
- }
309
-
310
- # Variables
311
- tick="✓"
312
- cross="✗"
313
- version=$1
314
- dist=$2
315
- debconf_fix="DEBIAN_FRONTEND=noninteractive"
316
- apt_install="sudo $debconf_fix apt-fast install -y"
317
- tool_path_dir="/usr/local/bin"
318
- curl_opts=(-sL)
319
- composer_home="$HOME/.composer"
320
- composer_bin="$composer_home/vendor/bin"
321
- composer_json="$composer_home/composer.json"
322
- composer_lock="$composer_home/composer.lock"
323
- existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
324
-
325
- # Setup PHP
326
- step_log "Setup PHP"
327
- sudo mkdir -m 777 -p "$HOME/.composer" /var/run /run/php
328
- . /etc/lsb-release
329
-
330
- if [ "$existing_version" != "$version" ]; then
331
- if [ ! -e "/usr/bin/php$version" ]; then
332
- if [ "$version" = "8.0" ]; then
333
- setup_master >/dev/null 2>&1
334
- else
335
- add_packaged_php >/dev/null 2>&1
336
- fi
337
- status="Installed"
338
- else
339
- status="Switched to"
340
- fi
341
-
342
- switch_version >/dev/null 2>&1
343
- else
344
- status="Found"
345
- fi
346
-
347
- if ! command -v php"$version" >/dev/null; then
348
- add_log "$cross" "PHP" "Could not setup PHP $version"
349
- exit 1
350
- fi
351
- semver=$(php_semver)
352
- scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
353
- ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
354
- ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
355
- pecl_file="$scan_dir"/99-pecl.ini
356
- echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
357
- configure_php
358
- sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
359
- sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir"
360
- sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
361
- add_log "$tick" "PHP" "$status PHP $semver"
1
+ # Function to log start of a operation
2
+ step_log() {
3
+ message=$1
4
+ printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message"
5
+ }
6
+
7
+ # Function to log result of a operation
8
+ add_log() {
9
+ mark=$1
10
+ subject=$2
11
+ message=$3
12
+ if [ "$mark" = "$tick" ]; then
13
+ printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
14
+ else
15
+ printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "$message"
16
+ fi
17
+ }
18
+
19
+ # Function to backup and cleanup package lists.
20
+ cleanup_lists() {
21
+ ppa_prefix=${1-ondrej}
22
+ if [ ! -e /etc/apt/sources.list.d.save ]; then
23
+ sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.save
24
+ sudo mkdir /etc/apt/sources.list.d
25
+ sudo mv /etc/apt/sources.list.d.save/*"${ppa_prefix}"*.list /etc/apt/sources.list.d/
26
+ trap "sudo mv /etc/apt/sources.list.d.save/*.list /etc/apt/sources.list.d/ 2>/dev/null" exit
27
+ fi
28
+ }
29
+
30
+ # Function to add ppa:ondrej/php.
31
+ add_ppa() {
32
+ ppa=${1:-ondrej/php}
33
+ if ! apt-cache policy | grep -q "$ppa"; then
34
+ cleanup_lists "$(dirname "$ppa")"
35
+ LC_ALL=C.UTF-8 sudo apt-add-repository ppa:"$ppa" -y
36
+ fi
37
+ }
38
+
39
+ # Function to update the package lists.
40
+ update_lists() {
41
+ if [ ! -e /tmp/setup_php ]; then
42
+ add_ppa ondrej/php >/dev/null 2>&1
43
+ cleanup_lists
44
+ sudo "$debconf_fix" apt-get update >/dev/null 2>&1
45
+ echo '' | sudo tee /tmp/setup_php >/dev/null 2>&1
46
+ fi
47
+ }
48
+
49
+ # Function to configure PECL
50
+ configure_pecl() {
51
+ if ! [ -e /tmp/pecl_config ]; then
52
+ if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then
53
+ add_pecl >/dev/null 2>&1
54
+ fi
55
+ for script in pear pecl; do
56
+ sudo "$script" config-set php_ini "${pecl_file:-$ini_file}" >/dev/null 2>&1
57
+ sudo "$script" channel-update "$script".php.net >/dev/null 2>&1
58
+ done
59
+ echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
60
+ fi
61
+ }
62
+
63
+ # Function to get the PECL version
64
+ get_pecl_version() {
65
+ local extension=$1
66
+ stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")"
67
+ pecl_rest='https://pecl.php.net/rest/r/'
68
+ response=$(curl "${curl_opts[@]}" "$pecl_rest$extension"/allreleases.xml)
69
+ pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)")
70
+ if [ ! "$pecl_version" ]; then
71
+ pecl_version=$(echo "$response" | grep -m 1 -Eo "([0-9]+\.[0-9]+\.[0-9]+)")
72
+ fi
73
+ echo "$pecl_version"
74
+ }
75
+
76
+ # Function to install PECL extensions and accept default options
77
+ pecl_install() {
78
+ local extension=$1
79
+ yes '' | sudo pecl install -f "$extension" >/dev/null 2>&1
80
+ }
81
+
82
+ # Function to enable existing extensions.
83
+ enable_extension() {
84
+ sudo find /var/lib/php/modules/"$version" -path "*disabled*$1" -delete
85
+ if ! check_extension "$1" && [ -e "$ext_dir/$1.so" ]; then
86
+ echo "$2=$ext_dir/$1.so" | sudo tee -a "$pecl_file" >/dev/null
87
+ fi
88
+ }
89
+
90
+ # Function to test if extension is loaded
91
+ check_extension() {
92
+ local extension=$1
93
+ if [ "$extension" != "mysql" ]; then
94
+ php -m | grep -i -q -w "$extension"
95
+ else
96
+ php -m | grep -i -q "$extension"
97
+ fi
98
+ }
99
+
100
+ # Function to delete extensions
101
+ delete_extension() {
102
+ local extension=$1
103
+ sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$ini_file"
104
+ sudo sed -Ei "/=(.*\/)?\"?$extension/d" "$pecl_file"
105
+ sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
106
+ sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
107
+ sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status
108
+ }
109
+
110
+ # Function to disable and delete extensions
111
+ remove_extension() {
112
+ local extension=$1
113
+ if [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
114
+ sudo phpdismod -v "$version" "$extension"
115
+ fi
116
+ delete_extension "$extension"
117
+ }
118
+
119
+ # Function to setup extensions
120
+ add_extension() {
121
+ local extension=$1
122
+ install_command=$2
123
+ prefix=$3
124
+ enable_extension "$extension" "$prefix"
125
+ if check_extension "$extension"; then
126
+ add_log "$tick" "$extension" "Enabled"
127
+ elif ! check_extension "$extension"; then
128
+ eval "$install_command" >/dev/null 2>&1 ||
129
+ (update_lists && eval "$install_command" >/dev/null 2>&1) || pecl_install "$extension"
130
+ (check_extension "$extension" && add_log "$tick" "$extension" "Installed and enabled") ||
131
+ add_log "$cross" "$extension" "Could not install $extension on PHP $semver"
132
+ fi
133
+ sudo chmod 777 "$ini_file"
134
+ }
135
+
136
+ # Function to install a PECL version
137
+ add_pecl_extension() {
138
+ local extension=$1
139
+ pecl_version=$2
140
+ prefix=$3
141
+ configure_pecl
142
+ if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then
143
+ pecl_version=$(get_pecl_version "$extension" "$pecl_version")
144
+ fi
145
+ enable_extension "$extension" "$prefix"
146
+ ext_version=$(php -r "echo phpversion('$extension');")
147
+ if [ "$ext_version" = "$pecl_version" ]; then
148
+ add_log "$tick" "$extension" "Enabled"
149
+ else
150
+ delete_extension "$extension"
151
+ (
152
+ sudo pecl install -f "$extension-$pecl_version" >/dev/null 2>&1 &&
153
+ check_extension "$extension" &&
154
+ add_log "$tick" "$extension" "Installed and enabled"
155
+ ) || add_log "$cross" "$extension" "Could not install $extension-$pecl_version on PHP $semver"
156
+ fi
157
+ }
158
+
159
+ # Function to pre-release extensions using PECL
160
+ add_unstable_extension() {
161
+ local extension=$1
162
+ stability=$2
163
+ prefix=$3
164
+ pecl_version=$(get_pecl_version "$extension" "$stability")
165
+ add_pecl_extension "$extension" "$pecl_version" "$prefix"
166
+ }
167
+
168
+ # Function to configure composer
169
+ configure_composer() {
170
+ tool_path=$1
171
+ sudo ln -sf "$tool_path" "$tool_path.phar"
172
+ php -r "try {\$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception \$e) {exit(1);}"
173
+ if [ $? -eq 1 ]; then
174
+ add_log "$cross" "composer" "Could not download composer"
175
+ exit 1;
176
+ fi
177
+ if ! [ -d "$composer_home" ]; then
178
+ sudo -u "$(id -un)" -g "$(id -gn)" mkdir -p -m=00755 "$composer_home"
179
+ else
180
+ sudo chown -R "$(id -un)":"$(id -gn)" "$composer_home"
181
+ fi
182
+ if ! [ -e "$composer_json" ]; then
183
+ echo '{}' | tee "$composer_json" >/dev/null
184
+ chmod 644 "$composer_json"
185
+ fi
186
+ composer -q config -g process-timeout 0
187
+ echo "$composer_bin" >> "$GITHUB_PATH"
188
+ if [ -n "$COMPOSER_TOKEN" ]; then
189
+ composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
190
+ fi
191
+ }
192
+
193
+ # Function to setup a remote tool.
194
+ add_tool() {
195
+ url=$1
196
+ tool=$2
197
+ tool_path="$tool_path_dir/$tool"
198
+ if [ ! -e "$tool_path" ]; then
199
+ rm -rf "$tool_path"
200
+ fi
201
+ if [ "$tool" = "composer" ]; then
202
+ IFS="," read -r -a urls <<< "$url"
203
+ status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
204
+ status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
205
+ else
206
+ status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
207
+ fi
208
+ if [ "$status_code" != "200" ] && [[ "$url" =~ .*github.com.*releases.*latest.* ]]; then
209
+ url="${url//releases\/latest\/download/releases/download/$(curl "${curl_opts[@]}" "$(echo "$url" | cut -d '/' -f '1-5')/releases" | grep -Eo -m 1 "([0-9]+\.[0-9]+\.[0-9]+)/$(echo "$url" | sed -e "s/.*\///")" | cut -d '/' -f 1)}"
210
+ status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
211
+ fi
212
+ if [ "$status_code" = "200" ]; then
213
+ sudo chmod a+x "$tool_path"
214
+ if [ "$tool" = "composer" ]; then
215
+ configure_composer "$tool_path"
216
+ elif [ "$tool" = "cs2pr" ]; then
217
+ sudo sed -i 's/\r$//; s/exit(9)/exit(0)/' "$tool_path"
218
+ elif [ "$tool" = "phive" ]; then
219
+ add_extension curl "$apt_install php$version-curl" extension >/dev/null 2>&1
220
+ add_extension mbstring "$apt_install php$version-mbstring" extension >/dev/null 2>&1
221
+ add_extension xml "$apt_install php$version-xml" extension >/dev/null 2>&1
222
+ fi
223
+ add_log "$tick" "$tool" "Added"
224
+ else
225
+ add_log "$cross" "$tool" "Could not setup $tool"
226
+ [ "$tool" = "composer" ] && exit 1
227
+ fi
228
+ }
229
+
230
+ # Function to setup a tool using composer
231
+ add_composertool() {
232
+ tool=$1
233
+ release=$2
234
+ prefix=$3
235
+ (
236
+ sudo rm -f "$composer_lock" >/dev/null 2>&1 || true
237
+ composer global require "$prefix$release" >/dev/null 2>&1 &&
238
+ add_log "$tick" "$tool" "Added"
239
+ ) || add_log "$cross" "$tool" "Could not setup $tool"
240
+ if [ -e "$composer_bin/composer" ]; then
241
+ sudo cp -p "$tool_path_dir/composer" "$composer_bin"
242
+ fi
243
+ if [ "$tool" = "codeception" ]; then
244
+ sudo ln -s "$composer_bin"/codecept "$composer_bin"/codeception
245
+ fi
246
+ }
247
+
248
+ # Function to setup phpize and php-config
249
+ add_devtools() {
250
+ if ! [ -e "/usr/bin/phpize$version" ] || ! [ -e "/usr/bin/php-config$version" ]; then
251
+ update_lists && $apt_install php"$version"-dev php"$version"-xml >/dev/null 2>&1
252
+ fi
253
+ sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
254
+ sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
255
+ configure_pecl
256
+ }
257
+
258
+ # Function to setup the nightly build from master branch
259
+ setup_master() {
260
+ curl "${curl_opts[@]}" https://github.com/shivammathur/php-builder/releases/latest/download/install.sh | bash -s "github"
261
+ }
262
+
263
+ add_packaged_php() {
264
+ if [ "${use_package_cache:-true}" = "false" ]; then
265
+ update_lists
266
+ IFS=' ' read -r -a packages <<<"$(echo "cli curl mbstring xml intl" | sed "s/[^ ]*/php$version-&/g")"
267
+ $apt_install "${packages[@]}"
268
+ else
269
+ curl "${curl_opts[@]}" https://github.com/shivammathur/php-ubuntu/releases/latest/download/install.sh | bash -s "$version"
270
+ fi
271
+ }
272
+
273
+ # Function to setup PECL
274
+ add_pecl() {
275
+ add_devtools
276
+ if [ ! -e /usr/bin/pecl ]; then
277
+ $apt_install php-pear >/dev/null 2>&1
278
+ fi
279
+ configure_pecl
280
+ add_log "$tick" "PECL" "Added"
281
+ }
282
+
283
+ # Function to switch versions of PHP binaries
284
+ switch_version() {
285
+ for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
286
+ if [ -e "/usr/bin/$tool$version" ]; then
287
+ sudo update-alternatives --set $tool /usr/bin/"$tool$version"
288
+ fi
289
+ done
290
+ }
291
+
292
+ # Function to get PHP version in semver format
293
+ php_semver() {
294
+ if [ ! "$version" = "8.0" ]; then
295
+ php"$version" -v | head -n 1 | cut -f 2 -d ' ' | cut -f 1 -d '-'
296
+ else
297
+ php -v | head -n 1 | cut -f 2 -d ' '
298
+ fi
299
+ }
300
+
301
+ # Function to configure PHP
302
+ configure_php() {
303
+ (
304
+ echo -e "date.timezone=UTC\nmemory_limit=-1"
305
+ [[ "$version" =~ 8.0 ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
306
+ [[ "$version" =~ 7.[2-4]|8.0 ]] && echo -e "xdebug.mode=coverage"
307
+ ) | sudo tee -a "$pecl_file" >/dev/null
308
+ }
309
+
310
+ # Variables
311
+ tick="✓"
312
+ cross="✗"
313
+ version=$1
314
+ dist=$2
315
+ debconf_fix="DEBIAN_FRONTEND=noninteractive"
316
+ apt_install="sudo $debconf_fix apt-fast install -y --no-install-recommends"
317
+ tool_path_dir="/usr/local/bin"
318
+ curl_opts=(-sL)
319
+ composer_home="$HOME/.composer"
320
+ composer_bin="$composer_home/vendor/bin"
321
+ composer_json="$composer_home/composer.json"
322
+ composer_lock="$composer_home/composer.lock"
323
+ existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
324
+
325
+ # Setup PHP
326
+ step_log "Setup PHP"
327
+ sudo mkdir -m 777 -p "$HOME/.composer" /var/run /run/php
328
+ . /etc/lsb-release
329
+
330
+ if [ "$existing_version" != "$version" ]; then
331
+ if [ ! -e "/usr/bin/php$version" ]; then
332
+ if [ "$version" = "8.0" ]; then
333
+ setup_master >/dev/null 2>&1
334
+ else
335
+ add_packaged_php >/dev/null 2>&1
336
+ fi
337
+ status="Installed"
338
+ else
339
+ status="Switched to"
340
+ fi
341
+
342
+ switch_version >/dev/null 2>&1
343
+ else
344
+ status="Found"
345
+ fi
346
+
347
+ if ! command -v php"$version" >/dev/null; then
348
+ add_log "$cross" "PHP" "Could not setup PHP $version"
349
+ exit 1
350
+ fi
351
+ semver=$(php_semver)
352
+ scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
353
+ ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
354
+ ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
355
+ pecl_file="$scan_dir"/99-pecl.ini
356
+ echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
357
+ configure_php
358
+ sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
359
+ sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir"
360
+ sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
361
+ add_log "$tick" "PHP" "$status PHP $semver"