[web-downloads] main: Add support to upload PECL deps

From: Date: Tue, 18 Nov 2025 18:34:34 +0000
Subject: [web-downloads] main: Add support to upload PECL deps
Groups: php.webmaster 
Request: Send a blank email to php-webmaster+get-33357@lists.php.net to get a copy of this message
Author: Shivam Mathur (shivammathur) Date: 2025-11-19T00:04:04+05:30 Commit: https://github.com/php/web-downloads/commit/7b294549bbf926ba6c8620ea93e1959634f574de Raw diff: https://github.com/php/web-downloads/commit/7b294549bbf926ba6c8620ea93e1959634f574de.diff Add support to upload PECL deps Changed paths: M .github/workflows/winlibs.yml M API.md M src/Console/Command/WinlibsCommand.php M src/Http/Controllers/WinlibsController.php M tests/Console/Command/WinlibsCommandTest.php Diff: diff --git a/.github/workflows/winlibs.yml b/.github/workflows/winlibs.yml index f6c981a..8ead945 100644 --- a/.github/workflows/winlibs.yml +++ b/.github/workflows/winlibs.yml @@ -9,6 +9,10 @@ on: ref: description: 'Library Ref' required: true + type: + description: 'Library Type (php or pecl)' + required: true + default: 'php' workflow_run_id: description: 'Workflow Run ID' required: true @@ -32,4 +36,4 @@ jobs: --request POST \ --location https://downloads.php.net/api/winlibs \ --header 'Authorization: Bearer ${{ secrets.AUTH_TOKEN }}' \ - --data '{ "library": "${{ inputs.library }}", "ref": "${{ inputs.ref }}", "workflow_run_id": "${{ inputs.workflow_run_id }}", "php_versions": "${{ inputs.php_versions }}", "vs_version": "${{ inputs.vs_version }}", "vs_version_targets": "${{ inputs.vs_version_targets }}", "stability": "${{ inputs.stability }}", "token": "${{ secrets.TOKEN }}" }' + --data '{ "library": "${{ inputs.library }}", "ref": "${{ inputs.ref }}", "type": "${{ inputs.type }}", "workflow_run_id": "${{ inputs.workflow_run_id }}", "php_versions": "${{ inputs.php_versions }}", "vs_version": "${{ inputs.vs_version }}", "vs_version_targets": "${{ inputs.vs_version_targets }}", "stability": "${{ inputs.stability }}", "token": "${{ secrets.TOKEN }}" }' diff --git a/API.md b/API.md index b5dacb2..9240bff 100644 --- a/API.md +++ b/API.md @@ -138,6 +138,7 @@ curl -i -X POST \ - Request body (JSON): - library (string, required) - ref (string, required) + - type (string, required): php, or pecl. - workflow_run_id (string, required) - php_versions (string, required): Comma-separated list matching ^(?:\d+\.\d+|master)(?:,\s*(?:\d+\.\d+|master))*$. - vs_version_targets (string, required): Comma-separated list matching ^(v[c|s]\d{2})(,v[c|s]\d{2})*$. diff --git a/src/Console/Command/WinlibsCommand.php b/src/Console/Command/WinlibsCommand.php index 4ddac95..1edc3a7 100644 --- a/src/Console/Command/WinlibsCommand.php +++ b/src/Console/Command/WinlibsCommand.php @@ -45,14 +45,18 @@ public function handle(): int $files = glob($directoryPath . '/*.zip'); $files = $this->parseFiles($files); if ($files) { - $this->copyFiles($files, $data['library'], $data['vs_version_targets']); - $this->updateSeriesFiles( - $files, - $data['library'], - $data['php_versions'], - $data['vs_version_targets'], - $data['stability'] - ); + if($data['type'] === 'php') { + $this->copyPhpFiles($files, $data['library'], $data['vs_version_targets']); + $this->updateSeriesFiles( + $files, + $data['library'], + $data['php_versions'], + $data['vs_version_targets'], + $data['stability'] + ); + } else { + $this->copyPeclFiles($files, $data['library']); + } } (new Helpers)->rmdirr($directoryPath); @@ -85,7 +89,7 @@ public function parseFiles(array $files): array return $data; } - private function copyFiles(array $files, string $library, string $vs_version_targets): void + private function copyPhpFiles(array $files, string $library, string $vs_version_targets): void { $baseDirectory = $this->baseDirectory . "/php-sdk/deps"; if (!is_dir($baseDirectory)) { @@ -104,6 +108,22 @@ private function copyFiles(array $files, string $library, string $vs_version_tar } } + private function copyPeclFiles(array $files, string $library): void + { + $baseDirectory = $this->baseDirectory . "/pecl/deps"; + if (!is_dir($baseDirectory)) { + mkdir($baseDirectory, 0755, true); + } + foreach ($files as $file) { + $destinationDirectory = $baseDirectory; + if (!is_dir($destinationDirectory)) { + mkdir($destinationDirectory, 0755, true); + } + $destinationFileName = str_replace($file['artifact_name'], $library, $file['file_name']); + copy($file['file_path'], $destinationDirectory . '/' . $destinationFileName); + } + } + private function updateSeriesFiles( array $files, string $library, diff --git a/src/Http/Controllers/WinlibsController.php b/src/Http/Controllers/WinlibsController.php index a997f5a..2679c20 100644 --- a/src/Http/Controllers/WinlibsController.php +++ b/src/Http/Controllers/WinlibsController.php @@ -14,6 +14,7 @@ protected function validate(array $data): bool $validator = new Validator([ 'library' => 'required|string', 'ref' => 'required|string', + 'type' => 'required|string|regex:/^(php|pecl)$/', 'workflow_run_id' => 'required|string', 'php_versions' => 'required|string|regex:/^(?:\d+\.\d+|master)(?:,\s*(?:\d+\.\d+|master))*$/', 'vs_version_targets' => 'required|string|regex:/^(v[c|s]\d{2})(,v[c|s]\d{2})*$/', diff --git a/tests/Console/Command/WinlibsCommandTest.php b/tests/Console/Command/WinlibsCommandTest.php index 720e0db..c2127c9 100644 --- a/tests/Console/Command/WinlibsCommandTest.php +++ b/tests/Console/Command/WinlibsCommandTest.php @@ -15,6 +15,8 @@ class WinlibsCommandTest extends TestCase private string $winlibsDirectory; + private string $buildsDirectory; + protected function setUp(): void { parent::setUp(); @@ -42,6 +44,7 @@ public function testSuccessfulFileOperations($phpVersion, $vsVersion, $arch, $st $seriesFilePath = $this->baseDirectory . "/php-sdk/deps/series/packages-$phpVersion-$vsVersion-$arch-$stability.txt"; file_put_contents($this->winlibsDirectory . '/lib/data.json', json_encode([ + 'type' => 'php', 'library' => $library, 'ref' => $ref, 'vs_version_targets' => $vsVersion, @@ -77,6 +80,7 @@ public function testSuccessfulFileOperationsWithExistingSeriesFile($phpVersion, $seriesFilePath = $this->baseDirectory . "/php-sdk/deps/series/packages-$phpVersion-$vsVersion-$arch-$stability.txt"; file_put_contents($this->winlibsDirectory . '/lib/data.json', json_encode([ + 'type' => 'php', 'library' => $library, 'ref' => $ref, 'vs_version_targets' => $vsVersion, @@ -114,6 +118,7 @@ public function testSuccessfulFileOperationsWithExistingOldLibraryInSeriesFile($ $seriesFilePath = $this->baseDirectory . "/php-sdk/deps/series/packages-$phpVersion-$vsVersion-$arch-$stability.txt"; file_put_contents($this->winlibsDirectory . '/lib/data.json', json_encode([ + 'type' => 'php', 'library' => $library, 'ref' => $ref, 'vs_version_targets' => $vsVersion, @@ -141,6 +146,42 @@ public function testSuccessfulFileOperationsWithExistingOldLibraryInSeriesFile($ $this->assertStringNotContainsString("lib-1.0.0-$vsVersion-$arch.zip", file_get_contents($seriesFilePath), "Series file should be updated correctly."); } + public function testSuccessfulPeclFileOperations(): void + { + mkdir($this->winlibsDirectory . '/redis', 0755, true); + mkdir($this->baseDirectory . '/pecl/deps', 0755, true); + + $library = 'phpredis'; + $ref = '5.3.7'; + $vsVersion = 'vs16'; + $arch = 'x64'; + + file_put_contents($this->winlibsDirectory . '/redis/data.json', json_encode([ + 'type' => 'pecl', + 'library' => $library, + 'ref' => $ref, + 'vs_version_targets' => $vsVersion, + 'php_versions' => '8.2', + 'stability' => 'stable' + ])); + + $zipPath = $this->winlibsDirectory . "/redis/redis-$ref-$vsVersion-$arch.zip"; + $zip = new ZipArchive(); + if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { + $zip->addFromString('dummy_file.txt', 'dummy content'); + $zip->close(); + } + + $command = new WinlibsCommand(); + $command->setOption('base-directory', $this->baseDirectory); + $command->setOption('builds-directory', $this->buildsDirectory); + + $result = $command->handle(); + + $this->assertEquals(0, $result, 'Command should return success.'); + $this->assertFileExists($this->baseDirectory . "/pecl/deps/$library-$ref-$vsVersion-$arch.zip"); + } + public static function versionProvider(): array { return [

« previous php.webmaster (#33357) next »