From 12cc6a507b7e345c37d6a367e77815711c82b208 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Wed, 19 Aug 2026 14:35:13 +0530 Subject: [PATCH] Fix versioned extension caching --- src/scripts/extensions/add_extensions.ps1 | 12 +++++++-- src/scripts/extensions/add_extensions.sh | 33 +++++++---------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/scripts/extensions/add_extensions.ps1 b/src/scripts/extensions/add_extensions.ps1 index cdc2189a..644bf40d 100644 --- a/src/scripts/extensions/add_extensions.ps1 +++ b/src/scripts/extensions/add_extensions.ps1 @@ -105,10 +105,15 @@ Function Add-Extension { $extension_version = '' ) try { - $extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension } $deps_dir = "$ext_dir\$extension-vc$($installed.VCVersion)-$arch" New-Item $deps_dir -Type Directory -Force > $null 2>&1 - if ($null -ne $extension_info) { + if($extension_version -ne '' -and (Test-Path "$ext_dir\$extension-$extension_version")) { + Copy-Item "$ext_dir\$extension-$extension_version" "$ext_dir\php_$extension.dll" -Force + Enable-Extension $extension + return + } + $extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension } + if ($null -ne $extension_info -and ($extension_version -eq '' -or $extension_info.Version[0] -eq $extension_version)) { switch ($extension_info.State) { 'Builtin' { Add-Log $tick $extension "Enabled" @@ -145,6 +150,9 @@ Function Add-Extension { } Add-Log $tick $extension "Installed and enabled" } + if($extension_version -ne '' -and (Test-Path "$ext_dir\php_$extension.dll")) { + Copy-Item "$ext_dir\php_$extension.dll" "$ext_dir\$extension-$extension_version" -Force + } } catch { Add-Log $cross $extension "Could not install $extension on PHP $( $installed.FullVersion )" } diff --git a/src/scripts/extensions/add_extensions.sh b/src/scripts/extensions/add_extensions.sh index bab5ce5e..90b08b86 100644 --- a/src/scripts/extensions/add_extensions.sh +++ b/src/scripts/extensions/add_extensions.sh @@ -209,39 +209,26 @@ add_pecl_extension() { local extension=$1 local pecl_version=$2 local prefix=$3 - enable_extension "$extension" "$prefix" if [[ $pecl_version =~ .*(alpha|beta|rc|snapshot|preview).* ]]; then pecl_version=$(get_pecl_version "$extension" "$pecl_version") fi - ext_version=$(php -r "echo phpversion('$extension');") - # The PHP package install itself can bundle its own default build of a - # versioned extension (e.g. redis ships with its own recent version), - # which overwrites ext_dir/$extension.so before this function ever runs. - # shared_extension only checks that *a* file exists, not which version, so - # a build matching the pinned version - even one cache-extensions already - # restored into ext_dir - never gets a chance: this always fell straight - # through to pecl_install regardless of caching. Preserve built versions - # in ext_dir itself under a name with no .so suffix, so cache-extensions - # (which caches all of ext_dir) picks them up automatically, and the PHP - # package install's own file can't collide with or overwrite them. On a - # mismatch, restore the matching preserved build before falling back to a - # full pecl_install. - if [ -n "$pecl_version" ] && check_extension "$extension" && [ "${ext_version/-/}" != "$pecl_version" ]; then - preserved="${ext_dir:?}/$extension-$pecl_version" - if [ -e "$preserved" ]; then - disable_extension_helper "$extension" >/dev/null 2>&1 - sudo cp "$preserved" "${ext_dir:?}/$extension.so" - enable_extension "$extension" "$prefix" - ext_version=$(php -r "echo phpversion('$extension');") - fi + # Cache versioned extensions using suffixless copies in extension_dir. + if [ -n "$pecl_version" ] && [ -e "${ext_dir:?}/$extension-$pecl_version" ]; then + sudo cp "${ext_dir:?}/$extension-$pecl_version" "${ext_dir:?}/$extension.so" + enable_extension "$extension" "$prefix" + add_log "${tick:?}" "$extension" "Enabled" + return fi + enable_extension "$extension" "$prefix" + ext_version=$(php -r "echo phpversion('$extension');") if check_extension "$extension" && [[ -z "$pecl_version" || (-n "$pecl_version" && "${ext_version/-/}" == "$pecl_version") ]]; then + [ -n "$pecl_version" ] && sudo cp "${ext_dir:?}/$extension.so" "${ext_dir:?}/$extension-$pecl_version" 2>/dev/null || true add_log "${tick:?}" "$extension" "Enabled" else [ -n "$pecl_version" ] && pecl_version="-$pecl_version" pecl_install "$extension$pecl_version" || ( [ "${fail_fast:?}" = "false" ] && add_extension "$extension" "$(get_extension_prefix "$extension")" >/dev/null 2>&1) extension_version="$(php -r "echo phpversion('$extension');")" - if check_extension "$extension" && [ -n "$extension_version" ]; then + if [ -n "$pecl_version" ] && [ "${extension_version/-/}" = "${pecl_version#-}" ]; then sudo cp "${ext_dir:?}/$extension.so" "${ext_dir:?}/$extension-$extension_version" 2>/dev/null || true fi [ -n "$extension_version" ] && extension_version="-$extension_version"