mirror of
https://github.com/shivammathur/setup-php.git
synced 2026-09-24 19:12:07 +07:00
Prefetch optional macOS extension caches alongside PHP installation
This commit is contained in:
@@ -1,5 +1,18 @@
|
||||
import * as utils from './utils';
|
||||
|
||||
/** Select only unversioned, requested macOS extension caches. */
|
||||
export async function extensionPacks(
|
||||
extension_csv: string,
|
||||
version: string,
|
||||
os: string
|
||||
): Promise<string[]> {
|
||||
if (os !== 'darwin' || !/^8\.[2-5]$/.test(version)) return [];
|
||||
const requested = await utils.extensionArray(extension_csv);
|
||||
return ['imagick', 'mongodb', 'memcached'].filter(
|
||||
name => requested.includes(name) && !requested.includes(':' + name)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Install and enable extensions for darwin
|
||||
*
|
||||
|
||||
@@ -31,6 +31,13 @@ export async function getScript(os: string): Promise<string> {
|
||||
const ini_file: string = await utils.parseIniFile(
|
||||
await utils.getInput('ini-file', false)
|
||||
);
|
||||
const packs = await extensions.extensionPacks(extension_csv, version, os);
|
||||
if (packs.length) {
|
||||
process.env['SETUP_PHP_EXTENSION_PACKS'] = packs.join(' ');
|
||||
process.env['SETUP_PHP_NODE'] = process.execPath;
|
||||
} else {
|
||||
delete process.env['SETUP_PHP_EXTENSION_PACKS'];
|
||||
}
|
||||
let script = await utils.joins('.', script_path, `'${version}'`, ini_file);
|
||||
if (extension_csv) {
|
||||
script += await extensions.addExtension(extension_csv, version, os);
|
||||
|
||||
@@ -77,6 +77,9 @@ add_brew_extension() {
|
||||
prefix=$2
|
||||
expected_version=${3:-}
|
||||
extension="$(get_extension_from_formula "$formula")"
|
||||
if [ "$extension" = memcached ] && [ -n "${extension_cache_memcached_dependencies:-}" ]; then
|
||||
enable_extension_cache_dependencies "$extension"
|
||||
fi
|
||||
enable_extension "$extension" "$prefix"
|
||||
if check_extension "$extension" && { [ -z "$expected_version" ] || check_extension_version "$extension" "$expected_version"; }; then
|
||||
add_log "${tick:?}" "$extension" "Enabled"
|
||||
@@ -337,4 +340,10 @@ export HOMEBREW_NO_INSTALL_FROM_API=1
|
||||
configure_brew
|
||||
read_env
|
||||
self_hosted_setup
|
||||
if [ -n "${SETUP_PHP_EXTENSION_PACKS:-}" ]; then
|
||||
# shellcheck source=.
|
||||
. "$scripts/extensions/darwin_cache.sh"
|
||||
start_extension_cache_downloads
|
||||
fi
|
||||
setup_php
|
||||
if [ -n "${SETUP_PHP_EXTENSION_PACKS:-}" ]; then finish_extension_cache_downloads; fi
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# Optional macOS extension archives. Downloads overlap PHP installation; the
|
||||
# PHP-only path never sources this file or contacts the extension cache.
|
||||
start_extension_cache_downloads() {
|
||||
extension_cache_dir=$(mktemp -d "${RUNNER_TEMP:-/tmp}/setup-php-extensions.XXXXXX") || return 0
|
||||
(
|
||||
cache_installer="$extension_cache_dir/install-extensions.cjs"
|
||||
cache_primary="https://github.com/shivammathur/php-darwin/releases/download/extensions"
|
||||
cache_mirror="https://artifacts.php-darwin.setup-php.com/extensions"
|
||||
curl -fsSL --retry 0 --connect-timeout 3 --max-time 3 --max-filesize 2000000 \
|
||||
"$cache_primary/install-extensions.cjs" -o "$cache_installer" ||
|
||||
curl -fsSL --retry 0 --connect-timeout 3 --max-time 10 --max-filesize 2000000 \
|
||||
"$cache_mirror/install-extensions.cjs" -o "$cache_installer" || exit 0
|
||||
IFS=' ' read -r -a cache_extensions <<< "$SETUP_PHP_EXTENSION_PACKS"
|
||||
"$SETUP_PHP_NODE" "$cache_installer" prefetch "$extension_cache_dir" \
|
||||
"$version" "$debug" "$ts" "$(uname -m)" "${cache_extensions[@]}"
|
||||
) > "$extension_cache_dir/download.log" 2>&1 &
|
||||
extension_cache_pid=$!
|
||||
}
|
||||
|
||||
finish_extension_cache_downloads() {
|
||||
[ -n "${extension_cache_pid:-}" ] || return 0
|
||||
wait "$extension_cache_pid" || true
|
||||
extension_cache_pid=
|
||||
if [[ "${verbose:-${VERBOSE:-}}" =~ ^(true|v{1,3})$ ]]; then
|
||||
cat "$extension_cache_dir/download.log"
|
||||
fi
|
||||
[ -s "$extension_cache_dir/install-extensions.cjs" ] || return 0
|
||||
local extension variable value
|
||||
for extension in $SETUP_PHP_EXTENSION_PACKS; do
|
||||
[ -s "$extension_cache_dir/$extension.json" ] || continue
|
||||
if "$SETUP_PHP_NODE" "$extension_cache_dir/install-extensions.cjs" install "$extension_cache_dir" "$extension"; then
|
||||
while IFS='=' read -r variable value; do
|
||||
case "$variable" in
|
||||
MAGICK_CONFIGURE_PATH|MAGICK_CODER_MODULE_PATH|MAGICK_FILTER_MODULE_PATH)
|
||||
add_env "$variable" "$value"
|
||||
;;
|
||||
esac
|
||||
done < "$extension_cache_dir/$extension.env"
|
||||
# Store the dependency names in shell variables; the download directory
|
||||
# can be removed before the action enables its requested extensions.
|
||||
if [ "$extension" = memcached ]; then
|
||||
extension_cache_memcached_dependencies='igbinary msgpack'
|
||||
fi
|
||||
else
|
||||
printf 'setup-php: %s cache unavailable for this PHP; using the existing installer\n' "$extension"
|
||||
fi
|
||||
done
|
||||
rm -rf "$extension_cache_dir"
|
||||
extension_cache_dir=
|
||||
}
|
||||
|
||||
enable_extension_cache_dependencies() {
|
||||
if [ "$1" = memcached ] && [ -n "${extension_cache_memcached_dependencies:-}" ]; then
|
||||
local dependency
|
||||
for dependency in $extension_cache_memcached_dependencies; do
|
||||
enable_extension "$dependency" extension
|
||||
done
|
||||
fi
|
||||
}
|
||||
Reference in New Issue
Block a user