[web-downloads] main: Sort series files on updates

From: Date: Mon, 18 May 2026 07:37:49 +0000
Subject: [web-downloads] main: Sort series files on updates
Groups: php.webmaster 
Request: Send a blank email to php-webmaster+get-33714@lists.php.net to get a copy of this message
Author: Shivam Mathur (shivammathur) Date: 2026-05-18T13:06:42+05:30 Commit: https://github.com/php/web-downloads/commit/85fafd36f58a8c28cc9da05830e55e1054abd5c1 Raw diff: https://github.com/php/web-downloads/commit/85fafd36f58a8c28cc9da05830e55e1054abd5c1.diff Sort series files on updates Changed paths: M src/Console/Command/SeriesUpdateCommand.php M src/Console/Command/WinlibsCommand.php M tests/Console/Command/SeriesUpdateCommandTest.php M tests/Console/Command/WinlibsCommandTest.php Diff: diff --git a/src/Console/Command/SeriesUpdateCommand.php b/src/Console/Command/SeriesUpdateCommand.php index 3d4ff0a..34f5fd9 100644 --- a/src/Console/Command/SeriesUpdateCommand.php +++ b/src/Console/Command/SeriesUpdateCommand.php @@ -127,6 +127,8 @@ private function updateSeriesFiles( $lines[] = $package; } + sort($lines, SORT_STRING); + if (empty($lines)) { if (file_exists($filePath)) { unlink($filePath); @@ -161,4 +163,4 @@ private function deleteLibraryArtifacts(string $vsVersion, string $arch, string } } } -} \ No newline at end of file +} diff --git a/src/Console/Command/WinlibsCommand.php b/src/Console/Command/WinlibsCommand.php index f85b5af..75caa3f 100644 --- a/src/Console/Command/WinlibsCommand.php +++ b/src/Console/Command/WinlibsCommand.php @@ -185,6 +185,8 @@ private function updatePhpSeriesFiles( if (!$found) { $file_lines[] = $fileName; } + + sort($file_lines, SORT_STRING); file_put_contents($seriesFile, implode("\n", $file_lines)); } } diff --git a/tests/Console/Command/SeriesUpdateCommandTest.php b/tests/Console/Command/SeriesUpdateCommandTest.php index 2d1a677..8c83be4 100644 --- a/tests/Console/Command/SeriesUpdateCommandTest.php +++ b/tests/Console/Command/SeriesUpdateCommandTest.php @@ -111,13 +111,58 @@ public function testUpdatesExistingLibraryEntry(): void $x86Lines = file($filePathX86, FILE_IGNORE_NEW_LINES); $this->assertSame([ - 'zlib-1.2.13-vs16-x86.zip', 'libxml2-2.9.15-vs16-x86.zip', + 'zlib-1.2.13-vs16-x86.zip', ], $x86Lines); $this->assertEmpty(glob($this->buildsDirectory . '/series/series-update-*.json')); } + public function testAddsLibraryInSortedOrder(): void + { + $seriesDirectory = $this->baseDirectory . '/php-sdk/deps/series'; + mkdir($seriesDirectory, 0755, true); + + $filePathX64 = $seriesDirectory . '/packages-8.4-vs17-x64-staging.txt'; + $filePathX86 = $seriesDirectory . '/packages-8.4-vs17-x86-staging.txt'; + + file_put_contents($filePathX64, implode("\n", [ + 'curl-8.8.0-vs17-x64.zip', + 'openssl-3.4.1-vs17-x64.zip', + ])); + + file_put_contents($filePathX86, implode("\n", [ + 'curl-8.8.0-vs17-x86.zip', + 'openssl-3.4.1-vs17-x86.zip', + ])); + + $this->createTask([ + 'php_version' => '8.4', + 'vs_version' => 'vs17', + 'stability' => 'staging', + 'library' => 'brotli', + 'ref' => '1.1.0', + ]); + + $command = new SeriesUpdateCommand(); + $command->setOption('base-directory', $this->baseDirectory); + $command->setOption('builds-directory', $this->buildsDirectory); + + $result = $command->handle(); + + $this->assertSame(0, $result); + $this->assertSame([ + 'brotli-1.1.0-vs17-x64.zip', + 'curl-8.8.0-vs17-x64.zip', + 'openssl-3.4.1-vs17-x64.zip', + ], file($filePathX64, FILE_IGNORE_NEW_LINES)); + $this->assertSame([ + 'brotli-1.1.0-vs17-x86.zip', + 'curl-8.8.0-vs17-x86.zip', + 'openssl-3.4.1-vs17-x86.zip', + ], file($filePathX86, FILE_IGNORE_NEW_LINES)); + } + public function testRemovesLibraryWhenNoPackageProvided(): void { $seriesDirectory = $this->baseDirectory . '/php-sdk/deps/series'; @@ -272,4 +317,4 @@ private function createTask(array $data): string return $taskFile; } -} \ No newline at end of file +} diff --git a/tests/Console/Command/WinlibsCommandTest.php b/tests/Console/Command/WinlibsCommandTest.php index 03dad63..63c7076 100644 --- a/tests/Console/Command/WinlibsCommandTest.php +++ b/tests/Console/Command/WinlibsCommandTest.php @@ -433,6 +433,58 @@ public function testSeedsMissingArm64SeriesFileFromX64BeforeReplacingLibrary(): ); } + public function testSortsPhpSeriesFileAfterAddingLibrary(): void + { + mkdir($this->winlibsDirectory . '/brotli', 0755, true); + mkdir($this->baseDirectory . '/php-sdk/deps/series', 0755, true); + + $library = 'brotli'; + $ref = '1.1.0'; + $phpVersion = '8.4'; + $vsVersion = 'vs17'; + $arch = 'x64'; + $stability = 'staging'; + $seriesFilePath = $this->baseDirectory . "/php-sdk/deps/series/packages-$phpVersion-$vsVersion-$arch-$stability.txt"; + + file_put_contents($seriesFilePath, implode("\n", [ + "curl-8.8.0-$vsVersion-$arch.zip", + "openssl-3.4.1-$vsVersion-$arch.zip", + ])); + + file_put_contents($this->winlibsDirectory . '/brotli/data.json', json_encode([ + 'type' => 'php', + 'library' => $library, + 'ref' => $ref, + 'vs_version_targets' => $vsVersion, + 'php_versions' => $phpVersion, + 'stability' => $stability, + 'update_series' => 'true', + ])); + + $zipPath = $this->winlibsDirectory . "/brotli/brotli-$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->assertSame(0, $result); + $this->assertSame( + [ + "brotli-$ref-$vsVersion-$arch.zip", + "curl-8.8.0-$vsVersion-$arch.zip", + "openssl-3.4.1-$vsVersion-$arch.zip", + ], + file($seriesFilePath, FILE_IGNORE_NEW_LINES) + ); + } + public function testCommandHandlesMissingBaseDirectory(): void { $command = new WinlibsCommand();

« previous php.webmaster (#33714) next »