package and depencies
This commit is contained in:
11
vendor/symfony/finder/CHANGELOG.md
vendored
11
vendor/symfony/finder/CHANGELOG.md
vendored
@@ -1,6 +1,17 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
6.2
|
||||
---
|
||||
|
||||
* Add `Finder::sortByExtension()` and `Finder::sortBySize()`
|
||||
* Add `Finder::sortByCaseInsensitiveName()` to sort by name with case insensitive sorting methods
|
||||
|
||||
6.0
|
||||
---
|
||||
|
||||
* Remove `Comparator::setTarget()` and `Comparator::setOperator()`
|
||||
|
||||
5.4.0
|
||||
-----
|
||||
|
||||
|
125
vendor/symfony/finder/Comparator/Comparator.php
vendored
125
vendor/symfony/finder/Comparator/Comparator.php
vendored
@@ -16,102 +16,47 @@ namespace Symfony\Component\Finder\Comparator;
|
||||
*/
|
||||
class Comparator
|
||||
{
|
||||
private $target;
|
||||
private $operator = '==';
|
||||
private string $target;
|
||||
private string $operator;
|
||||
|
||||
public function __construct(string $target = null, string $operator = '==')
|
||||
{
|
||||
if (null === $target) {
|
||||
trigger_deprecation('symfony/finder', '5.4', 'Constructing a "%s" without setting "$target" is deprecated.', __CLASS__);
|
||||
}
|
||||
|
||||
$this->target = $target;
|
||||
$this->doSetOperator($operator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the target value.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTarget()
|
||||
{
|
||||
if (null === $this->target) {
|
||||
trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__);
|
||||
}
|
||||
|
||||
return $this->target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated set the target via the constructor instead
|
||||
*/
|
||||
public function setTarget(string $target)
|
||||
{
|
||||
trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the target via the constructor instead.', __METHOD__);
|
||||
|
||||
$this->target = $target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the comparison operator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getOperator()
|
||||
{
|
||||
return $this->operator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the comparison operator.
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @deprecated set the operator via the constructor instead
|
||||
*/
|
||||
public function setOperator(string $operator)
|
||||
{
|
||||
trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the operator via the constructor instead.', __METHOD__);
|
||||
|
||||
$this->doSetOperator('' === $operator ? '==' : $operator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests against the target.
|
||||
*
|
||||
* @param mixed $test A test value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function test($test)
|
||||
{
|
||||
if (null === $this->target) {
|
||||
trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__);
|
||||
}
|
||||
|
||||
switch ($this->operator) {
|
||||
case '>':
|
||||
return $test > $this->target;
|
||||
case '>=':
|
||||
return $test >= $this->target;
|
||||
case '<':
|
||||
return $test < $this->target;
|
||||
case '<=':
|
||||
return $test <= $this->target;
|
||||
case '!=':
|
||||
return $test != $this->target;
|
||||
}
|
||||
|
||||
return $test == $this->target;
|
||||
}
|
||||
|
||||
private function doSetOperator(string $operator): void
|
||||
public function __construct(string $target, string $operator = '==')
|
||||
{
|
||||
if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) {
|
||||
throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
|
||||
}
|
||||
|
||||
$this->target = $target;
|
||||
$this->operator = $operator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the target value.
|
||||
*/
|
||||
public function getTarget(): string
|
||||
{
|
||||
return $this->target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the comparison operator.
|
||||
*/
|
||||
public function getOperator(): string
|
||||
{
|
||||
return $this->operator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests against the target.
|
||||
*/
|
||||
public function test(mixed $test): bool
|
||||
{
|
||||
return match ($this->operator) {
|
||||
'>' => $test > $this->target,
|
||||
'>=' => $test >= $this->target,
|
||||
'<' => $test < $this->target,
|
||||
'<=' => $test <= $this->target,
|
||||
'!=' => $test != $this->target,
|
||||
default => $test == $this->target,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -30,9 +30,9 @@ class DateComparator extends Comparator
|
||||
}
|
||||
|
||||
try {
|
||||
$date = new \DateTime($matches[2]);
|
||||
$date = new \DateTimeImmutable($matches[2]);
|
||||
$target = $date->format('U');
|
||||
} catch (\Exception $e) {
|
||||
} catch (\Exception) {
|
||||
throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2]));
|
||||
}
|
||||
|
||||
|
162
vendor/symfony/finder/Finder.php
vendored
162
vendor/symfony/finder/Finder.php
vendored
@@ -45,27 +45,27 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
public const IGNORE_DOT_FILES = 2;
|
||||
public const IGNORE_VCS_IGNORED_FILES = 4;
|
||||
|
||||
private $mode = 0;
|
||||
private $names = [];
|
||||
private $notNames = [];
|
||||
private $exclude = [];
|
||||
private $filters = [];
|
||||
private $depths = [];
|
||||
private $sizes = [];
|
||||
private $followLinks = false;
|
||||
private $reverseSorting = false;
|
||||
private $sort = false;
|
||||
private $ignore = 0;
|
||||
private $dirs = [];
|
||||
private $dates = [];
|
||||
private $iterators = [];
|
||||
private $contains = [];
|
||||
private $notContains = [];
|
||||
private $paths = [];
|
||||
private $notPaths = [];
|
||||
private $ignoreUnreadableDirs = false;
|
||||
private int $mode = 0;
|
||||
private array $names = [];
|
||||
private array $notNames = [];
|
||||
private array $exclude = [];
|
||||
private array $filters = [];
|
||||
private array $depths = [];
|
||||
private array $sizes = [];
|
||||
private bool $followLinks = false;
|
||||
private bool $reverseSorting = false;
|
||||
private \Closure|int|false $sort = false;
|
||||
private int $ignore = 0;
|
||||
private array $dirs = [];
|
||||
private array $dates = [];
|
||||
private array $iterators = [];
|
||||
private array $contains = [];
|
||||
private array $notContains = [];
|
||||
private array $paths = [];
|
||||
private array $notPaths = [];
|
||||
private bool $ignoreUnreadableDirs = false;
|
||||
|
||||
private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];
|
||||
private static array $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
@@ -74,10 +74,8 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
|
||||
/**
|
||||
* Creates a new Finder.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public static function create()
|
||||
public static function create(): static
|
||||
{
|
||||
return new static();
|
||||
}
|
||||
@@ -87,7 +85,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function directories()
|
||||
public function directories(): static
|
||||
{
|
||||
$this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;
|
||||
|
||||
@@ -99,7 +97,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function files()
|
||||
public function files(): static
|
||||
{
|
||||
$this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;
|
||||
|
||||
@@ -122,7 +120,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
* @see DepthRangeFilterIterator
|
||||
* @see NumberComparator
|
||||
*/
|
||||
public function depth($levels)
|
||||
public function depth(string|int|array $levels): static
|
||||
{
|
||||
foreach ((array) $levels as $level) {
|
||||
$this->depths[] = new Comparator\NumberComparator($level);
|
||||
@@ -150,7 +148,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
* @see DateRangeFilterIterator
|
||||
* @see DateComparator
|
||||
*/
|
||||
public function date($dates)
|
||||
public function date(string|array $dates): static
|
||||
{
|
||||
foreach ((array) $dates as $date) {
|
||||
$this->dates[] = new Comparator\DateComparator($date);
|
||||
@@ -175,7 +173,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilenameFilterIterator
|
||||
*/
|
||||
public function name($patterns)
|
||||
public function name(string|array $patterns): static
|
||||
{
|
||||
$this->names = array_merge($this->names, (array) $patterns);
|
||||
|
||||
@@ -191,7 +189,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilenameFilterIterator
|
||||
*/
|
||||
public function notName($patterns)
|
||||
public function notName(string|array $patterns): static
|
||||
{
|
||||
$this->notNames = array_merge($this->notNames, (array) $patterns);
|
||||
|
||||
@@ -213,7 +211,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilecontentFilterIterator
|
||||
*/
|
||||
public function contains($patterns)
|
||||
public function contains(string|array $patterns): static
|
||||
{
|
||||
$this->contains = array_merge($this->contains, (array) $patterns);
|
||||
|
||||
@@ -235,7 +233,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilecontentFilterIterator
|
||||
*/
|
||||
public function notContains($patterns)
|
||||
public function notContains(string|array $patterns): static
|
||||
{
|
||||
$this->notContains = array_merge($this->notContains, (array) $patterns);
|
||||
|
||||
@@ -259,7 +257,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilenameFilterIterator
|
||||
*/
|
||||
public function path($patterns)
|
||||
public function path(string|array $patterns): static
|
||||
{
|
||||
$this->paths = array_merge($this->paths, (array) $patterns);
|
||||
|
||||
@@ -283,7 +281,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see FilenameFilterIterator
|
||||
*/
|
||||
public function notPath($patterns)
|
||||
public function notPath(string|array $patterns): static
|
||||
{
|
||||
$this->notPaths = array_merge($this->notPaths, (array) $patterns);
|
||||
|
||||
@@ -305,7 +303,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
* @see SizeRangeFilterIterator
|
||||
* @see NumberComparator
|
||||
*/
|
||||
public function size($sizes)
|
||||
public function size(string|int|array $sizes): static
|
||||
{
|
||||
foreach ((array) $sizes as $size) {
|
||||
$this->sizes[] = new Comparator\NumberComparator($size);
|
||||
@@ -327,7 +325,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see ExcludeDirectoryFilterIterator
|
||||
*/
|
||||
public function exclude($dirs)
|
||||
public function exclude(string|array $dirs): static
|
||||
{
|
||||
$this->exclude = array_merge($this->exclude, (array) $dirs);
|
||||
|
||||
@@ -343,7 +341,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see ExcludeDirectoryFilterIterator
|
||||
*/
|
||||
public function ignoreDotFiles(bool $ignoreDotFiles)
|
||||
public function ignoreDotFiles(bool $ignoreDotFiles): static
|
||||
{
|
||||
if ($ignoreDotFiles) {
|
||||
$this->ignore |= static::IGNORE_DOT_FILES;
|
||||
@@ -363,7 +361,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see ExcludeDirectoryFilterIterator
|
||||
*/
|
||||
public function ignoreVCS(bool $ignoreVCS)
|
||||
public function ignoreVCS(bool $ignoreVCS): static
|
||||
{
|
||||
if ($ignoreVCS) {
|
||||
$this->ignore |= static::IGNORE_VCS_FILES;
|
||||
@@ -381,7 +379,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function ignoreVCSIgnored(bool $ignoreVCSIgnored)
|
||||
public function ignoreVCSIgnored(bool $ignoreVCSIgnored): static
|
||||
{
|
||||
if ($ignoreVCSIgnored) {
|
||||
$this->ignore |= static::IGNORE_VCS_IGNORED_FILES;
|
||||
@@ -399,7 +397,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @param string|string[] $pattern VCS patterns to ignore
|
||||
*/
|
||||
public static function addVCSPattern($pattern)
|
||||
public static function addVCSPattern(string|array $pattern)
|
||||
{
|
||||
foreach ((array) $pattern as $p) {
|
||||
self::$vcsPatterns[] = $p;
|
||||
@@ -419,13 +417,29 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sort(\Closure $closure)
|
||||
public function sort(\Closure $closure): static
|
||||
{
|
||||
$this->sort = $closure;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by extension.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByExtension(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_EXTENSION;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by name.
|
||||
*
|
||||
@@ -435,13 +449,45 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByName(bool $useNaturalSort = false)
|
||||
public function sortByName(bool $useNaturalSort = false): static
|
||||
{
|
||||
$this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by name case insensitive.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByCaseInsensitiveName(bool $useNaturalSort = false): static
|
||||
{
|
||||
$this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE : Iterator\SortableIterator::SORT_BY_NAME_CASE_INSENSITIVE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by size.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return $this
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortBySize(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_SIZE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by type (directories before files), then by name.
|
||||
*
|
||||
@@ -451,7 +497,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByType()
|
||||
public function sortByType(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_TYPE;
|
||||
|
||||
@@ -469,7 +515,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByAccessedTime()
|
||||
public function sortByAccessedTime(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;
|
||||
|
||||
@@ -481,7 +527,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function reverseSorting()
|
||||
public function reverseSorting(): static
|
||||
{
|
||||
$this->reverseSorting = true;
|
||||
|
||||
@@ -501,7 +547,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByChangedTime()
|
||||
public function sortByChangedTime(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME;
|
||||
|
||||
@@ -519,7 +565,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see SortableIterator
|
||||
*/
|
||||
public function sortByModifiedTime()
|
||||
public function sortByModifiedTime(): static
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;
|
||||
|
||||
@@ -536,7 +582,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @see CustomFilterIterator
|
||||
*/
|
||||
public function filter(\Closure $closure)
|
||||
public function filter(\Closure $closure): static
|
||||
{
|
||||
$this->filters[] = $closure;
|
||||
|
||||
@@ -548,7 +594,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function followLinks()
|
||||
public function followLinks(): static
|
||||
{
|
||||
$this->followLinks = true;
|
||||
|
||||
@@ -562,7 +608,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function ignoreUnreadableDirs(bool $ignore = true)
|
||||
public function ignoreUnreadableDirs(bool $ignore = true): static
|
||||
{
|
||||
$this->ignoreUnreadableDirs = $ignore;
|
||||
|
||||
@@ -578,7 +624,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @throws DirectoryNotFoundException if one of the directories does not exist
|
||||
*/
|
||||
public function in($dirs)
|
||||
public function in(string|array $dirs): static
|
||||
{
|
||||
$resolvedDirs = [];
|
||||
|
||||
@@ -587,7 +633,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
$resolvedDirs[] = [$this->normalizeDir($dir)];
|
||||
} elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) {
|
||||
sort($glob);
|
||||
$resolvedDirs[] = array_map([$this, 'normalizeDir'], $glob);
|
||||
$resolvedDirs[] = array_map($this->normalizeDir(...), $glob);
|
||||
} else {
|
||||
throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir));
|
||||
}
|
||||
@@ -607,8 +653,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @throws \LogicException if the in() method has not been called
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getIterator()
|
||||
public function getIterator(): \Iterator
|
||||
{
|
||||
if (0 === \count($this->dirs) && 0 === \count($this->iterators)) {
|
||||
throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
|
||||
@@ -651,7 +696,7 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
*
|
||||
* @throws \InvalidArgumentException when the given argument is not iterable
|
||||
*/
|
||||
public function append(iterable $iterator)
|
||||
public function append(iterable $iterator): static
|
||||
{
|
||||
if ($iterator instanceof \IteratorAggregate) {
|
||||
$this->iterators[] = $iterator->getIterator();
|
||||
@@ -673,10 +718,8 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
|
||||
/**
|
||||
* Check if any results were found.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasResults()
|
||||
public function hasResults(): bool
|
||||
{
|
||||
foreach ($this->getIterator() as $_) {
|
||||
return true;
|
||||
@@ -687,11 +730,8 @@ class Finder implements \IteratorAggregate, \Countable
|
||||
|
||||
/**
|
||||
* Counts all the results collected by the iterators.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function count()
|
||||
public function count(): int
|
||||
{
|
||||
return iterator_count($this->getIterator());
|
||||
}
|
||||
|
2
vendor/symfony/finder/Gitignore.php
vendored
2
vendor/symfony/finder/Gitignore.php
vendored
@@ -43,7 +43,7 @@ class Gitignore
|
||||
foreach ($gitignoreLines as $line) {
|
||||
$line = preg_replace('~(?<!\\\\)[ \t]+$~', '', $line);
|
||||
|
||||
if ('!' === substr($line, 0, 1)) {
|
||||
if (str_starts_with($line, '!')) {
|
||||
$line = substr($line, 1);
|
||||
$isNegative = true;
|
||||
} else {
|
||||
|
4
vendor/symfony/finder/Glob.php
vendored
4
vendor/symfony/finder/Glob.php
vendored
@@ -37,10 +37,8 @@ class Glob
|
||||
{
|
||||
/**
|
||||
* Returns a regexp which is the equivalent of the glob pattern.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#')
|
||||
public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#'): string
|
||||
{
|
||||
$firstByte = true;
|
||||
$escaping = false;
|
||||
|
@@ -23,7 +23,7 @@ namespace Symfony\Component\Finder\Iterator;
|
||||
*/
|
||||
class CustomFilterIterator extends \FilterIterator
|
||||
{
|
||||
private $filters = [];
|
||||
private array $filters = [];
|
||||
|
||||
/**
|
||||
* @param \Iterator<string, \SplFileInfo> $iterator The Iterator to filter
|
||||
@@ -45,11 +45,8 @@ class CustomFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
|
||||
|
@@ -22,7 +22,7 @@ use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
*/
|
||||
class DateRangeFilterIterator extends \FilterIterator
|
||||
{
|
||||
private $comparators = [];
|
||||
private array $comparators = [];
|
||||
|
||||
/**
|
||||
* @param \Iterator<string, \SplFileInfo> $iterator
|
||||
@@ -37,11 +37,8 @@ class DateRangeFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
|
||||
|
@@ -23,7 +23,7 @@ namespace Symfony\Component\Finder\Iterator;
|
||||
*/
|
||||
class DepthRangeFilterIterator extends \FilterIterator
|
||||
{
|
||||
private $minDepth = 0;
|
||||
private int $minDepth = 0;
|
||||
|
||||
/**
|
||||
* @param \RecursiveIteratorIterator<\RecursiveIterator<TKey, TValue>> $iterator The Iterator to filter
|
||||
@@ -40,11 +40,8 @@ class DepthRangeFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
return $this->getInnerIterator()->getDepth() >= $this->minDepth;
|
||||
}
|
||||
|
@@ -11,24 +11,27 @@
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\SplFileInfo;
|
||||
|
||||
/**
|
||||
* ExcludeDirectoryFilterIterator filters out directories.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* @extends \FilterIterator<string, \SplFileInfo>
|
||||
* @implements \RecursiveIterator<string, \SplFileInfo>
|
||||
* @extends \FilterIterator<string, SplFileInfo>
|
||||
* @implements \RecursiveIterator<string, SplFileInfo>
|
||||
*/
|
||||
class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator
|
||||
{
|
||||
private $iterator;
|
||||
private $isRecursive;
|
||||
private $excludedDirs = [];
|
||||
private $excludedPattern;
|
||||
/** @var \Iterator<string, SplFileInfo> */
|
||||
private \Iterator $iterator;
|
||||
private bool $isRecursive;
|
||||
private array $excludedDirs = [];
|
||||
private ?string $excludedPattern = null;
|
||||
|
||||
/**
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param string[] $directories An array of directories to exclude
|
||||
* @param \Iterator<string, SplFileInfo> $iterator The Iterator to filter
|
||||
* @param string[] $directories An array of directories to exclude
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $directories)
|
||||
{
|
||||
@@ -52,11 +55,8 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \Recursi
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) {
|
||||
return false;
|
||||
@@ -72,20 +72,12 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \Recursi
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function hasChildren()
|
||||
public function hasChildren(): bool
|
||||
{
|
||||
return $this->isRecursive && $this->iterator->hasChildren();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return self
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getChildren()
|
||||
public function getChildren(): self
|
||||
{
|
||||
$children = new self($this->iterator->getChildren(), []);
|
||||
$children->excludedDirs = $this->excludedDirs;
|
||||
|
@@ -23,11 +23,11 @@ class FileTypeFilterIterator extends \FilterIterator
|
||||
public const ONLY_FILES = 1;
|
||||
public const ONLY_DIRECTORIES = 2;
|
||||
|
||||
private $mode;
|
||||
private int $mode;
|
||||
|
||||
/**
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
|
||||
* @param \Iterator<string, \SplFileInfo> $iterator The Iterator to filter
|
||||
* @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, int $mode)
|
||||
{
|
||||
@@ -38,11 +38,8 @@ class FileTypeFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) {
|
||||
|
@@ -11,23 +11,22 @@
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\SplFileInfo;
|
||||
|
||||
/**
|
||||
* FilecontentFilterIterator filters files by their contents using patterns (regexps or strings).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
|
||||
*
|
||||
* @extends MultiplePcreFilterIterator<string, \SplFileInfo>
|
||||
* @extends MultiplePcreFilterIterator<string, SplFileInfo>
|
||||
*/
|
||||
class FilecontentFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
if (!$this->matchRegexps && !$this->noMatchRegexps) {
|
||||
return true;
|
||||
@@ -51,10 +50,8 @@ class FilecontentFilterIterator extends MultiplePcreFilterIterator
|
||||
* Converts string to regexp if necessary.
|
||||
*
|
||||
* @param string $str Pattern: string or regexp
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function toRegex(string $str)
|
||||
protected function toRegex(string $str): string
|
||||
{
|
||||
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
|
||||
}
|
||||
|
@@ -24,11 +24,8 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
return $this->isAccepted($this->current()->getFilename());
|
||||
}
|
||||
@@ -40,10 +37,8 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator
|
||||
* Glob strings are transformed with Glob::toRegex().
|
||||
*
|
||||
* @param string $str Pattern: glob or regexp
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function toRegex(string $str)
|
||||
protected function toRegex(string $str): string
|
||||
{
|
||||
return $this->isRegex($str) ? $str : Glob::toRegex($str);
|
||||
}
|
||||
|
@@ -18,11 +18,11 @@ namespace Symfony\Component\Finder\Iterator;
|
||||
*/
|
||||
class LazyIterator implements \IteratorAggregate
|
||||
{
|
||||
private $iteratorFactory;
|
||||
private \Closure $iteratorFactory;
|
||||
|
||||
public function __construct(callable $iteratorFactory)
|
||||
{
|
||||
$this->iteratorFactory = $iteratorFactory;
|
||||
$this->iteratorFactory = $iteratorFactory(...);
|
||||
}
|
||||
|
||||
public function getIterator(): \Traversable
|
||||
|
@@ -27,9 +27,9 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator
|
||||
protected $noMatchRegexps = [];
|
||||
|
||||
/**
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param string[] $matchPatterns An array of patterns that need to match
|
||||
* @param string[] $noMatchPatterns An array of patterns that need to not match
|
||||
* @param \Iterator<TKey, TValue> $iterator The Iterator to filter
|
||||
* @param string[] $matchPatterns An array of patterns that need to match
|
||||
* @param string[] $noMatchPatterns An array of patterns that need to not match
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
|
||||
{
|
||||
@@ -50,10 +50,8 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator
|
||||
* If there is no regexps defined in the class, this method will accept the string.
|
||||
* Such case can be handled by child classes before calling the method if they want to
|
||||
* apply a different behavior.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isAccepted(string $string)
|
||||
protected function isAccepted(string $string): bool
|
||||
{
|
||||
// should at least not match one rule to exclude
|
||||
foreach ($this->noMatchRegexps as $regex) {
|
||||
@@ -79,10 +77,8 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Checks whether the string is a regex.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isRegex(string $str)
|
||||
protected function isRegex(string $str): bool
|
||||
{
|
||||
$availableModifiers = 'imsxuADU';
|
||||
|
||||
@@ -110,8 +106,6 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Converts string into regexp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function toRegex(string $str);
|
||||
abstract protected function toRegex(string $str): string;
|
||||
}
|
||||
|
@@ -11,23 +11,22 @@
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\SplFileInfo;
|
||||
|
||||
/**
|
||||
* PathFilterIterator filters files by path patterns (e.g. some/special/dir).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
|
||||
*
|
||||
* @extends MultiplePcreFilterIterator<string, \SplFileInfo>
|
||||
* @extends MultiplePcreFilterIterator<string, SplFileInfo>
|
||||
*/
|
||||
class PathFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
$filename = $this->current()->getRelativePathname();
|
||||
|
||||
@@ -49,10 +48,8 @@ class PathFilterIterator extends MultiplePcreFilterIterator
|
||||
* Use only / as directory separator (on Windows also).
|
||||
*
|
||||
* @param string $str Pattern: regexp or dirname
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function toRegex(string $str)
|
||||
protected function toRegex(string $str): string
|
||||
{
|
||||
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
|
||||
}
|
||||
|
@@ -18,23 +18,17 @@ use Symfony\Component\Finder\SplFileInfo;
|
||||
* Extends the \RecursiveDirectoryIterator to support relative paths.
|
||||
*
|
||||
* @author Victor Berchet <victor@suumit.com>
|
||||
* @extends \RecursiveDirectoryIterator<string, SplFileInfo>
|
||||
*/
|
||||
class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $ignoreUnreadableDirs;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $rewindable;
|
||||
private bool $ignoreUnreadableDirs;
|
||||
private ?bool $rewindable = null;
|
||||
|
||||
// these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations
|
||||
private $rootPath;
|
||||
private $subPath;
|
||||
private $directorySeparator = '/';
|
||||
private string $rootPath;
|
||||
private string $subPath;
|
||||
private string $directorySeparator = '/';
|
||||
|
||||
/**
|
||||
* @throws \RuntimeException
|
||||
@@ -55,17 +49,15 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
|
||||
/**
|
||||
* Return an instance of SplFileInfo with support for relative paths.
|
||||
*
|
||||
* @return SplFileInfo
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function current()
|
||||
public function current(): SplFileInfo
|
||||
{
|
||||
// the logic here avoids redoing the same work in all iterations
|
||||
|
||||
if (null === $subPathname = $this->subPath) {
|
||||
$subPathname = $this->subPath = $this->getSubPath();
|
||||
if (!isset($this->subPath)) {
|
||||
$this->subPath = $this->getSubPath();
|
||||
}
|
||||
$subPathname = $this->subPath;
|
||||
if ('' !== $subPathname) {
|
||||
$subPathname .= $this->directorySeparator;
|
||||
}
|
||||
@@ -78,13 +70,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $allowLinks
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function hasChildren($allowLinks = false)
|
||||
public function hasChildren(bool $allowLinks = false): bool
|
||||
{
|
||||
$hasChildren = parent::hasChildren($allowLinks);
|
||||
|
||||
@@ -96,19 +82,16 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
parent::getChildren();
|
||||
|
||||
return true;
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
} catch (\UnexpectedValueException) {
|
||||
// If directory is unreadable and finder is set to ignore it, skip children
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \RecursiveDirectoryIterator
|
||||
*
|
||||
* @throws AccessDeniedException
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getChildren()
|
||||
public function getChildren(): \RecursiveDirectoryIterator
|
||||
{
|
||||
try {
|
||||
$children = parent::getChildren();
|
||||
@@ -130,11 +113,8 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
|
||||
/**
|
||||
* Do nothing for non rewindable stream.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function rewind()
|
||||
public function rewind(): void
|
||||
{
|
||||
if (false === $this->isRewindable()) {
|
||||
return;
|
||||
@@ -145,10 +125,8 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
|
||||
/**
|
||||
* Checks if the stream is rewindable.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isRewindable()
|
||||
public function isRewindable(): bool
|
||||
{
|
||||
if (null !== $this->rewindable) {
|
||||
return $this->rewindable;
|
||||
|
@@ -22,7 +22,7 @@ use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
*/
|
||||
class SizeRangeFilterIterator extends \FilterIterator
|
||||
{
|
||||
private $comparators = [];
|
||||
private array $comparators = [];
|
||||
|
||||
/**
|
||||
* @param \Iterator<string, \SplFileInfo> $iterator
|
||||
@@ -37,11 +37,8 @@ class SizeRangeFilterIterator extends \FilterIterator
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function accept()
|
||||
public function accept(): bool
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
if (!$fileinfo->isFile()) {
|
||||
|
@@ -27,9 +27,14 @@ class SortableIterator implements \IteratorAggregate
|
||||
public const SORT_BY_CHANGED_TIME = 4;
|
||||
public const SORT_BY_MODIFIED_TIME = 5;
|
||||
public const SORT_BY_NAME_NATURAL = 6;
|
||||
public const SORT_BY_NAME_CASE_INSENSITIVE = 7;
|
||||
public const SORT_BY_NAME_NATURAL_CASE_INSENSITIVE = 8;
|
||||
public const SORT_BY_EXTENSION = 9;
|
||||
public const SORT_BY_SIZE = 10;
|
||||
|
||||
private $iterator;
|
||||
private $sort;
|
||||
/** @var \Traversable<string, \SplFileInfo> */
|
||||
private \Traversable $iterator;
|
||||
private \Closure|int $sort;
|
||||
|
||||
/**
|
||||
* @param \Traversable<string, \SplFileInfo> $iterator
|
||||
@@ -37,7 +42,7 @@ class SortableIterator implements \IteratorAggregate
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false)
|
||||
public function __construct(\Traversable $iterator, int|callable $sort, bool $reverseOrder = false)
|
||||
{
|
||||
$this->iterator = $iterator;
|
||||
$order = $reverseOrder ? -1 : 1;
|
||||
@@ -50,6 +55,14 @@ class SortableIterator implements \IteratorAggregate
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
|
||||
};
|
||||
} elseif (self::SORT_BY_NAME_CASE_INSENSITIVE === $sort) {
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
|
||||
};
|
||||
} elseif (self::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE === $sort) {
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
|
||||
};
|
||||
} elseif (self::SORT_BY_TYPE === $sort) {
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
if ($a->isDir() && $b->isFile()) {
|
||||
@@ -72,20 +85,24 @@ class SortableIterator implements \IteratorAggregate
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * ($a->getMTime() - $b->getMTime());
|
||||
};
|
||||
} elseif (self::SORT_BY_EXTENSION === $sort) {
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * strnatcmp($a->getExtension(), $b->getExtension());
|
||||
};
|
||||
} elseif (self::SORT_BY_SIZE === $sort) {
|
||||
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
|
||||
return $order * ($a->getSize() - $b->getSize());
|
||||
};
|
||||
} elseif (self::SORT_BY_NONE === $sort) {
|
||||
$this->sort = $order;
|
||||
} elseif (\is_callable($sort)) {
|
||||
$this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort;
|
||||
$this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort(...);
|
||||
} else {
|
||||
throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Traversable<string, \SplFileInfo>
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getIterator()
|
||||
public function getIterator(): \Traversable
|
||||
{
|
||||
if (1 === $this->sort) {
|
||||
return $this->iterator;
|
||||
|
@@ -13,6 +13,9 @@ namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Gitignore;
|
||||
|
||||
/**
|
||||
* @extends \FilterIterator<string, \SplFileInfo>
|
||||
*/
|
||||
final class VcsIgnoredFilterIterator extends \FilterIterator
|
||||
{
|
||||
/**
|
||||
@@ -30,10 +33,20 @@ final class VcsIgnoredFilterIterator extends \FilterIterator
|
||||
*/
|
||||
private $ignoredPathsCache = [];
|
||||
|
||||
/**
|
||||
* @param \Iterator<string, \SplFileInfo> $iterator
|
||||
*/
|
||||
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;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
@@ -58,7 +71,7 @@ final class VcsIgnoredFilterIterator extends \FilterIterator
|
||||
|
||||
$ignored = false;
|
||||
|
||||
foreach ($this->parentsDirectoryDownward($fileRealPath) as $parentDirectory) {
|
||||
foreach ($this->parentDirectoriesDownwards($fileRealPath) as $parentDirectory) {
|
||||
if ($this->isIgnored($parentDirectory)) {
|
||||
// rules in ignored directories are ignored, no need to check further.
|
||||
break;
|
||||
@@ -89,11 +102,11 @@ final class VcsIgnoredFilterIterator extends \FilterIterator
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
private function parentsDirectoryDownward(string $fileRealPath): array
|
||||
private function parentDirectoriesUpwards(string $from): array
|
||||
{
|
||||
$parentDirectories = [];
|
||||
|
||||
$parentDirectory = $fileRealPath;
|
||||
$parentDirectory = $from;
|
||||
|
||||
while (true) {
|
||||
$newParentDirectory = \dirname($parentDirectory);
|
||||
@@ -103,16 +116,30 @@ final class VcsIgnoredFilterIterator extends \FilterIterator
|
||||
break;
|
||||
}
|
||||
|
||||
$parentDirectory = $newParentDirectory;
|
||||
|
||||
if (0 !== strpos($parentDirectory, $this->baseDir)) {
|
||||
break;
|
||||
}
|
||||
|
||||
$parentDirectories[] = $parentDirectory;
|
||||
$parentDirectories[] = $parentDirectory = $newParentDirectory;
|
||||
}
|
||||
|
||||
return array_reverse($parentDirectories);
|
||||
return $parentDirectories;
|
||||
}
|
||||
|
||||
private function parentDirectoriesUpTo(string $from, string $upTo): array
|
||||
{
|
||||
return array_filter(
|
||||
$this->parentDirectoriesUpwards($from),
|
||||
static function (string $directory) use ($upTo): bool {
|
||||
return str_starts_with($directory, $upTo);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
private function parentDirectoriesDownwards(string $fileRealPath): array
|
||||
{
|
||||
return array_reverse(
|
||||
$this->parentDirectoriesUpTo($fileRealPath, $this->baseDir)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
16
vendor/symfony/finder/SplFileInfo.php
vendored
16
vendor/symfony/finder/SplFileInfo.php
vendored
@@ -18,8 +18,8 @@ namespace Symfony\Component\Finder;
|
||||
*/
|
||||
class SplFileInfo extends \SplFileInfo
|
||||
{
|
||||
private $relativePath;
|
||||
private $relativePathname;
|
||||
private string $relativePath;
|
||||
private string $relativePathname;
|
||||
|
||||
/**
|
||||
* @param string $file The file name
|
||||
@@ -37,10 +37,8 @@ class SplFileInfo extends \SplFileInfo
|
||||
* Returns the relative path.
|
||||
*
|
||||
* This path does not contain the file name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRelativePath()
|
||||
public function getRelativePath(): string
|
||||
{
|
||||
return $this->relativePath;
|
||||
}
|
||||
@@ -49,10 +47,8 @@ class SplFileInfo extends \SplFileInfo
|
||||
* Returns the relative path name.
|
||||
*
|
||||
* This path contains the file name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRelativePathname()
|
||||
public function getRelativePathname(): string
|
||||
{
|
||||
return $this->relativePathname;
|
||||
}
|
||||
@@ -67,11 +63,9 @@ class SplFileInfo extends \SplFileInfo
|
||||
/**
|
||||
* Returns the contents of the file.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function getContents()
|
||||
public function getContents(): string
|
||||
{
|
||||
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
|
||||
try {
|
||||
|
7
vendor/symfony/finder/composer.json
vendored
7
vendor/symfony/finder/composer.json
vendored
@@ -16,9 +16,10 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.2.5",
|
||||
"symfony/deprecation-contracts": "^2.1|^3",
|
||||
"symfony/polyfill-php80": "^1.16"
|
||||
"php": ">=8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/filesystem": "^6.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": { "Symfony\\Component\\Finder\\": "" },
|
||||
|
Reference in New Issue
Block a user