diff --git a/src/Symfony/Component/Finder/Iterator/VcsIgnoredFilterIterator.php b/src/Symfony/Component/Finder/Iterator/VcsIgnoredFilterIterator.php index ddd7007728a7..b278706e9f34 100644 --- a/src/Symfony/Component/Finder/Iterator/VcsIgnoredFilterIterator.php +++ b/src/Symfony/Component/Finder/Iterator/VcsIgnoredFilterIterator.php @@ -37,9 +37,9 @@ public function __construct(\Iterator $iterator, string $baseDir) { $this->baseDir = $this->normalizePath($baseDir); - foreach ($this->parentDirectoriesUpwards($this->baseDir) as $parentDirectory) { - if (@is_dir("{$parentDirectory}/.git")) { - $this->baseDir = $parentDirectory; + foreach ([$this->baseDir, ...$this->parentDirectoriesUpwards($this->baseDir)] as $directory) { + if (@is_dir("{$directory}/.git")) { + $this->baseDir = $directory; break; } } diff --git a/src/Symfony/Component/Finder/Tests/Iterator/VcsIgnoredFilterIteratorTest.php b/src/Symfony/Component/Finder/Tests/Iterator/VcsIgnoredFilterIteratorTest.php index 3ebe481f559c..f725374d815e 100644 --- a/src/Symfony/Component/Finder/Tests/Iterator/VcsIgnoredFilterIteratorTest.php +++ b/src/Symfony/Component/Finder/Tests/Iterator/VcsIgnoredFilterIteratorTest.php @@ -34,7 +34,7 @@ protected function tearDown(): void * * @dataProvider getAcceptData */ - public function testAccept(array $gitIgnoreFiles, array $otherFileNames, array $expectedResult) + public function testAccept(array $gitIgnoreFiles, array $otherFileNames, array $expectedResult, string $baseDir = '') { $otherFileNames = $this->toAbsolute($otherFileNames); foreach ($otherFileNames as $path) { @@ -51,7 +51,8 @@ public function testAccept(array $gitIgnoreFiles, array $otherFileNames, array $ $inner = new InnerNameIterator($otherFileNames); - $iterator = new VcsIgnoredFilterIterator($inner, $this->tmpDir); + $baseDir = $this->tmpDir.('' !== $baseDir ? '/'.$baseDir : ''); + $iterator = new VcsIgnoredFilterIterator($inner, $baseDir); $this->assertIterator($this->toAbsolute($expectedResult), $iterator); } @@ -74,6 +75,55 @@ public static function getAcceptData(): iterable ], ]; + yield 'simple file - .gitignore and in() from repository root' => [ + [ + '.gitignore' => 'a.txt', + ], + [ + '.git', + 'a.txt', + 'b.txt', + 'dir/', + 'dir/a.txt', + ], + [ + '.git', + 'b.txt', + 'dir', + ], + ]; + + yield 'nested git repositories only consider .gitignore files of the most inner repository' => [ + [ + '.gitignore' => "nested/*\na.txt", + 'nested/.gitignore' => 'c.txt', + 'nested/dir/.gitignore' => 'f.txt', + ], + [ + '.git', + 'a.txt', + 'b.txt', + 'nested/', + 'nested/.git', + 'nested/c.txt', + 'nested/d.txt', + 'nested/dir/', + 'nested/dir/e.txt', + 'nested/dir/f.txt', + ], + [ + '.git', + 'a.txt', + 'b.txt', + 'nested', + 'nested/.git', + 'nested/d.txt', + 'nested/dir', + 'nested/dir/e.txt', + ], + 'nested', + ]; + yield 'simple file at root' => [ [ '.gitignore' => '/a.txt',