diff --git a/config/pkg/ext/ext-amqp.yml b/config/pkg/ext/ext-amqp.yml index 6c73bf203..35bce4d93 100644 --- a/config/pkg/ext/ext-amqp.yml +++ b/config/pkg/ext/ext-amqp.yml @@ -2,8 +2,8 @@ ext-amqp: type: php-extension artifact: source: - type: pecl - name: amqp + type: pie + repo: php-amqp/php-amqp metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-apcu.yml b/config/pkg/ext/ext-apcu.yml index 331b04f76..42e215408 100644 --- a/config/pkg/ext/ext-apcu.yml +++ b/config/pkg/ext/ext-apcu.yml @@ -2,8 +2,8 @@ ext-apcu: type: php-extension artifact: source: - type: pecl - name: APCu + type: pie + repo: apcu/apcu metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-ast.yml b/config/pkg/ext/ext-ast.yml index 776b82dff..201010f11 100644 --- a/config/pkg/ext/ext-ast.yml +++ b/config/pkg/ext/ext-ast.yml @@ -2,8 +2,8 @@ ext-ast: type: php-extension artifact: source: - type: pecl - name: ast + type: pie + repo: nikic/php-ast metadata: license-files: [LICENSE] license: BSD-3-Clause diff --git a/config/pkg/ext/ext-dio.yml b/config/pkg/ext/ext-dio.yml index b445940c3..18201a795 100644 --- a/config/pkg/ext/ext-dio.yml +++ b/config/pkg/ext/ext-dio.yml @@ -2,8 +2,8 @@ ext-dio: type: php-extension artifact: source: - type: pecl - name: dio + type: pie + repo: pecl/dio metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-ev.yml b/config/pkg/ext/ext-ev.yml index 174e5f843..dea1a1fab 100644 --- a/config/pkg/ext/ext-ev.yml +++ b/config/pkg/ext/ext-ev.yml @@ -2,8 +2,8 @@ ext-ev: type: php-extension artifact: source: - type: pecl - name: ev + type: pie + repo: osmanov/pecl-ev metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-excimer.yml b/config/pkg/ext/ext-excimer.yml index a896fe0bd..81219610a 100644 --- a/config/pkg/ext/ext-excimer.yml +++ b/config/pkg/ext/ext-excimer.yml @@ -2,8 +2,9 @@ ext-excimer: type: php-extension artifact: source: - type: pecl - name: excimer + type: ghtagtar + repo: wikimedia/mediawiki-php-excimer + extract: php-src/ext/excimer metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-gearman.yml b/config/pkg/ext/ext-gearman.yml index 7699a344b..3a21204fa 100644 --- a/config/pkg/ext/ext-gearman.yml +++ b/config/pkg/ext/ext-gearman.yml @@ -2,8 +2,9 @@ ext-gearman: type: php-extension artifact: source: - type: pecl - name: gearman + type: ghtar + repo: php/pecl-networking-gearman + extract: php-src/ext/gearman metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-grpc.yml b/config/pkg/ext/ext-grpc.yml index ae63cad2b..72b4d3550 100644 --- a/config/pkg/ext/ext-grpc.yml +++ b/config/pkg/ext/ext-grpc.yml @@ -2,8 +2,8 @@ ext-grpc: type: php-extension artifact: source: - type: pecl - name: grpc + type: pie + repo: grpc/grpc-php-ext metadata: license-files: [LICENSE] license: Apache-2.0 diff --git a/config/pkg/ext/ext-imagick.yml b/config/pkg/ext/ext-imagick.yml index 89ddb341a..a2ae6abeb 100644 --- a/config/pkg/ext/ext-imagick.yml +++ b/config/pkg/ext/ext-imagick.yml @@ -2,8 +2,8 @@ ext-imagick: type: php-extension artifact: source: - type: pecl - name: imagick + type: pie + repo: imagick/imagick metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-imap.yml b/config/pkg/ext/ext-imap.yml index 3abcebb8b..52188ca77 100644 --- a/config/pkg/ext/ext-imap.yml +++ b/config/pkg/ext/ext-imap.yml @@ -2,8 +2,9 @@ ext-imap: type: php-extension artifact: source: - type: pecl - name: imap + type: ghtagtar + repo: php/pecl-mail-imap + extract: php-src/ext/imap metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-inotify.yml b/config/pkg/ext/ext-inotify.yml index d69847ee4..ee8ec8bb6 100644 --- a/config/pkg/ext/ext-inotify.yml +++ b/config/pkg/ext/ext-inotify.yml @@ -2,8 +2,8 @@ ext-inotify: type: php-extension artifact: source: - type: pecl - name: inotify + type: pie + repo: arnaud-lb/inotify metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-memcache.yml b/config/pkg/ext/ext-memcache.yml index 6e1f4385c..119299685 100644 --- a/config/pkg/ext/ext-memcache.yml +++ b/config/pkg/ext/ext-memcache.yml @@ -2,8 +2,9 @@ ext-memcache: type: php-extension artifact: source: - type: pecl - name: memcache + type: ghtar + repo: websupport-sk/pecl-memcache + extract: php-src/ext/memcache metadata: license-files: [LICENSE] license: PHP-3.0 diff --git a/config/pkg/ext/ext-memcached.yml b/config/pkg/ext/ext-memcached.yml index b320c6699..5f3eb81b3 100644 --- a/config/pkg/ext/ext-memcached.yml +++ b/config/pkg/ext/ext-memcached.yml @@ -2,8 +2,8 @@ ext-memcached: type: php-extension artifact: source: - type: pecl - name: memcached + type: pie + repo: php-memcached/php-memcached metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-msgpack.yml b/config/pkg/ext/ext-msgpack.yml index 8b230c31a..52e35edec 100644 --- a/config/pkg/ext/ext-msgpack.yml +++ b/config/pkg/ext/ext-msgpack.yml @@ -2,8 +2,8 @@ ext-msgpack: type: php-extension artifact: source: - type: pecl - name: msgpack + type: pie + repo: msgpack/msgpack-php metadata: license-files: [LICENSE] license: BSD-3-Clause diff --git a/config/pkg/ext/ext-mysqlnd_ed25519.yml b/config/pkg/ext/ext-mysqlnd_ed25519.yml index e7aa3de89..f6f79977f 100644 --- a/config/pkg/ext/ext-mysqlnd_ed25519.yml +++ b/config/pkg/ext/ext-mysqlnd_ed25519.yml @@ -4,7 +4,6 @@ ext-mysqlnd_ed25519: source: type: pie repo: mariadb/mysqlnd_ed25519 - extract: php-src/ext/mysqlnd_ed25519 metadata: license-files: [LICENSE] license: BSD-3-Clause diff --git a/config/pkg/ext/ext-mysqlnd_parsec.yml b/config/pkg/ext/ext-mysqlnd_parsec.yml index 903d65c40..955058e7c 100644 --- a/config/pkg/ext/ext-mysqlnd_parsec.yml +++ b/config/pkg/ext/ext-mysqlnd_parsec.yml @@ -4,7 +4,6 @@ ext-mysqlnd_parsec: source: type: pie repo: mariadb/mysqlnd_parsec - extract: php-src/ext/mysqlnd_parsec metadata: license-files: [LICENSE] license: BSD-3-Clause diff --git a/config/pkg/ext/ext-parallel.yml b/config/pkg/ext/ext-parallel.yml index 94103f578..d9ed0b2fe 100644 --- a/config/pkg/ext/ext-parallel.yml +++ b/config/pkg/ext/ext-parallel.yml @@ -2,8 +2,8 @@ ext-parallel: type: php-extension artifact: source: - type: pecl - name: parallel + type: pie + repo: pecl/parallel metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-pcov.yml b/config/pkg/ext/ext-pcov.yml index 3fac61d08..59a5fbbed 100644 --- a/config/pkg/ext/ext-pcov.yml +++ b/config/pkg/ext/ext-pcov.yml @@ -2,8 +2,8 @@ ext-pcov: type: php-extension artifact: source: - type: pecl - name: pcov + type: pie + repo: pecl/pcov metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-redis.yml b/config/pkg/ext/ext-redis.yml index c05b4ee26..84f603e3f 100644 --- a/config/pkg/ext/ext-redis.yml +++ b/config/pkg/ext/ext-redis.yml @@ -2,8 +2,8 @@ ext-redis: type: php-extension artifact: source: - type: pecl - name: redis + type: pie + repo: phpredis/phpredis metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-spx.yml b/config/pkg/ext/ext-spx.yml index edf41f514..32f7a2e11 100644 --- a/config/pkg/ext/ext-spx.yml +++ b/config/pkg/ext/ext-spx.yml @@ -4,7 +4,6 @@ ext-spx: source: type: pie repo: noisebynorthwest/php-spx - extract: php-src/ext/spx metadata: license-files: [LICENSE] license: GPL-3.0-or-later diff --git a/config/pkg/ext/ext-ssh2.yml b/config/pkg/ext/ext-ssh2.yml index 14c9bf327..53b065be5 100644 --- a/config/pkg/ext/ext-ssh2.yml +++ b/config/pkg/ext/ext-ssh2.yml @@ -2,8 +2,9 @@ ext-ssh2: type: php-extension artifact: source: - type: pecl - name: ssh2 + type: ghtar + repo: php/pecl-networking-ssh2 + extract: php-src/ext/ssh2 metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-trader.yml b/config/pkg/ext/ext-trader.yml index 03dcadc60..4ef8369fa 100644 --- a/config/pkg/ext/ext-trader.yml +++ b/config/pkg/ext/ext-trader.yml @@ -2,8 +2,9 @@ ext-trader: type: php-extension artifact: source: - type: pecl - name: trader + type: ghtagtar + repo: php/pecl-math-trader + extract: php-src/ext/trader metadata: license-files: [LICENSE] license: BSD-2-Clause diff --git a/config/pkg/ext/ext-uuid.yml b/config/pkg/ext/ext-uuid.yml index 3d71aa8b4..e2e055310 100644 --- a/config/pkg/ext/ext-uuid.yml +++ b/config/pkg/ext/ext-uuid.yml @@ -2,8 +2,8 @@ ext-uuid: type: php-extension artifact: source: - type: pecl - name: uuid + type: pie + repo: pecl/uuid metadata: license-files: [LICENSE] license: LGPL-2.1-only diff --git a/config/pkg/ext/ext-uv.yml b/config/pkg/ext/ext-uv.yml index 59d4a8c90..a974ed05e 100644 --- a/config/pkg/ext/ext-uv.yml +++ b/config/pkg/ext/ext-uv.yml @@ -2,9 +2,9 @@ ext-uv: type: php-extension artifact: source: - type: pecl - name: uv - prefer-stable: false + type: ghtagtar + repo: amphp/ext-uv + extract: php-src/ext/uv metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-xdebug.yml b/config/pkg/ext/ext-xdebug.yml index 20c6b4600..43b8795ad 100644 --- a/config/pkg/ext/ext-xdebug.yml +++ b/config/pkg/ext/ext-xdebug.yml @@ -4,6 +4,7 @@ ext-xdebug: source: type: pie repo: xdebug/xdebug + extract: ext-xdebug metadata: license-files: [LICENSE] license: Xdebug-1.03 diff --git a/config/pkg/ext/ext-xhprof.yml b/config/pkg/ext/ext-xhprof.yml index a554d8375..f88baec88 100644 --- a/config/pkg/ext/ext-xhprof.yml +++ b/config/pkg/ext/ext-xhprof.yml @@ -2,8 +2,8 @@ ext-xhprof: type: php-extension artifact: source: - type: pecl - name: xhprof + type: ghtar + repo: longxinH/xhprof extract: php-src/ext/xhprof-src metadata: license-files: [LICENSE] diff --git a/config/pkg/ext/ext-yac.yml b/config/pkg/ext/ext-yac.yml index e10bea064..9608cad6b 100644 --- a/config/pkg/ext/ext-yac.yml +++ b/config/pkg/ext/ext-yac.yml @@ -2,8 +2,9 @@ ext-yac: type: php-extension artifact: source: - type: pecl - name: yac + type: ghtagtar + repo: laruence/yac + extract: php-src/ext/yac metadata: license-files: [LICENSE] license: PHP-3.01 diff --git a/config/pkg/ext/ext-zip.yml b/config/pkg/ext/ext-zip.yml index 3b164e38b..9b90e91c2 100644 --- a/config/pkg/ext/ext-zip.yml +++ b/config/pkg/ext/ext-zip.yml @@ -2,8 +2,8 @@ ext-zip: type: php-extension artifact: source: - type: pecl - name: zip + type: pie + repo: pecl/zip extract: ext-zip metadata: license-files: [LICENSE] diff --git a/src/StaticPHP/Artifact/Downloader/Type/PIE.php b/src/StaticPHP/Artifact/Downloader/Type/PIE.php index 14996c5af..1dd1c1c0f 100644 --- a/src/StaticPHP/Artifact/Downloader/Type/PIE.php +++ b/src/StaticPHP/Artifact/Downloader/Type/PIE.php @@ -22,12 +22,13 @@ public function download(string $name, array $config, ArtifactDownloader $downlo if (!$dist_url || !$dist_type) { throw new DownloaderException("failed to find {$name} dist info from packagist"); } + $extract = $config['extract'] ?? ('php-src/ext/' . strtolower(preg_replace('/^ext-/i', '', $name))); $name = str_replace('/', '_', $config['repo']); $version = $first['version'] ?? 'unknown'; $filename = "{$name}-{$version}." . ($dist_type === 'zip' ? 'zip' : 'tar.gz'); $path = DOWNLOAD_PATH . DIRECTORY_SEPARATOR . $filename; default_shell()->executeCurlDownload($dist_url, $path, retries: $downloader->getRetry()); - return DownloadResult::archive($filename, $config, $config['extract'] ?? null, version: $version, downloader: static::class); + return DownloadResult::archive($filename, $config, $extract, version: $version, downloader: static::class); } public function checkUpdate(string $name, array $config, ?string $old_version, ArtifactDownloader $downloader): CheckUpdateResult @@ -56,7 +57,23 @@ protected function fetchPackagistInfo(string $name, array $config, ArtifactDownl if (!isset($data['packages'][$config['repo']]) || !is_array($data['packages'][$config['repo']])) { throw new DownloaderException("failed to find {$name} repo info from packagist"); } - $first = $data['packages'][$config['repo']][0] ?? []; + // p2 metadata is minified: each entry only carries fields changed vs the previous one, '__unset' removes a field + $releases = []; + $current = []; + foreach ($data['packages'][$config['repo']] as $release) { + $current = array_merge($current, $release); + $current = array_filter($current, static fn ($v) => $v !== '__unset'); + $releases[] = $current; + } + // packagist lists newest first including RC/beta/alpha — pick the newest stable release + $first = null; + foreach ($releases as $release) { + if (!preg_match('/[._-]?(?:alpha|a|beta|b|rc)[._-]?\d*$/i', $release['version'] ?? '')) { + $first = $release; + break; + } + } + $first ??= $releases[0] ?? []; if (!isset($first['php-ext'])) { throw new DownloaderException("failed to find {$name} php-ext info from packagist, maybe not a php extension package"); }