diff --git a/src/Symfony/Component/Finder/Finder.php b/src/Symfony/Component/Finder/Finder.php index 011f661aabb32..4cf723bf33f53 100644 --- a/src/Symfony/Component/Finder/Finder.php +++ b/src/Symfony/Component/Finder/Finder.php @@ -624,7 +624,13 @@ public function getIterator() } if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { - return $this->searchInDirectory($this->dirs[0]); + $iterator = $this->searchInDirectory($this->dirs[0]); + + if ($this->sort || $this->reverseSorting) { + $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); + } + + return $iterator; } $iterator = new \AppendIterator(); @@ -636,6 +642,10 @@ public function getIterator() $iterator->append($it); } + if ($this->sort || $this->reverseSorting) { + $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); + } + return $iterator; } @@ -782,11 +792,6 @@ private function searchInDirectory(string $dir): \Iterator $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths); } - if ($this->sort || $this->reverseSorting) { - $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting); - $iterator = $iteratorAggregate->getIterator(); - } - return $iterator; } diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index 9a12e85e2573a..efdb4c744770c 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -832,6 +832,39 @@ public function testSort() ]), $finder->in(self::$tmpDir)->getIterator()); } + public function testSortAcrossDirectories() + { + $finder = $this->buildFinder() + ->in([ + self::$tmpDir, + self::$tmpDir.'/qux', + self::$tmpDir.'/foo', + ]) + ->depth(0) + ->files() + ->filter(static function (\SplFileInfo $file): bool { + return '' !== $file->getExtension(); + }) + ->sort(static function (\SplFileInfo $a, \SplFileInfo $b): int { + return strcmp($a->getExtension(), $b->getExtension()) ?: strcmp($a->getFilename(), $b->getFilename()); + }) + ; + + $this->assertOrderedIterator($this->toAbsolute([ + 'qux_0_1.php', + 'qux_1000_1.php', + 'qux_1002_0.php', + 'qux_10_2.php', + 'qux_12_0.php', + 'qux_2_0.php', + 'test.php', + 'qux/baz_100_1.py', + 'qux/baz_1_2.py', + 'test.py', + 'foo/bar.tmp', + ]), $finder->getIterator()); + } + public function testFilter() { $finder = $this->buildFinder(); diff --git a/src/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php b/src/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php index c7dfd79e30f2a..9bfc479de5bf7 100644 --- a/src/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php +++ b/src/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php @@ -31,7 +31,8 @@ protected function assertIterator($expected, \Traversable $iterator) protected function assertOrderedIterator($expected, \Traversable $iterator) { - $values = array_map(function (\SplFileInfo $fileinfo) { return $fileinfo->getPathname(); }, iterator_to_array($iterator)); + $values = array_map(function (\SplFileInfo $fileinfo) { return str_replace('/', \DIRECTORY_SEPARATOR, $fileinfo->getPathname()); }, iterator_to_array($iterator)); + $expected = array_map(function ($path) { return str_replace('/', \DIRECTORY_SEPARATOR, $path); }, $expected); $this->assertEquals($expected, array_values($values)); }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: