diff --git a/src/Analyser/Analyser.php b/src/Analyser/Analyser.php index 45499ef8..7a861dcb 100644 --- a/src/Analyser/Analyser.php +++ b/src/Analyser/Analyser.php @@ -611,26 +611,20 @@ private function phpFiles(string $path, array $skipPaths): array new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), function (SplFileInfo $file) use ($skipPaths): bool { - if (! $file->isDir() && $file->getExtension() !== 'php') { + $isRealDirectory = $file->isDir() && ! $file->isLink(); + if (! $isRealDirectory && $file->getExtension() !== 'php') { return false; } return ! $this->isSkipped($file->getPathname(), $skipPaths); } - ) + ), + RecursiveIteratorIterator::LEAVES_ONLY ); /** @var SplFileInfo $file */ foreach ($iterator as $file) { - if (! $file->isFile()) { - continue; - } - - $realPath = $file->getRealPath(); - - if ($realPath !== false) { - $files[] = $realPath; - } + $files[] = $file->getPathname(); } return $files; diff --git a/src/Rule/Rules/File/PhpFileFinder.php b/src/Rule/Rules/File/PhpFileFinder.php index 73aa6396..e5f2410c 100644 --- a/src/Rule/Rules/File/PhpFileFinder.php +++ b/src/Rule/Rules/File/PhpFileFinder.php @@ -4,6 +4,7 @@ namespace Boundwize\StructArmed\Rule\Rules\File; +use AppendIterator; use Boundwize\StructArmed\Composer\Psr4PathResolver; use FilesystemIterator; use RecursiveCallbackFilterIterator; @@ -11,6 +12,8 @@ use RecursiveIteratorIterator; use SplFileInfo; +use function array_unique; +use function array_values; use function fnmatch; use function is_dir; use function ltrim; @@ -38,41 +41,44 @@ public function __construct( */ public function files(string $basePath, array $skipPaths = []): array { - $files = []; $normalisedBase = $this->normalisePath($basePath, true); $skipMatchers = $this->compileSkipMatchers($normalisedBase, $skipPaths); + $append = new AppendIterator(); - foreach ($this->sourcePaths ?? $this->psr4PathResolver->paths($basePath) as $sourcePath) { + $sourcePaths = array_unique($this->sourcePaths ?? $this->psr4PathResolver->paths($basePath)); + foreach ($sourcePaths as $sourcePath) { $fullPath = rtrim($basePath, '/') . '/' . ltrim($sourcePath, '/'); if (! is_dir($fullPath)) { continue; } - $iterator = new RecursiveIteratorIterator( + $append->append(new RecursiveIteratorIterator( new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS), function (SplFileInfo $file) use ($normalisedBase, $skipMatchers): bool { - if (! $file->isDir() && $file->getExtension() !== 'php') { + $isRealDirectory = $file->isDir() && ! $file->isLink(); + if (! $isRealDirectory && $file->getExtension() !== 'php') { return false; } return ! $this->isSkipped($file->getPathname(), $normalisedBase, $skipMatchers); } - ) - ); + ), + RecursiveIteratorIterator::LEAVES_ONLY + )); + } - /** @var SplFileInfo $file */ - foreach ($iterator as $file) { - if (! $file->isFile()) { - continue; - } + $files = []; - $files[] = $file->getPathname(); - } + /** @var SplFileInfo $file */ + foreach ($append as $file) { + $files[] = $file->getPathname(); } - return $files; + // ensure nothing duplicated once more + // avoid inner directory provided by multiple source paths + return array_values(array_unique($files)); } /**