8000 [Finder] Handle filtering of recursive iterators and use it to skip l… · symfony/symfony@8ee45b2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8ee45b2

Browse files
[Finder] Handle filtering of recursive iterators and use it to skip looping over excluded directories
1 parent 7d343e6 commit 8ee45b2

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

src/Symfony/Component/Finder/Adapter/PhpAdapter.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ public function searchInDirectory($dir)
3131
$flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
3232
}
3333

34-
$iterator = new \RecursiveIteratorIterator(
35-
new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs),
36-
\RecursiveIteratorIterator::SELF_FIRST
37-
);
34+
$iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
35+
36+
if ($this->exclude) {
37+
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
38+
}
39+
40+
$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
3841

3942
if ($this->minDepth > 0 || $this->maxDepth < PHP_INT_MAX) {
4043
$iterator = new Iterator\DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
@@ -44,10 +47,6 @@ public function searchInDirectory($dir)
4447
$iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
4548
}
4649

47-
if ($this->exclude) {
48-
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
49-
}
50-
5150
if ($this->names || $this->notNames) {
5251
$iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
5352
}

src/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
class ExcludeDirectoryFilterIterator extends FilterIterator
2020
{
2121
private $patterns = array();
22+
private $isRecursive;
2223

2324
/**
2425
* Constructor.
@@ -29,8 +30,9 @@ class ExcludeDirectoryFilterIterator extends FilterIterator
2930
public function __construct(\Iterator $iterator, array $directories)
3031
{
3132
foreach ($directories as $directory) {
32-
$this->patterns[] = '#(^|/)'.preg_quote($directory, '#').'(/|$)#';
33+
$this->patterns[$directory] = '#(^|/)'.preg_quote($directory, '#').'(/|$)#';
3334
}
35+
$this->isRecursive = $iterator instanceof \RecursiveIterator;
3436

3537
parent::__construct($iterator);
3638
}
@@ -42,7 +44,20 @@ public function __construct(\Iterator $iterator, array $directories)
4244
*/
4345
public function accept()
4446
{
45-
$path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath();
47+
$path = $this->current();
48+
49+
if ($path->isDir()) {
50+
if (isset($this->patterns[$path->getFilename()])) {
51+
return false;
52+
}
53+
$path = $path->getRelativePathname();
54+
} else {
55+
$path = $path->getRelativePath();
56+
}
57+
if ($this->isRecursive) {
58+
return true;
59+
}
60+
4661
$path = str_replace('\\', '/', $path);
4762
foreach ($this->patterns as $pattern) {
4863
if (preg_match($pattern, $path)) {

src/Symfony/Component/Finder/Iterator/FilterIterator.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,18 @@
1818
*
1919
* @author Alex Bogomazov
2020
*/
21-
abstract class FilterIterator extends \FilterIterator
21+
abstract class FilterIterator extends \FilterIterator implements \RecursiveIterator
2222
{
23+
public function hasChildren()
24+
{
25+
return $this->getInnerIterator() instanceof \RecursiveIterator && $this->getInnerIterator()->hasChildren();
26+
}
27+
28+
public function getChildren()
29+
{
30+
return $this->getInnerIterator()->getChildren();
31+
}
32+
2333
/**
2434
* This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
2535
* rewind in some cases.

0 commit comments

Comments
 (0)
0