Skip to content

Commit 6140468

Browse files
Nicolas D'Amourssebastianbergmann
authored andcommitted
[FEATURE] #82
Added support for globstar when resolving paths in the FileIterator factory. The extended glob function was adapted from funkjedi's implementation: https://gist.github.com/funkjedi/3feee27d873ae2297b8e2370a7082aad Fixed facade test to include newly created fixture directories.
1 parent 631d535 commit 6140468

6 files changed

Lines changed: 74 additions & 5 deletions

File tree

src/Factory.php

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private function resolveWildcards(array $paths): array
9292
$_paths = [[]];
9393

9494
foreach ($paths as $path) {
95-
if ($locals = glob($path, GLOB_ONLYDIR)) {
95+
if ($locals = $this->globstar($path)) {
9696
$_paths[] = array_map('\realpath', $locals);
9797
} else {
9898
// @codeCoverageIgnoreStart
@@ -103,4 +103,40 @@ private function resolveWildcards(array $paths): array
103103

104104
return array_values(array_filter(array_merge(...$_paths)));
105105
}
106+
107+
/**
108+
* @see https://gist.github.com/funkjedi/3feee27d873ae2297b8e2370a7082aad
109+
* @param $pattern
110+
* @param $flags
111+
* @return array|false
112+
*/
113+
private function globstar(string $pattern) {
114+
if (stripos($pattern, '**') === false) {
115+
$files = glob($pattern, GLOB_ONLYDIR);
116+
} else {
117+
$position = stripos($pattern, '**');
118+
$rootPattern = substr($pattern, 0, $position - 1);
119+
$restPattern = substr($pattern, $position + 2);
120+
121+
$patterns = [$rootPattern.$restPattern];
122+
$rootPattern .= '/*';
123+
124+
while($dirs = glob($rootPattern, GLOB_ONLYDIR)) {
125+
$rootPattern .= '/*';
126+
foreach($dirs as $dir) {
127+
$patterns[] = $dir . $restPattern;
128+
}
129+
}
130+
131+
$files = [];
132+
foreach($patterns as $pat) {
133+
$files = array_merge($files, $this->globstar($pat));
134+
}
135+
}
136+
137+
$files = array_unique($files);
138+
sort($files);
139+
140+
return $files;
141+
}
106142
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?php
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?php
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?php
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?php

tests/unit/FacadeTest.php

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* For the full copyright and license information, please view the LICENSE
88
* file that was distributed with this source code.
99
*/
10+
1011
namespace SebastianBergmann\FileIterator;
1112

1213
use function realpath;
@@ -41,11 +42,15 @@ public static function provider(): array
4142
$fixtureDirectoryRealpath . '/a/c/d/Prefix.php',
4243
$fixtureDirectoryRealpath . '/a/c/d/PrefixSuffix.php',
4344
$fixtureDirectoryRealpath . '/a/c/d/Suffix.php',
45+
$fixtureDirectoryRealpath . '/a/c/d/i/PrefixSuffix.php',
4446
$fixtureDirectoryRealpath . '/b/PrefixSuffix.php',
4547
$fixtureDirectoryRealpath . '/b/e/PrefixSuffix.php',
4648
$fixtureDirectoryRealpath . '/b/e/g/PrefixSuffix.php',
49+
$fixtureDirectoryRealpath . '/b/e/g/i/PrefixSuffix.php',
50+
$fixtureDirectoryRealpath . '/b/e/i/PrefixSuffix.php',
4751
$fixtureDirectoryRealpath . '/b/f/PrefixSuffix.php',
4852
$fixtureDirectoryRealpath . '/b/f/h/PrefixSuffix.php',
53+
$fixtureDirectoryRealpath . '/b/f/h/i/PrefixSuffix.php',
4954
],
5055
__DIR__ . '/../fixture',
5156
'',
@@ -59,6 +64,8 @@ public static function provider(): array
5964
$fixtureDirectoryRealpath . '/b/PrefixSuffix.php',
6065
$fixtureDirectoryRealpath . '/b/e/PrefixSuffix.php',
6166
$fixtureDirectoryRealpath . '/b/e/g/PrefixSuffix.php',
67+
$fixtureDirectoryRealpath . '/b/e/g/i/PrefixSuffix.php',
68+
$fixtureDirectoryRealpath . '/b/e/i/PrefixSuffix.php',
6269
],
6370
__DIR__ . '/../fixture',
6471
'',
@@ -76,11 +83,15 @@ public static function provider(): array
7683
$fixtureDirectoryRealpath . '/a/c/PrefixSuffix.php',
7784
$fixtureDirectoryRealpath . '/a/c/d/Prefix.php',
7885
$fixtureDirectoryRealpath . '/a/c/d/PrefixSuffix.php',
86+
$fixtureDirectoryRealpath . '/a/c/d/i/PrefixSuffix.php',
7987
$fixtureDirectoryRealpath . '/b/PrefixSuffix.php',
8088
$fixtureDirectoryRealpath . '/b/e/PrefixSuffix.php',
8189
$fixtureDirectoryRealpath . '/b/e/g/PrefixSuffix.php',
90+
$fixtureDirectoryRealpath . '/b/e/g/i/PrefixSuffix.php',
91+
$fixtureDirectoryRealpath . '/b/e/i/PrefixSuffix.php',
8292
$fixtureDirectoryRealpath . '/b/f/PrefixSuffix.php',
8393
$fixtureDirectoryRealpath . '/b/f/h/PrefixSuffix.php',
94+
$fixtureDirectoryRealpath . '/b/f/h/i/PrefixSuffix.php',
8495
],
8596
__DIR__ . '/../fixture',
8697
'',
@@ -95,11 +106,15 @@ public static function provider(): array
95106
$fixtureDirectoryRealpath . '/a/c/Suffix.php',
96107
$fixtureDirectoryRealpath . '/a/c/d/PrefixSuffix.php',
97108
$fixtureDirectoryRealpath . '/a/c/d/Suffix.php',
109+
$fixtureDirectoryRealpath . '/a/c/d/i/PrefixSuffix.php',
98110
$fixtureDirectoryRealpath . '/b/PrefixSuffix.php',
99111
$fixtureDirectoryRealpath . '/b/e/PrefixSuffix.php',
100112
$fixtureDirectoryRealpath . '/b/e/g/PrefixSuffix.php',
113+
$fixtureDirectoryRealpath . '/b/e/g/i/PrefixSuffix.php',
114+
$fixtureDirectoryRealpath . '/b/e/i/PrefixSuffix.php',
101115
$fixtureDirectoryRealpath . '/b/f/PrefixSuffix.php',
102116
$fixtureDirectoryRealpath . '/b/f/h/PrefixSuffix.php',
117+
$fixtureDirectoryRealpath . '/b/f/h/i/PrefixSuffix.php',
103118
],
104119
__DIR__ . '/../fixture',
105120
'Suffix.php',
@@ -115,12 +130,26 @@ public static function provider(): array
115130
$fixtureDirectoryRealpath . '/a/c/d/Prefix.php',
116131
$fixtureDirectoryRealpath . '/a/c/d/PrefixSuffix.php',
117132
$fixtureDirectoryRealpath . '/a/c/d/Suffix.php',
133+
$fixtureDirectoryRealpath . '/a/c/d/i/PrefixSuffix.php',
118134
],
119135
__DIR__ . '/../fixture/*/c',
120136
'',
121137
'',
122138
[],
123139
],
140+
'globstar, filter prefix: no, filter suffix: no, excludes: none' => [
141+
[
142+
143+
$fixtureDirectoryRealpath . '/a/c/d/i/PrefixSuffix.php',
144+
$fixtureDirectoryRealpath . '/b/e/g/i/PrefixSuffix.php',
145+
$fixtureDirectoryRealpath . '/b/e/i/PrefixSuffix.php',
146+
$fixtureDirectoryRealpath . '/b/f/h/i/PrefixSuffix.php',
147+
],
148+
__DIR__ . '/../fixture/**/i',
149+
'',
150+
'',
151+
[]
152+
],
124153
];
125154
}
126155

@@ -140,11 +169,11 @@ protected function tearDown(): void
140169
}
141170

142171
/**
143-
* @param list<non-empty-string> $expected
172+
* @param list<non-empty-string> $expected
144173
* @param list<non-empty-string>|non-empty-string $paths
145-
* @param list<non-empty-string>|string $suffixes
146-
* @param list<non-empty-string>|string $prefixes
147-
* @param list<non-empty-string> $exclude
174+
* @param list<non-empty-string>|string $suffixes
175+
* @param list<non-empty-string>|string $prefixes
176+
* @param list<non-empty-string> $exclude
148177
*/
149178
#[DataProvider('provider')]
150179
public function testSomething(array $expected, array|string $paths, array|string $suffixes, array|string $prefixes, array $exclude): void

0 commit comments

Comments
 (0)