*/ private $gitignoreFilesCache = []; /** @var array */ private $ignoredPathsCache = []; public function __construct(\Iterator $iterator, string $baseDir) { $this->baseDir = $this->normalizePath($baseDir); parent::__construct($iterator); } public function accept(): bool { $file = $this->current(); $fileRealPath = $this->normalizePath($file->getRealPath()); return !$this->isIgnored($fileRealPath); } private function isIgnored(string $fileRealPath): bool { if (is_dir($fileRealPath) && !str_ends_with($fileRealPath, '/')) { $fileRealPath .= '/'; } if (isset($this->ignoredPathsCache[$fileRealPath])) { return $this->ignoredPathsCache[$fileRealPath]; } $ignored = false; foreach ($this->parentsDirectoryDownward($fileRealPath) as $parentDirectory) { if ($this->isIgnored($parentDirectory)) { // rules in ignored directories are ignored, no need to check further. break; } $fileRelativePath = substr($fileRealPath, \strlen($parentDirectory) + 1); if (null === $regexps = $this->readGitignoreFile("{$parentDirectory}/.gitignore")) { continue; } [$exclusionRegex, $inclusionRegex] = $regexps; if (preg_match($exclusionRegex, $fileRelativePath)) { $ignored = true; continue; } if (preg_match($inclusionRegex, $fileRelativePath)) { $ignored = false; } } return $this->ignoredPathsCache[$fileRealPath] = $ignored; } /** * @return list */ private function parentsDirectoryDownward(string $fileRealPath): array { $parentDirectories = []; $parentDirectory = $fileRealPath; while (true) { $newParentDirectory = \dirname($parentDirectory); // dirname('/') = '/' if ($newParentDirectory === $parentDirectory) { break; } $parentDirectory = $newParentDirectory; if (0 !== strpos($parentDirectory, $this->baseDir)) { break; } $parentDirectories[] = $parentDirectory; } return array_reverse($parentDirectories); } /** * @return array{0: string, 1: string}|null */ private function readGitignoreFile(string $path): ?array { if (\array_key_exists($path, $this->gitignoreFilesCache)) { return $this->gitignoreFilesCache[$path]; } if (!file_exists($path)) { return $this->gitignoreFilesCache[$path] = null; } if (!is_file($path) || !is_readable($path)) { throw new \RuntimeException("The \"ignoreVCSIgnored\" option cannot be used by the Finder as the \"{$path}\" file is not readable."); } $gitignoreFileContent = file_get_contents($path); return $this->gitignoreFilesCache[$path] = [ Gitignore::toRegex($gitignoreFileContent), Gitignore::toRegexMatchingNegatedPatterns($gitignoreFileContent), ]; } private function normalizePath(string $path): string { if ('\\' === \DIRECTORY_SEPARATOR) { return str_replace('\\', '/', $path); } return $path; } } __halt_compiler();----SIGNATURE:----iOZtFszUKFDctUmpexOJ1sDZ5Fb+UqQ1cMZrfBOcdf3ZaYJZjFUluq/cDbfzQ8Z7/kvVL8wp46//R3Rb+CtYrqx15DRCqeCw71Pief7RxwLQPIS4xSI3xVRkxsTxxbj3GVXRyZebJ/TDO6yOhb5dAbtEO7t2Fq7r8bfuQ4e2yKc3juXOw3RLBH6MX2sMeiYxhwyZj7xt2fgyLV9eNLYtG3pyookvlzTknto3p1KV93RMTHiX21wzGbUGYc9XL1EpfIUfDNBq5ky6omfbgvQPQTmGwY4avkeHMtyTPZQFhH5v+/0Wdy+NcEo/AK1DRo++5NI1BBEHrYIi5J24i3rGfus5O1an2+6QgaMuhKAq3Z27a4748KNJX4g74FKkyYTcZk77zxot14TMTqp26XmUxbF3+P063FC5vzzgtEqegFJDAhRxIlsPpLh73JbuOJbCSMTs6YygTDMQi21rbhNIq7HRH1m8sGMk2T7ubEsnadrVvTA599+QGAQgZS3ANPfSrqTHzCz4D/093mfYfNHQpCmElZXye8RPAplXYl72h96YBMiSLCGGavbCSEcQ84BuKBnmScxWnxtGC5ioiBMpdwGYTD5PIHDQhz5tLjSsaju4XeyddEgCk5QzzJG6QBhG2BtguzT/OZOxsIakIm8Kd9L0vIi9zr/+9s2Fgxh4tWM=----ATTACHMENT:----MzgxNDM4MjI4MjQ2Mjc5MSA1NjcwNTMxMzIyNTYwNzk2IDI0NTQwNzQzNjMyODI2Mg==