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();

Reply via email to