setup-php 2.13.0 → 2.17.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 (134) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +990 -922
  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 +5 -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 +214 -200
  11. package/lib/extensions.js.map +1 -1
  12. package/lib/fetch.d.ts +1 -0
  13. package/lib/fetch.js +63 -0
  14. package/lib/fetch.js.map +1 -0
  15. package/lib/install.d.ts +2 -0
  16. package/lib/install.js +75 -81
  17. package/lib/install.js.map +1 -1
  18. package/lib/tools.d.ts +23 -0
  19. package/lib/tools.js +367 -386
  20. package/lib/tools.js.map +1 -1
  21. package/lib/utils.d.ts +21 -0
  22. package/lib/utils.js +261 -291
  23. package/lib/utils.js.map +1 -1
  24. package/package.json +67 -56
  25. package/src/config.ts +82 -82
  26. package/src/configs/brew_extensions +31 -0
  27. package/src/configs/composer.env +2 -0
  28. package/src/configs/ini/jit.ini +3 -0
  29. package/src/configs/ini/php.ini +2 -0
  30. package/src/configs/ini/xdebug.ini +1 -0
  31. package/src/configs/os_releases.csv +19 -17
  32. package/src/configs/php-versions.json +6 -5
  33. package/src/configs/php_packages +12 -0
  34. package/src/configs/{php.json → pm/php.json} +29 -29
  35. package/src/configs/{phpunit.json → pm/phpunit.json} +24 -24
  36. package/src/configs/tools.json +278 -235
  37. package/src/configs/tools_schema.json +125 -114
  38. package/src/coverage.ts +144 -142
  39. package/src/extensions.ts +367 -349
  40. package/src/fetch.ts +54 -0
  41. package/src/install.ts +66 -82
  42. package/src/scripts/darwin.sh +285 -249
  43. package/src/scripts/extensions/add_extensions.ps1 +194 -0
  44. package/src/scripts/extensions/add_extensions.sh +184 -0
  45. package/src/scripts/{ext → extensions}/blackfire.ps1 +32 -32
  46. package/src/scripts/{ext → extensions}/blackfire.sh +22 -21
  47. package/src/scripts/{ext → extensions}/couchbase.sh +43 -43
  48. package/src/scripts/{ext → extensions}/cubrid.sh +60 -60
  49. package/src/scripts/extensions/extension_map.php +132 -0
  50. package/src/scripts/{ext → extensions}/firebird.ps1 +19 -19
  51. package/src/scripts/{ext → extensions}/firebird.sh +39 -35
  52. package/src/scripts/{ext → extensions}/gearman.sh +22 -22
  53. package/src/scripts/{ext → extensions}/geos.sh +17 -17
  54. package/src/scripts/{ext → extensions}/http.ps1 +54 -54
  55. package/src/scripts/{ext → extensions}/http.sh +109 -120
  56. package/src/scripts/{ext → extensions}/intl.sh +23 -23
  57. package/src/scripts/{ext → extensions}/ioncube.ps1 +33 -32
  58. package/src/scripts/{ext → extensions}/ioncube.sh +21 -19
  59. package/src/scripts/{ext → extensions}/oci.ps1 +85 -60
  60. package/src/scripts/{ext → extensions}/oci.sh +65 -63
  61. package/src/scripts/{ext → extensions}/patches/firebird.sh +11 -11
  62. package/src/scripts/{ext → extensions}/patches/geos.sh +7 -7
  63. package/src/scripts/{ext → extensions}/patches/http.sh +11 -11
  64. package/src/scripts/{ext → extensions}/patches/pdo_oci.sh +6 -6
  65. package/src/scripts/{ext → extensions}/patches/phpize.sh +26 -26
  66. package/src/scripts/{ext → extensions}/patches/protobuf.sh +4 -4
  67. package/src/scripts/{ext → extensions}/phalcon.ps1 +54 -54
  68. package/src/scripts/{ext → extensions}/phalcon.sh +58 -58
  69. package/src/scripts/{ext → extensions}/source.sh +145 -144
  70. package/src/scripts/extensions/sqlsrv.sh +15 -0
  71. package/src/scripts/linux.sh +269 -256
  72. package/src/scripts/tools/add_tools.ps1 +239 -26
  73. package/src/scripts/tools/add_tools.sh +175 -20
  74. package/src/scripts/tools/blackfire.ps1 +19 -19
  75. package/src/scripts/tools/blackfire.sh +40 -39
  76. package/src/scripts/tools/grpc_php_plugin.ps1 +21 -21
  77. package/src/scripts/tools/grpc_php_plugin.sh +58 -58
  78. package/src/scripts/tools/ppa.sh +192 -151
  79. package/src/scripts/tools/protoc.ps1 +38 -38
  80. package/src/scripts/tools/protoc.sh +28 -28
  81. package/src/scripts/tools/symfony.ps1 +14 -0
  82. package/src/scripts/tools/symfony.sh +13 -0
  83. package/src/scripts/unix.sh +186 -0
  84. package/src/scripts/win32.ps1 +352 -494
  85. package/src/tools.ts +512 -538
  86. package/src/utils.ts +415 -500
  87. package/.eslintrc.json +0 -16
  88. package/.github/CODE_OF_CONDUCT.md +0 -76
  89. package/.github/CONTRIBUTING.md +0 -70
  90. package/.github/FUNDING.yml +0 -7
  91. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -42
  92. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  93. package/.github/PULL_REQUEST_TEMPLATE.md +0 -37
  94. package/.github/SECURITY.md +0 -29
  95. package/.github/workflows/docs.yml +0 -77
  96. package/.github/workflows/node-workflow.yml +0 -51
  97. package/.github/workflows/workflow.yml +0 -78
  98. package/.idea/workspace.xml +0 -113
  99. package/.prettierrc.json +0 -12
  100. package/__tests__/config.test.ts +0 -52
  101. package/__tests__/coverage.test.ts +0 -110
  102. package/__tests__/extensions.test.ts +0 -263
  103. package/__tests__/install.test.ts +0 -175
  104. package/__tests__/tools.test.ts +0 -524
  105. package/__tests__/utils.test.ts +0 -307
  106. package/action.yml +0 -29
  107. package/dist/index.js +0 -3051
  108. package/examples/bedrock.yml +0 -32
  109. package/examples/blackfire-player.yml +0 -31
  110. package/examples/blackfire.yml +0 -31
  111. package/examples/cakephp-mysql.yml +0 -114
  112. package/examples/cakephp-postgres.yml +0 -112
  113. package/examples/cakephp.yml +0 -92
  114. package/examples/codeigniter.yml +0 -34
  115. package/examples/laravel-mysql.yml +0 -74
  116. package/examples/laravel-postgres.yml +0 -74
  117. package/examples/laravel.yml +0 -42
  118. package/examples/lumen-mysql.yml +0 -74
  119. package/examples/lumen-postgres.yml +0 -74
  120. package/examples/lumen.yml +0 -38
  121. package/examples/phalcon-mysql.yml +0 -74
  122. package/examples/phalcon-postgres.yml +0 -73
  123. package/examples/sage.yml +0 -57
  124. package/examples/slim-framework.yml +0 -34
  125. package/examples/symfony-mysql.yml +0 -57
  126. package/examples/symfony-postgres.yml +0 -55
  127. package/examples/symfony.yml +0 -39
  128. package/examples/yii2-mysql.yml +0 -73
  129. package/examples/yii2-postgres.yml +0 -71
  130. package/examples/zend-framework.yml +0 -36
  131. package/jest.config.js +0 -12
  132. package/lib/sapi.js +0 -64
  133. package/src/scripts/common.sh +0 -314
  134. package/tsconfig.json +0 -18
@@ -1,249 +1,285 @@
1
- # Function to setup environment for self-hosted runners.
2
- self_hosted_helper() {
3
- if ! command -v brew >/dev/null; then
4
- step_log "Setup Brew"
5
- get -q -e "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/master/install.sh" && /tmp/install.sh >/dev/null 2>&1
6
- add_log "${tick:?}" "Brew" "Installed Homebrew"
7
- fi
8
- }
9
-
10
- # Function to delete extension.
11
- delete_extension() {
12
- extension=$1
13
- sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
14
- }
15
-
16
- # Function to disable extension.
17
- disable_extension() {
18
- extension=$1
19
- sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
20
- }
21
-
22
- # Function to remove extensions.
23
- remove_extension() {
24
- extension=$1
25
- if check_extension "$extension"; then
26
- disable_extension "$extension"
27
- delete_extension "$extension"
28
- (! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
29
- add_log "${cross:?}" ":$extension" "Could not remove $extension on PHP ${semver:?}"
30
- else
31
- add_log "${tick:?}" ":$extension" "Could not find $extension on PHP $semver"
32
- fi
33
- }
34
-
35
- # Function to fetch a brew tap.
36
- fetch_brew_tap() {
37
- tap=$1
38
- tap_user=$(dirname "$tap")
39
- tap_name=$(basename "$tap")
40
- mkdir -p "$tap_dir/$tap_user"
41
- get -s -n "" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
42
- if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
43
- sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
44
- fi
45
- }
46
-
47
- # Function to add a brew tap.
48
- add_brew_tap() {
49
- tap=$1
50
- if ! [ -d "$tap_dir/$tap" ]; then
51
- if [ "${runner:?}" = "self-hosted" ]; then
52
- brew tap "$tap" >/dev/null 2>&1
53
- else
54
- fetch_brew_tap "$tap" >/dev/null 2>&1
55
- if ! [ -d "$tap_dir/$tap" ]; then
56
- brew tap "$tap" >/dev/null 2>&1
57
- fi
58
- fi
59
- fi
60
- }
61
-
62
- # Function to install a php extension from shivammathur/extensions tap.
63
- add_brew_extension() {
64
- formula=$1
65
- prefix=$2
66
- extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")"
67
- enable_extension "$extension" "$prefix"
68
- if check_extension "$extension"; then
69
- add_log "${tick:?}" "$extension" "Enabled"
70
- else
71
- add_brew_tap shivammathur/homebrew-php
72
- add_brew_tap shivammathur/homebrew-extensions
73
- sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$formula"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
74
- update_dependencies >/dev/null 2>&1
75
- brew install -f "$formula@$version" >/dev/null 2>&1
76
- sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
77
- add_extension_log "$extension" "Installed and enabled"
78
- fi
79
- }
80
-
81
- # Function to setup extensions.
82
- add_extension() {
83
- extension=$1
84
- prefix=$2
85
- enable_extension "$extension" "$prefix"
86
- if check_extension "$extension"; then
87
- add_log "${tick:?}" "$extension" "Enabled"
88
- 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"
96
- fi
97
- }
98
-
99
- # Function to handle request to add phpize and php-config.
100
- add_devtools() {
101
- tool=$1
102
- add_log "${tick:?}" "$tool" "Added $tool $semver"
103
- }
104
-
105
- # Function to handle request to add PECL.
106
- add_pecl() {
107
- configure_pecl >/dev/null 2>&1
108
- pecl_version=$(get_tool_version "pecl" "version")
109
- add_log "${tick:?}" "PECL" "Found PECL $pecl_version"
110
- }
111
-
112
- # Function to link all libraries of a formula.
113
- link_libraries() {
114
- formula=$1
115
- formula_prefix="$(brew --prefix "$formula")"
116
- sudo mkdir -p "$formula_prefix"/lib
117
- for lib in "$formula_prefix"/lib/*.dylib; do
118
- lib_name=$(basename "$lib")
119
- sudo cp -a "$lib" "$brew_prefix/lib/$lib_name" 2>/dev/null || true
120
- done
121
- }
122
-
123
- # Patch brew to overwrite packages.
124
- patch_brew() {
125
- formula_installer="$brew_repo"/Library/Homebrew/formula_installer.rb
126
- code=" keg.link(verbose: verbose?"
127
- sudo sed -i '' "s/$code)/$code, overwrite: true)/" "$formula_installer"
128
- # shellcheck disable=SC2064
129
- trap "sudo sed -i '' 's/$code, overwrite: true)/$code)/' $formula_installer" exit
130
- }
131
-
132
- # Helper function to update the dependencies.
133
- update_dependencies_helper() {
134
- dependency=$1
135
- get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$dependency.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$dependency.rb"
136
- link_libraries "$dependency"
137
- }
138
-
139
- # Function to update dependencies.
140
- update_dependencies() {
141
- if ! [ -e /tmp/update_dependencies ] && [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
142
- patch_brew
143
- while read -r dependency; do
144
- update_dependencies_helper "$dependency" &
145
- to_wait+=($!)
146
- done <"$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}"
147
- wait "${to_wait[@]}"
148
- echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1
149
- fi
150
- }
151
-
152
- # Function to fix dependencies on install PHP version.
153
- fix_dependencies() {
154
- broken_deps_paths=$(php -v 2>&1 | grep -Eo '/opt/[a-zA-Z0-9@\.]+')
155
- if [ "x$broken_deps_paths" != "x" ]; then
156
- update_dependencies
157
- IFS=" " read -r -a formulae <<< "$(echo "$broken_deps_paths" | tr '\n' ' ' | sed 's|/opt/||g' 2>&1)$php_formula"
158
- brew reinstall "${formulae[@]}"
159
- brew link --force --overwrite "$php_formula" || true
160
- fi
161
- }
162
-
163
- # Function to get PHP version if it is already installed using Homebrew.
164
- get_brewed_php() {
165
- php_cellar="$brew_prefix"/Cellar/php
166
- if [ -d "$php_cellar" ] && ! [[ "$(find "$php_cellar" -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]]; then
167
- php-config --version 2>/dev/null | cut -c 1-3
168
- else
169
- echo 'false';
170
- fi
171
- }
172
-
173
- # Function to setup PHP 5.6 and newer using Homebrew.
174
- add_php() {
175
- action=$1
176
- existing_version=$2
177
- add_brew_tap shivammathur/homebrew-php
178
- update_dependencies
179
- if [ "$existing_version" != "false" ]; then
180
- ([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula"
181
- else
182
- brew install -f "$php_formula"
183
- fi
184
- brew link --force --overwrite "$php_formula"
185
- }
186
-
187
- # Function to get extra version.
188
- php_extra_version() {
189
- if [[ ${version:?} =~ ${nightly_versions:?} ]]; then
190
- echo " ($(brew cat "$php_formula" | grep -Eo "commit=[0-9a-zA-Z]+" | cut -d'=' -f 2))"
191
- fi
192
- }
193
-
194
- # Function to Setup PHP.
195
- setup_php() {
196
- step_log "Setup PHP"
197
- existing_version=$(get_brewed_php)
198
- if [[ "$version" =~ ${old_versions:?} ]]; then
199
- run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
200
- status="Installed"
201
- elif [ "$existing_version" != "$version" ]; then
202
- add_php "install" "$existing_version" >/dev/null 2>&1
203
- status="Installed"
204
- elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
205
- add_php "upgrade" "$existing_version" >/dev/null 2>&1
206
- status="Updated to"
207
- else
208
- status="Found"
209
- fix_dependencies >/dev/null 2>&1
210
- fi
211
- ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
212
- sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
213
- configure_php
214
- ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
215
- scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
216
- sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
217
- semver=$(php_semver)
218
- extra_version=$(php_extra_version)
219
- if [ "${semver%.*}" != "$version" ]; then
220
- add_log "$cross" "PHP" "Could not setup PHP $version"
221
- exit 1
222
- fi
223
-
224
- sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
225
- echo "::set-output name=php-version::$semver"
226
- add_log "$tick" "PHP" "$status PHP $semver$extra_version"
227
- }
228
-
229
- # Variables
230
- version=$1
231
- dist=$2
232
- php_formula=shivammathur/php/php@"$version"
233
- brew_prefix="$(brew --prefix)"
234
- brew_repo="$(brew --repository)"
235
- tap_dir="$brew_repo"/Library/Taps
236
- scripts="${dist}"/../src/scripts
237
- export HOMEBREW_CHANGE_ARCH_TO_ARM=1
238
- export HOMEBREW_DEVELOPER=1
239
- export HOMEBREW_NO_INSTALL_CLEANUP=1
240
- export HOMEBREW_NO_AUTO_UPDATE=1
241
- export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
242
-
243
- # shellcheck source=.
244
- . "${scripts:?}"/ext/source.sh
245
- . "${scripts:?}"/tools/add_tools.sh
246
- . "${scripts:?}"/common.sh
247
- read_env
248
- self_hosted_setup
249
- setup_php
1
+ # Function to setup environment for self-hosted runners.
2
+ self_hosted_helper() {
3
+ if ! command -v brew >/dev/null; then
4
+ step_log "Setup Brew"
5
+ get -q -e "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/master/install.sh" && /tmp/install.sh >/dev/null 2>&1
6
+ add_log "${tick:?}" "Brew" "Installed Homebrew"
7
+ fi
8
+ }
9
+
10
+ # Disable dependency extensions
11
+ disable_dependency_extensions() {
12
+ local extension=$1
13
+ formula_file="$tap_dir/$ext_tap/Formula/$extension@${version:?}.rb"
14
+ if [ -e "$formula_file" ]; then
15
+ IFS=" " read -r -a dependency_extensions <<< "$(grep -Eo "shivammathur.*@" "$formula_file" | xargs -I {} -n 1 basename '{}' | cut -d '@' -f 1 | tr '\n' ' ')"
16
+ for dependency_extension in "${dependency_extensions[@]}"; do
17
+ sudo sed -Ei '' "/=(.*\/)?\"?$dependency_extension(.so)?$/d" "${ini_file:?}"
18
+ done
19
+ fi
20
+ }
21
+
22
+ # Helper function to disable an extension.
23
+ disable_extension_helper() {
24
+ local extension=$1
25
+ local disable_dependents=${2:-false}
26
+ get_extension_map
27
+ if [ "$disable_dependents" = "true" ]; then
28
+ disable_extension_dependents "$extension"
29
+ fi
30
+ sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
31
+ sudo rm -rf "$scan_dir"/*"$extension"*
32
+ mkdir -p /tmp/extdisabled/"$version"
33
+ echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension" >/dev/null 2>&1
34
+ }
35
+
36
+ # Function to fetch a brew tap.
37
+ fetch_brew_tap() {
38
+ tap=$1
39
+ tap_user=$(dirname "$tap")
40
+ tap_name=$(basename "$tap")
41
+ mkdir -p "$tap_dir/$tap_user"
42
+ get -s -n "" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
43
+ if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
44
+ sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
45
+ fi
46
+ }
47
+
48
+ # Function to add a brew tap.
49
+ add_brew_tap() {
50
+ tap=$1
51
+ if ! [ -d "$tap_dir/$tap" ]; then
52
+ if [ "${runner:?}" = "self-hosted" ]; then
53
+ brew tap "$tap" >/dev/null 2>&1
54
+ else
55
+ fetch_brew_tap "$tap" >/dev/null 2>&1
56
+ if ! [ -d "$tap_dir/$tap" ]; then
57
+ brew tap "$tap" >/dev/null 2>&1
58
+ fi
59
+ fi
60
+ fi
61
+ }
62
+
63
+ # Function to install a php extension from shivammathur/extensions tap.
64
+ add_brew_extension() {
65
+ formula=$1
66
+ prefix=$2
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
+ enable_extension "$extension" "$prefix"
70
+ if check_extension "$extension"; then
71
+ add_log "${tick:?}" "$extension" "Enabled"
72
+ else
73
+ add_brew_tap "$php_tap"
74
+ add_brew_tap "$ext_tap"
75
+ sudo mv "$tap_dir"/"$ext_tap"/.github/deps/"$formula"/* "$core_repo/Formula/" 2>/dev/null || true
76
+ update_dependencies >/dev/null 2>&1
77
+ disable_dependency_extensions "$extension" >/dev/null 2>&1
78
+ brew install -f "$formula@$version" >/dev/null 2>&1
79
+ sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
80
+ add_extension_log "$extension" "Installed and enabled"
81
+ fi
82
+ }
83
+
84
+ # Helper function to add an extension.
85
+ add_extension_helper() {
86
+ local extension=$1
87
+ prefix=$2
88
+ if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
89
+ run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
90
+ else
91
+ pecl_install "$extension" >/dev/null 2>&1 &&
92
+ if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
93
+ fi
94
+ add_extension_log "$extension" "Installed and enabled"
95
+ }
96
+
97
+ # Function to handle request to add phpize and php-config.
98
+ add_devtools() {
99
+ tool=$1
100
+ add_log "${tick:?}" "$tool" "Added $tool $semver"
101
+ }
102
+
103
+ # Function to handle request to add PECL.
104
+ add_pecl() {
105
+ enable_extension xml extension >/dev/null 2>&1
106
+ configure_pecl >/dev/null 2>&1
107
+ pear_version=$(get_tool_version "pecl" "version")
108
+ add_log "${tick:?}" "PECL" "Found PECL $pear_version"
109
+ }
110
+
111
+ # Function to link all libraries of a formula.
112
+ link_libraries() {
113
+ formula=$1
114
+ formula_prefix="$(brew --prefix "$formula")"
115
+ sudo mkdir -p "$formula_prefix"/lib
116
+ for lib in "$formula_prefix"/lib/*.dylib; do
117
+ lib_name=$(basename "$lib")
118
+ sudo cp -a "$lib" "$brew_prefix/lib/$lib_name" 2>/dev/null || true
119
+ done
120
+ }
121
+
122
+ # Patch brew to overwrite packages.
123
+ patch_brew() {
124
+ formula_installer="$brew_repo"/Library/Homebrew/formula_installer.rb
125
+ code=" keg.link(verbose: verbose?"
126
+ sudo sed -i '' "s/$code)/$code, overwrite: true)/" "$formula_installer"
127
+ # shellcheck disable=SC2064
128
+ trap "sudo sed -i '' 's/$code, overwrite: true)/$code)/' $formula_installer" exit
129
+ }
130
+
131
+ # Helper function to update the dependencies.
132
+ update_dependencies_helper() {
133
+ dependency=$1
134
+ get -q -n "$core_repo/Formula/$dependency.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$dependency.rb"
135
+ link_libraries "$dependency"
136
+ }
137
+
138
+ # Function to update dependencies.
139
+ update_dependencies() {
140
+ if ! [ -e /tmp/update_dependencies ]; then
141
+ if [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
142
+ patch_brew
143
+ while read -r dependency; do
144
+ update_dependencies_helper "$dependency" &
145
+ to_wait+=($!)
146
+ done <"$tap_dir/$php_tap/.github/deps/${ImageOS:?}_${ImageVersion:?}"
147
+ wait "${to_wait[@]}"
148
+ else
149
+ git -C "$core_repo" fetch origin master && git -C "$core_repo" reset --hard origin/master
150
+ fi
151
+ echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1
152
+ fi
153
+ }
154
+
155
+ # Function to fix dependencies on install PHP version.
156
+ fix_dependencies() {
157
+ broken_deps_paths=$(php -v 2>&1 | grep -Eo '/opt/[a-zA-Z0-9@\.]+')
158
+ if [ "x$broken_deps_paths" != "x" ]; then
159
+ update_dependencies
160
+ IFS=" " read -r -a formulae <<< "$(echo "$broken_deps_paths" | tr '\n' ' ' | sed 's|/opt/||g' 2>&1)$php_formula"
161
+ brew reinstall "${formulae[@]}"
162
+ brew link --force --overwrite "$php_formula" || true
163
+ fi
164
+ }
165
+
166
+ # Function to get PHP version if it is already installed using Homebrew.
167
+ get_brewed_php() {
168
+ php_cellar="$brew_prefix"/Cellar/php
169
+ if [ -d "$php_cellar" ] && ! [[ "$(find "$php_cellar" -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]]; then
170
+ php_semver | cut -c 1-3
171
+ else
172
+ echo 'false';
173
+ fi
174
+ }
175
+
176
+ # Function to setup PHP 5.6 and newer using Homebrew.
177
+ add_php() {
178
+ action=$1
179
+ existing_version=$2
180
+ add_brew_tap "$php_tap"
181
+ update_dependencies
182
+ if [ "$existing_version" != "false" ]; then
183
+ ([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula"
184
+ else
185
+ brew install -f "$php_formula"
186
+ fi
187
+ brew link --force --overwrite "$php_formula"
188
+ }
189
+
190
+ # Function to get extra version.
191
+ php_extra_version() {
192
+ php_formula_file="$tap_dir"/"$php_tap"/Formula/php@"$version".rb
193
+ if [ -e "$php_formula_file" ] && ! grep -q "deprecate!" "$php_formula_file" && grep -Eq "archive/[0-9a-zA-Z]+" "$php_formula_file"; then
194
+ echo " ($(grep -Eo "archive/[0-9a-zA-Z]+" "$php_formula_file" | cut -d'/' -f 2))"
195
+ fi
196
+ }
197
+
198
+ # Function to set php.ini
199
+ add_php_config() {
200
+ if ! [ -e "$ini_dir"/php.ini-development ]; then
201
+ sudo cp "$ini_dir"/php.ini "$ini_dir"/php.ini-development
202
+ fi
203
+ if [[ "$ini" = "production" || "$ini" = "development" ]]; then
204
+ sudo cp "$ini_dir"/php.ini-"$ini" "$ini_dir"/php.ini
205
+ elif [ "$ini" = "none" ]; then
206
+ echo '' | sudo tee "${ini_file[@]}" >/dev/null 2>&1
207
+ fi
208
+ }
209
+
210
+ # Function to get scan directory.
211
+ get_scan_dir() {
212
+ if [[ "$version" =~ ${old_versions:?} ]]; then
213
+ php --ini | grep additional | sed -e "s|.*: s*||"
214
+ else
215
+ echo "$ini_dir"/conf.d
216
+ fi
217
+ }
218
+
219
+ # Function to Setup PHP.
220
+ setup_php() {
221
+ step_log "Setup PHP"
222
+ php_config="$(command -v php-config 2>/dev/null)"
223
+ existing_version=$(get_brewed_php)
224
+ if [[ "$version" =~ ${old_versions:?} ]]; then
225
+ run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
226
+ status="Installed"
227
+ elif [ "$existing_version" != "$version" ]; then
228
+ add_php "install" "$existing_version" >/dev/null 2>&1
229
+ status="Installed"
230
+ elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
231
+ add_php "upgrade" "$existing_version" >/dev/null 2>&1
232
+ status="Updated to"
233
+ else
234
+ status="Found"
235
+ fix_dependencies >/dev/null 2>&1
236
+ fi
237
+ php_config="$(command -v php-config)"
238
+ ext_dir="$(grep 'extension_dir=' "$php_config" | cut -d "'" -f 2)"
239
+ ini_dir="$(php_ini_path)"
240
+ scan_dir="$(get_scan_dir)"
241
+ ini_file="$ini_dir"/php.ini
242
+ sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
243
+ sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
244
+ semver="$(php_semver)"
245
+ extra_version="$(php_extra_version)"
246
+ configure_php
247
+ set_output "php-version" "$semver"
248
+ if [ "${semver%.*}" != "$version" ]; then
249
+ add_log "${cross:?}" "PHP" "Could not setup PHP $version"
250
+ exit 1
251
+ fi
252
+
253
+ sudo cp "$src"/configs/pm/*.json "$RUNNER_TOOL_CACHE/"
254
+ add_log "$tick" "PHP" "$status PHP $semver$extra_version"
255
+ }
256
+
257
+ # Variables
258
+ version=${1:-'8.1'}
259
+ ini=${2:-'production'}
260
+ src=${0%/*}/..
261
+ php_formula=shivammathur/php/php@"$version"
262
+ brew_path="$(command -v brew)"
263
+ brew_path_dir="$(dirname "$brew_path")"
264
+ brew_prefix="$brew_path_dir"/..
265
+ brew_repo="$brew_path_dir/$(dirname "$(readlink "$brew_path")")"/..
266
+ tap_dir="$brew_repo"/Library/Taps
267
+ core_repo="$tap_dir"/homebrew/homebrew-core
268
+ scripts="$src"/scripts
269
+ ext_tap=shivammathur/homebrew-extensions
270
+ php_tap=shivammathur/homebrew-php
271
+ export HOMEBREW_CHANGE_ARCH_TO_ARM=1
272
+ export HOMEBREW_DEVELOPER=1
273
+ export HOMEBREW_NO_AUTO_UPDATE=1
274
+ export HOMEBREW_NO_ENV_HINTS=1
275
+ export HOMEBREW_NO_INSTALL_CLEANUP=1
276
+ export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
277
+
278
+ # shellcheck source=.
279
+ . "${scripts:?}"/unix.sh
280
+ . "${scripts:?}"/tools/add_tools.sh
281
+ . "${scripts:?}"/extensions/source.sh
282
+ . "${scripts:?}"/extensions/add_extensions.sh
283
+ read_env
284
+ self_hosted_setup
285
+ setup_php