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.
- package/LICENSE +21 -21
- package/README.md +433 -458
- package/lib/config.d.ts +3 -0
- package/lib/config.js +71 -71
- package/lib/config.js.map +1 -1
- package/lib/coverage.d.ts +4 -0
- package/lib/coverage.js +97 -87
- package/lib/coverage.js.map +1 -1
- package/lib/extensions.d.ts +4 -0
- package/lib/extensions.js +188 -200
- package/lib/extensions.js.map +1 -1
- package/lib/install.d.ts +2 -0
- package/lib/install.js +96 -81
- package/lib/install.js.map +1 -1
- package/lib/tools.d.ts +18 -0
- package/lib/tools.js +306 -386
- package/lib/tools.js.map +1 -1
- package/lib/utils.d.ts +15 -0
- package/lib/utils.js +205 -291
- package/lib/utils.js.map +1 -1
- package/package.json +66 -56
- package/src/config.ts +82 -82
- package/src/configs/brew_extensions +28 -0
- package/src/configs/php-versions.json +5 -5
- package/src/configs/phpunit.json +24 -24
- package/src/coverage.ts +146 -146
- package/src/extensions.ts +235 -233
- package/src/install.ts +104 -104
- package/src/scripts/darwin.sh +341 -339
- package/src/scripts/ext/gearman.sh +22 -22
- package/src/scripts/ext/phalcon.ps1 +55 -55
- package/src/scripts/ext/phalcon.sh +70 -70
- package/src/scripts/linux.sh +361 -361
- package/src/scripts/win32.ps1 +326 -333
- package/src/tools.ts +472 -469
- package/src/utils.ts +319 -316
- package/.eslintrc.json +0 -16
- package/.github/CODE_OF_CONDUCT.md +0 -76
- package/.github/CONTRIBUTING.md +0 -69
- package/.github/FUNDING.yml +0 -7
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -23
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -38
- package/.github/SECURITY.md +0 -29
- package/.github/workflows/main-workflow.yml +0 -56
- package/.github/workflows/node-workflow.yml +0 -47
- package/.idea/workspace.xml +0 -113
- package/.prettierrc.json +0 -12
- package/__tests__/config.test.ts +0 -52
- package/__tests__/coverage.test.ts +0 -110
- package/__tests__/extensions.test.ts +0 -120
- package/__tests__/install.test.ts +0 -181
- package/__tests__/tools.test.ts +0 -476
- package/__tests__/utils.test.ts +0 -213
- package/action.yml +0 -38
- package/dist/index.js +0 -2854
- package/examples/bedrock.yml +0 -32
- package/examples/cakephp-mysql.yml +0 -114
- package/examples/cakephp-postgres.yml +0 -112
- package/examples/cakephp.yml +0 -92
- package/examples/codeigniter.yml +0 -34
- package/examples/laravel-mysql.yml +0 -74
- package/examples/laravel-postgres.yml +0 -74
- package/examples/laravel.yml +0 -42
- package/examples/lumen-mysql.yml +0 -74
- package/examples/lumen-postgres.yml +0 -74
- package/examples/lumen.yml +0 -38
- package/examples/phalcon-mysql.yml +0 -74
- package/examples/phalcon-postgres.yml +0 -73
- package/examples/sage.yml +0 -57
- package/examples/slim-framework.yml +0 -34
- package/examples/symfony-mysql.yml +0 -56
- package/examples/symfony-postgres.yml +0 -54
- package/examples/symfony.yml +0 -39
- package/examples/yii2-mysql.yml +0 -73
- package/examples/yii2-postgres.yml +0 -71
- package/examples/zend-framework.yml +0 -36
- package/jest.config.js +0 -12
- package/lib/sapi.js +0 -64
- package/tsconfig.json +0 -18
package/src/scripts/linux.sh
CHANGED
|
@@ -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"
|