Avoid mutating the Finder when building the iterator
This commit is contained in:
parent
df0fc5ee72
commit
94989fe794
@ -645,12 +645,15 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
*/
|
*/
|
||||||
private function searchInDirectory($dir)
|
private function searchInDirectory($dir)
|
||||||
{
|
{
|
||||||
|
$exclude = $this->exclude;
|
||||||
|
$notPaths = $this->notPaths;
|
||||||
|
|
||||||
if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
|
if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
|
||||||
$this->exclude = array_merge($this->exclude, self::$vcsPatterns);
|
$exclude = array_merge($exclude, self::$vcsPatterns);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
|
if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
|
||||||
$this->notPaths[] = '#(^|/)\..+(/|$)#';
|
$notPaths[] = '#(^|/)\..+(/|$)#';
|
||||||
}
|
}
|
||||||
|
|
||||||
$minDepth = 0;
|
$minDepth = 0;
|
||||||
@ -683,8 +686,8 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
|
|
||||||
$iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
|
$iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
|
||||||
|
|
||||||
if ($this->exclude) {
|
if ($exclude) {
|
||||||
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
|
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude);
|
||||||
}
|
}
|
||||||
|
|
||||||
$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
|
$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
|
||||||
@ -717,8 +720,8 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->paths || $this->notPaths) {
|
if ($this->paths || $notPaths) {
|
||||||
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
|
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->sort) {
|
if ($this->sort) {
|
||||||
|
@ -199,6 +199,18 @@ class FinderTest extends Iterator\RealIteratorTestCase
|
|||||||
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar']), $finder->in(self::$tmpDir)->getIterator());
|
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar']), $finder->in(self::$tmpDir)->getIterator());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testIgnoreVCSCanBeDisabledAfterFirstIteration()
|
||||||
|
{
|
||||||
|
$finder = $this->buildFinder();
|
||||||
|
$finder->in(self::$tmpDir);
|
||||||
|
$finder->ignoreDotFiles(false);
|
||||||
|
|
||||||
|
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar']), $finder->getIterator());
|
||||||
|
|
||||||
|
$finder->ignoreVCS(false);
|
||||||
|
$this->assertIterator($this->toAbsolute(['.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar']), $finder->getIterator());
|
||||||
|
}
|
||||||
|
|
||||||
public function testIgnoreDotFiles()
|
public function testIgnoreDotFiles()
|
||||||
{
|
{
|
||||||
$finder = $this->buildFinder();
|
$finder = $this->buildFinder();
|
||||||
@ -214,6 +226,17 @@ class FinderTest extends Iterator\RealIteratorTestCase
|
|||||||
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar']), $finder->in(self::$tmpDir)->getIterator());
|
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar']), $finder->in(self::$tmpDir)->getIterator());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testIgnoreDotFilesCanBeDisabledAfterFirstIteration()
|
||||||
|
{
|
||||||
|
$finder = $this->buildFinder();
|
||||||
|
$finder->in(self::$tmpDir);
|
||||||
|
|
||||||
|
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar']), $finder->getIterator());
|
||||||
|
|
||||||
|
$finder->ignoreDotFiles(false);
|
||||||
|
$this->assertIterator($this->toAbsolute(['foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar']), $finder->getIterator());
|
||||||
|
}
|
||||||
|
|
||||||
public function testSortByName()
|
public function testSortByName()
|
||||||
{
|
{
|
||||||
$finder = $this->buildFinder();
|
$finder = $this->buildFinder();
|
||||||
|
Reference in New Issue
Block a user