class ArchivableFilesFinder
A Symfony Finder wrapper which locates files that should go into archives
Handles .gitignore, .gitattributes and .hgignore files as well as composer's own exclude rules from composer.json
@author Nils Adermann <naderman@naderman.de> @phpstan-extends FilterIterator<string, SplFileInfo, Iterator<string, SplFileInfo>>
Hierarchy
- class \Composer\Package\Archiver\ArchivableFilesFinder extends \FilterIterator
Expanded class hierarchy of ArchivableFilesFinder
1 file declares its use of ArchivableFilesFinder
- PathDownloader.php in vendor/
composer/ composer/ src/ Composer/ Downloader/ PathDownloader.php
File
-
vendor/
composer/ composer/ src/ Composer/ Package/ Archiver/ ArchivableFilesFinder.php, line 32
Namespace
Composer\Package\ArchiverView source
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();
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
ArchivableFilesFinder::$finder | protected | property | |
ArchivableFilesFinder::accept | public | function | |
ArchivableFilesFinder::__construct | public | function | Initializes the internal Symfony Finder with appropriate filters |