Skip to content

Commit 2dd7e65

Browse files
author
brecht.vermeersch
committed
fix deep list contents not returning directories
1 parent 4053e23 commit 2dd7e65

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

src/AzureBlobStorageAdapter.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,17 +230,20 @@ public function listContents(string $path, bool $deep): iterable
230230
{
231231
try {
232232
$prefix = $this->prefixer->prefixDirectoryPath($path);
233+
$directories = [$prefix];
233234

234-
if ($deep) {
235-
foreach ($this->containerClient->getBlobs($prefix) as $item) {
236-
yield $this->normalizeBlob($this->prefixer->stripPrefix($item->name), $item->properties);
237-
}
238-
} else {
239-
foreach ($this->containerClient->getBlobsByHierarchy($prefix) as $item) {
235+
while (!empty($directories)) {
236+
$currentPrefix = array_shift($directories);
237+
238+
foreach ($this->containerClient->getBlobsByHierarchy($currentPrefix) as $item) {
240239
if ($item instanceof Blob) {
241240
yield $this->normalizeBlob($this->prefixer->stripPrefix($item->name), $item->properties);
242241
} else {
243242
yield new DirectoryAttributes($this->prefixer->stripPrefix($item->name));
243+
244+
if ($deep) {
245+
$directories[] = $item->name;
246+
}
244247
}
245248
}
246249
}

tests/AzureBlobStorageTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,28 @@ public function setting_visibility_causes_errors(): void
190190

191191
$adapter->setVisibility('some-file.md', 'public');
192192
}
193+
194+
#[Test]
195+
public function listing_contents_deep(): void
196+
{
197+
$this->runScenario(function () {
198+
$adapter = $this->adapter();
199+
200+
$adapter->write('dir1/file1.txt', 'content1', new Config());
201+
$adapter->write('dir1/dir2/file2.txt', 'content2', new Config());
202+
$adapter->write('dir1/dir2/dir3/file3.txt', 'content3', new Config());
203+
204+
$contents = iterator_to_array($adapter->listContents('', true));
205+
206+
$this->assertCount(6, $contents); // 3 files + 3 directories
207+
208+
$paths = array_map(fn($item) => $item->path(), $contents);
209+
$this->assertContains('dir1', $paths);
210+
$this->assertContains('dir1/file1.txt', $paths);
211+
$this->assertContains('dir1/dir2', $paths);
212+
$this->assertContains('dir1/dir2/file2.txt', $paths);
213+
$this->assertContains('dir1/dir2/dir3', $paths);
214+
$this->assertContains('dir1/dir2/dir3/file3.txt', $paths);
215+
});
216+
}
193217
}

0 commit comments

Comments
 (0)