From 126105146f91315c4e5d11169b2e8fbb055e3bc8 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 4 Jan 2021 11:12:41 +0100 Subject: [PATCH] apply the sort callback on the whole search result --- src/Symfony/Component/Finder/Finder.php | 17 ++++++---- .../Component/Finder/Tests/FinderTest.php | 33 +++++++++++++++++++ .../Tests/Iterator/IteratorTestCase.php | 3 +- 3 files changed, 46 insertions(+), 7 deletions(-) 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)); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy