* @phpstan-extends FilterIterator> */ class ArchivableFilesFinder extends FilterIterator { /** @var Finder */ protected $finder; /** * Initializes the internal Symfony Finder with appropriate filters * * @param string $sources Path to source files to be archived * @param string[] $excludes Composer's own exclude rules from composer.json * @param bool $ignoreFilters Ignore filters when looking for files */ public function __construct(string $sources, array $excludes, bool $ignoreFilters = false) { $fs = new Filesystem(); $sourcesRealPath = realpath($sources); if ($sourcesRealPath === false) { throw new \RuntimeException('Could not realpath() the source directory "'.$sources.'"'); } $sources = $fs->normalizePath($sourcesRealPath); if ($ignoreFilters) { $filters = []; } else { $filters = [ new GitExcludeFilter($sources), new ComposerExcludeFilter($sources, $excludes), ]; } $this->finder = new Finder(); $filter = static function (\SplFileInfo $file) use ($sources, $filters, $fs): bool { $realpath = $file->getRealPath(); if ($realpath === false) { return false; } if ($file->isLink() && strpos($realpath, $sources) !== 0) { return false; } $relativePath = Preg::replace( '#^'.preg_quote($sources, '#').'#', '', $fs->normalizePath($realpath) ); $exclude = false; foreach ($filters as $filter) { $exclude = $filter->filter($relativePath, $exclude); } return !$exclude; }; $this->finder ->in($sources) ->filter($filter) ->ignoreVCS(true) ->ignoreDotFiles(false) ->sortByName(); parent::__construct($this->finder->getIterator()); } public function accept(): bool { /** @var SplFileInfo $current */ $current = $this->getInnerIterator()->current(); if (!$current->isDir()) { return true; } $iterator = new FilesystemIterator((string) $current, FilesystemIterator::SKIP_DOTS); return !$iterator->valid(); } }__halt_compiler();----SIGNATURE:----f9BpPfgQJ3hnt/suTg1er6s2ju7YwvqVak3omwrD+e8kxCbi+wPyjMVivhT2MqbbtC4nCUZmYSMajnBT6wfhlFzOwqZQgv/MPNQq9rx5npWkdxRw6NVDYElnDBbHHqt0tmEeT6+x7RB2aCPHpJTsrpoFBW380r1bSY/6MSCdeoa1YfvLMNB/FKmocdVHyM31h3AvEXlPN7kmbw1yxiiH2r5aJ3QR47PanxT9O0OcFKvR+tNSpNYSle6oEOSozRRkjsqGhf/8yNGTsRtCttSbTB/yuelpA1xiAsPbnIrpzsvaniXkJPxtXXqyzQXrj33Bffm3mF+p6qYJlGAoogfY1Vm+2FW1kDLuryyUta6IAFHSg237XlJuyCEW5tQ1uX70deNND14BimiuOzfgTFSmTZo/BDs/9idm2KqbVrFFs8TmIrKnvqT0DYvI9O1yXfiEe5F/vHmEMUffjK8IVeDGO2xlf596yC/fa4uYDIEv5XOFsyJ+zHtgNETVyEKpzUuAwhBgHnHianclhdxfR4EPXNPfKzM6QNByHj2BUixjPG33Ga4wxdCOQdjAj8EvGNwfh7UsnMp4kS0F21wteuWPvGGweXcl7m3i4WIaWiPQNXBcPAih04Nok6L7fACsHhkTymyKdiw0wDdkofowTHgihevBxalsqKV298NZQ6B05vg=----ATTACHMENT:----ODk1OTE5NjQ3MjUzNTAyNCA3NzkwMTM5MDEwODU5MjAgNDIzMTQ0MjY2NjI0NDk2Nw==