[web-downloads] main: Remove empty legacy Winlibs deletion queue

From: Date: Fri, 02 Oct 2026 16:36:45 +0000
Subject: [web-downloads] main: Remove empty legacy Winlibs deletion queue
Groups: php.webmaster 
Request: Send a blank email to php-webmaster+get-34067@lists.php.net to get a copy of this message
Author: Shivam Mathur (shivammathur)
Date: 2026-10-02T22:06:40+05:30

Commit: https://github.com/php/web-downloads/commit/078372c2dc8fdad03f1e4ffce01474b1d01535b1
Raw diff: https://github.com/php/web-downloads/commit/078372c2dc8fdad03f1e4ffce01474b1d01535b1.diff

Remove empty legacy Winlibs deletion queue

Changed paths:
  M  API.md
  M  src/Http/Controllers/DeletePendingJobController.php
  M  tests/Http/Controllers/DeletePendingJobControllerTest.php


Diff:

diff --git a/API.md b/API.md
index d3577cb..6f35452 100644
--- a/API.md
+++ b/API.md
@@ -91,6 +91,8 @@ To remove a legacy Winlibs deletion request, pass the filename from `GET /api/li
 {"type":"winlibs-delete","job":"winlibs-delete-7coij6somubocMYxf6G.json"}
 ```
 
+The winlibs-delete/ directory is removed when its last job is deleted.
+
 ---
 
 ### POST /api/php
diff --git a/src/Http/Controllers/DeletePendingJobController.php
b/src/Http/Controllers/DeletePendingJobController.php
index b275fef..69ff67c 100644
--- a/src/Http/Controllers/DeletePendingJobController.php
+++ b/src/Http/Controllers/DeletePendingJobController.php
@@ -77,6 +77,18 @@ private function deleteJob(string $type, string $jobName): void
             $this->deleteDirectoryJob($path);
         } else {
             $this->deleteFileJob($path);
+
+            if ($type === 'winlibs-delete') {
+                $directory = dirname($path);
+                $entries = @scandir($directory);
+                if ($entries === false) {
+                    throw new RuntimeException('Unable to inspect Winlibs deletion
directory.', 500);
+                }
+
+                if ($entries === ['.', '..'] && !@rmdir($directory)) {
+                    throw new RuntimeException('Unable to remove empty Winlibs deletion
directory.', 500);
+                }
+            }
         }
     }
 
diff --git a/tests/Http/Controllers/DeletePendingJobControllerTest.php
b/tests/Http/Controllers/DeletePendingJobControllerTest.php
index 81064b4..253dc6a 100644
--- a/tests/Http/Controllers/DeletePendingJobControllerTest.php
+++ b/tests/Http/Controllers/DeletePendingJobControllerTest.php
@@ -96,6 +96,9 @@ public function testDeletesLegacyWinlibsDeleteFileAndLockWithoutTouchingActiveQu
         $jobFile = $legacyDir . '/' . $jobName;
         file_put_contents($jobFile, '{}');
         file_put_contents($jobFile . '.lock', '');
+        $lastJobName = 'winlibs-delete-966s7gpgm2goaDpODXH.json';
+        $lastJobFile = $legacyDir . '/' . $lastJobName;
+        file_put_contents($lastJobFile, '{}');
         file_put_contents($activeDir . '/data.json', '{}');
 
         $inputFile = $this->createInputFile(json_encode([
@@ -113,6 +116,26 @@ public function
testDeletesLegacyWinlibsDeleteFileAndLockWithoutTouchingActiveQu
        
static::assertJsonStringEqualsJsonString('{"status":"deleted"}',
$output);
         static::assertFileDoesNotExist($jobFile);
         static::assertFileDoesNotExist($jobFile . '.lock');
+        static::assertDirectoryExists($legacyDir);
+        static::assertFileExists($lastJobFile);
+        static::assertFileExists($activeDir . '/data.json');
+
+        unlink($inputFile);
+
+        $inputFile = $this->createInputFile(json_encode([
+            'type' => 'winlibs-delete',
+            'job' => $lastJobName,
+        ], JSON_THROW_ON_ERROR));
+
+        http_response_code(200);
+        $controller = new DeletePendingJobController($inputFile, $this->tempDir);
+        ob_start();
+        $controller->handle();
+        $output = ob_get_clean();
+
+        static::assertSame(200, http_response_code());
+       
static::assertJsonStringEqualsJsonString('{"status":"deleted"}',
$output);
+        static::assertDirectoryDoesNotExist($legacyDir);
         static::assertFileExists($activeDir . '/data.json');
 
         unlink($inputFile);


Thread (1 message)

  • Shivam Mathur
« previous php.webmaster (#34067) next »