[web-downloads] main: Remove empty legacy Winlibs deletion queue
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