PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / symfony / finder / Finder.php
mailpoet / vendor-prefixed / symfony / finder Last commit date
Comparator 3 years ago Exception 3 years ago Iterator 3 years ago Finder.php 4 years ago Gitignore.php 4 years ago Glob.php 4 years ago SplFileInfo.php 4 years ago index.php 3 years ago
Finder.php
360 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\Finder;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Component\Finder\Comparator\DateComparator;
5 use MailPoetVendor\Symfony\Component\Finder\Comparator\NumberComparator;
6 use MailPoetVendor\Symfony\Component\Finder\Exception\DirectoryNotFoundException;
7 use MailPoetVendor\Symfony\Component\Finder\Iterator\CustomFilterIterator;
8 use MailPoetVendor\Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
9 use MailPoetVendor\Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
10 use MailPoetVendor\Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
11 use MailPoetVendor\Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
12 use MailPoetVendor\Symfony\Component\Finder\Iterator\FilenameFilterIterator;
13 use MailPoetVendor\Symfony\Component\Finder\Iterator\LazyIterator;
14 use MailPoetVendor\Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
15 use MailPoetVendor\Symfony\Component\Finder\Iterator\SortableIterator;
16 class Finder implements \IteratorAggregate, \Countable
17 {
18 public const IGNORE_VCS_FILES = 1;
19 public const IGNORE_DOT_FILES = 2;
20 public const IGNORE_VCS_IGNORED_FILES = 4;
21 private $mode = 0;
22 private $names = [];
23 private $notNames = [];
24 private $exclude = [];
25 private $filters = [];
26 private $depths = [];
27 private $sizes = [];
28 private $followLinks = \false;
29 private $reverseSorting = \false;
30 private $sort = \false;
31 private $ignore = 0;
32 private $dirs = [];
33 private $dates = [];
34 private $iterators = [];
35 private $contains = [];
36 private $notContains = [];
37 private $paths = [];
38 private $notPaths = [];
39 private $ignoreUnreadableDirs = \false;
40 private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];
41 public function __construct()
42 {
43 $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
44 }
45 public static function create()
46 {
47 return new static();
48 }
49 public function directories()
50 {
51 $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;
52 return $this;
53 }
54 public function files()
55 {
56 $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;
57 return $this;
58 }
59 public function depth($levels)
60 {
61 foreach ((array) $levels as $level) {
62 $this->depths[] = new Comparator\NumberComparator($level);
63 }
64 return $this;
65 }
66 public function date($dates)
67 {
68 foreach ((array) $dates as $date) {
69 $this->dates[] = new Comparator\DateComparator($date);
70 }
71 return $this;
72 }
73 public function name($patterns)
74 {
75 $this->names = \array_merge($this->names, (array) $patterns);
76 return $this;
77 }
78 public function notName($patterns)
79 {
80 $this->notNames = \array_merge($this->notNames, (array) $patterns);
81 return $this;
82 }
83 public function contains($patterns)
84 {
85 $this->contains = \array_merge($this->contains, (array) $patterns);
86 return $this;
87 }
88 public function notContains($patterns)
89 {
90 $this->notContains = \array_merge($this->notContains, (array) $patterns);
91 return $this;
92 }
93 public function path($patterns)
94 {
95 $this->paths = \array_merge($this->paths, (array) $patterns);
96 return $this;
97 }
98 public function notPath($patterns)
99 {
100 $this->notPaths = \array_merge($this->notPaths, (array) $patterns);
101 return $this;
102 }
103 public function size($sizes)
104 {
105 foreach ((array) $sizes as $size) {
106 $this->sizes[] = new Comparator\NumberComparator($size);
107 }
108 return $this;
109 }
110 public function exclude($dirs)
111 {
112 $this->exclude = \array_merge($this->exclude, (array) $dirs);
113 return $this;
114 }
115 public function ignoreDotFiles($ignoreDotFiles)
116 {
117 if ($ignoreDotFiles) {
118 $this->ignore |= static::IGNORE_DOT_FILES;
119 } else {
120 $this->ignore &= ~static::IGNORE_DOT_FILES;
121 }
122 return $this;
123 }
124 public function ignoreVCS($ignoreVCS)
125 {
126 if ($ignoreVCS) {
127 $this->ignore |= static::IGNORE_VCS_FILES;
128 } else {
129 $this->ignore &= ~static::IGNORE_VCS_FILES;
130 }
131 return $this;
132 }
133 public function ignoreVCSIgnored(bool $ignoreVCSIgnored)
134 {
135 if ($ignoreVCSIgnored) {
136 $this->ignore |= static::IGNORE_VCS_IGNORED_FILES;
137 } else {
138 $this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES;
139 }
140 return $this;
141 }
142 public static function addVCSPattern($pattern)
143 {
144 foreach ((array) $pattern as $p) {
145 self::$vcsPatterns[] = $p;
146 }
147 self::$vcsPatterns = \array_unique(self::$vcsPatterns);
148 }
149 public function sort(\Closure $closure)
150 {
151 $this->sort = $closure;
152 return $this;
153 }
154 public function sortByName()
155 {
156 if (\func_num_args() < 1 && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \MailPoetVendor\PHPUnit\Framework\MockObject\MockObject && !$this instanceof \MailPoetVendor\Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \MailPoetVendor\Mockery\MockInterface) {
157 @\trigger_error(\sprintf('The "%s()" method will have a new "bool $useNaturalSort = false" argument in version 5.0, not defining it is deprecated since Symfony 4.2.', __METHOD__), \E_USER_DEPRECATED);
158 }
159 $useNaturalSort = 0 < \func_num_args() && \func_get_arg(0);
160 $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME;
161 return $this;
162 }
163 public function sortByType()
164 {
165 $this->sort = Iterator\SortableIterator::SORT_BY_TYPE;
166 return $this;
167 }
168 public function sortByAccessedTime()
169 {
170 $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;
171 return $this;
172 }
173 public function reverseSorting()
174 {
175 $this->reverseSorting = \true;
176 return $this;
177 }
178 public function sortByChangedTime()
179 {
180 $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME;
181 return $this;
182 }
183 public function sortByModifiedTime()
184 {
185 $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;
186 return $this;
187 }
188 public function filter(\Closure $closure)
189 {
190 $this->filters[] = $closure;
191 return $this;
192 }
193 public function followLinks()
194 {
195 $this->followLinks = \true;
196 return $this;
197 }
198 public function ignoreUnreadableDirs($ignore = \true)
199 {
200 $this->ignoreUnreadableDirs = (bool) $ignore;
201 return $this;
202 }
203 public function in($dirs)
204 {
205 $resolvedDirs = [];
206 foreach ((array) $dirs as $dir) {
207 if (\is_dir($dir)) {
208 $resolvedDirs[] = $this->normalizeDir($dir);
209 } elseif ($glob = \glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) {
210 \sort($glob);
211 $resolvedDirs = \array_merge($resolvedDirs, \array_map([$this, 'normalizeDir'], $glob));
212 } else {
213 throw new DirectoryNotFoundException(\sprintf('The "%s" directory does not exist.', $dir));
214 }
215 }
216 $this->dirs = \array_merge($this->dirs, $resolvedDirs);
217 return $this;
218 }
219 #[\ReturnTypeWillChange]
220 public function getIterator()
221 {
222 if (0 === \count($this->dirs) && 0 === \count($this->iterators)) {
223 throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
224 }
225 if (1 === \count($this->dirs) && 0 === \count($this->iterators)) {
226 $iterator = $this->searchInDirectory($this->dirs[0]);
227 if ($this->sort || $this->reverseSorting) {
228 $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
229 }
230 return $iterator;
231 }
232 $iterator = new \AppendIterator();
233 foreach ($this->dirs as $dir) {
234 $iterator->append(new \IteratorIterator(new LazyIterator(function () use($dir) {
235 return $this->searchInDirectory($dir);
236 })));
237 }
238 foreach ($this->iterators as $it) {
239 $iterator->append($it);
240 }
241 if ($this->sort || $this->reverseSorting) {
242 $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
243 }
244 return $iterator;
245 }
246 public function append($iterator)
247 {
248 if ($iterator instanceof \IteratorAggregate) {
249 $this->iterators[] = $iterator->getIterator();
250 } elseif ($iterator instanceof \Iterator) {
251 $this->iterators[] = $iterator;
252 } elseif (\is_iterable($iterator)) {
253 $it = new \ArrayIterator();
254 foreach ($iterator as $file) {
255 $file = $file instanceof \SplFileInfo ? $file : new \SplFileInfo($file);
256 $it[$file->getPathname()] = $file;
257 }
258 $this->iterators[] = $it;
259 } else {
260 throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
261 }
262 return $this;
263 }
264 public function hasResults()
265 {
266 foreach ($this->getIterator() as $_) {
267 return \true;
268 }
269 return \false;
270 }
271 #[\ReturnTypeWillChange]
272 public function count()
273 {
274 return \iterator_count($this->getIterator());
275 }
276 private function searchInDirectory(string $dir) : \Iterator
277 {
278 $exclude = $this->exclude;
279 $notPaths = $this->notPaths;
280 if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
281 $exclude = \array_merge($exclude, self::$vcsPatterns);
282 }
283 if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
284 $notPaths[] = '#(^|/)\\..+(/|$)#';
285 }
286 if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) {
287 $gitignoreFilePath = \sprintf('%s/.gitignore', $dir);
288 if (!\is_readable($gitignoreFilePath)) {
289 throw new \RuntimeException(\sprintf('The "ignoreVCSIgnored" option cannot be used by the Finder as the "%s" file is not readable.', $gitignoreFilePath));
290 }
291 $notPaths = \array_merge($notPaths, [Gitignore::toRegex(\file_get_contents($gitignoreFilePath))]);
292 }
293 $minDepth = 0;
294 $maxDepth = \PHP_INT_MAX;
295 foreach ($this->depths as $comparator) {
296 switch ($comparator->getOperator()) {
297 case '>':
298 $minDepth = $comparator->getTarget() + 1;
299 break;
300 case '>=':
301 $minDepth = $comparator->getTarget();
302 break;
303 case '<':
304 $maxDepth = $comparator->getTarget() - 1;
305 break;
306 case '<=':
307 $maxDepth = $comparator->getTarget();
308 break;
309 default:
310 $minDepth = $maxDepth = $comparator->getTarget();
311 }
312 }
313 $flags = \RecursiveDirectoryIterator::SKIP_DOTS;
314 if ($this->followLinks) {
315 $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
316 }
317 $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
318 if ($exclude) {
319 $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude);
320 }
321 $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
322 if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) {
323 $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth);
324 }
325 if ($this->mode) {
326 $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
327 }
328 if ($this->names || $this->notNames) {
329 $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
330 }
331 if ($this->contains || $this->notContains) {
332 $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
333 }
334 if ($this->sizes) {
335 $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
336 }
337 if ($this->dates) {
338 $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
339 }
340 if ($this->filters) {
341 $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
342 }
343 if ($this->paths || $notPaths) {
344 $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths);
345 }
346 return $iterator;
347 }
348 private function normalizeDir(string $dir) : string
349 {
350 if ('/' === $dir) {
351 return $dir;
352 }
353 $dir = \rtrim($dir, '/' . \DIRECTORY_SEPARATOR);
354 if (\preg_match('#^(ssh2\\.)?s?ftp://#', $dir)) {
355 $dir .= '/';
356 }
357 return $dir;
358 }
359 }
360