4
4
5
5
use Symfony \Component \Finder \Finder ;
6
6
7
- final class FilesFinder
7
+ final readonly class FilesFinder
8
8
{
9
+ public function __construct (private FilesystemTweaker $ filesystemTweaker , private FileAndDirectoryFilter $ fileAndDirectoryFilter )
10
+ {
11
+ }
12
+
9
13
/**
10
- * @param list<non-empty- string> $directories
11
- * @param list<non-empty- string> $fileExtensions
12
- * @return list<\SplFileInfo>
14
+ * @param string[] $source
15
+ * @param string[] $suffixes
16
+ * @return string[]
13
17
*/
14
- public function findFiles (array $ directories , array $ fileExtensions ): array
18
+ public function findFiles (array $ source , array $ suffixes , bool $ sortByName = true ): array
19
+ {
20
+ $ filesAndDirectories = $ this ->filesystemTweaker ->resolveWithFnmatch ($ source );
21
+
22
+ $ files = $ this ->fileAndDirectoryFilter ->filterFiles ($ filesAndDirectories );
23
+
24
+ $ filteredFilePaths = array_filter (
25
+ $ files ,
26
+ fn (string $ filePath ): bool => true // TODO: Add skipper here
27
+ );
28
+
29
+ if ($ suffixes !== []) {
30
+ $ fileWithExtensionsFilter = static function (string $ filePath ) use ($ suffixes ): bool {
31
+ $ filePathExtension = pathinfo ($ filePath , PATHINFO_EXTENSION );
32
+ return in_array ($ filePathExtension , $ suffixes , true );
33
+ };
34
+ $ filteredFilePaths = array_filter ($ filteredFilePaths , $ fileWithExtensionsFilter );
35
+ }
36
+
37
+ $ directories = $ this ->fileAndDirectoryFilter ->filterDirectories ($ filesAndDirectories );
38
+ $ filteredFilePathsInDirectories = $ this ->findInDirectories ($ directories , $ suffixes , $ sortByName );
39
+
40
+ return [...$ filteredFilePaths , ...$ filteredFilePathsInDirectories ];
41
+ }
42
+
43
+ /**
44
+ * @param string[] $directories
45
+ * @param string[] $suffixes
46
+ * @return string[]
47
+ */
48
+ private function findInDirectories (array $ directories , array $ suffixes , bool $ sortByName = true ): array
15
49
{
16
50
if ($ directories === []) {
17
- throw new \ UnexpectedValueException ( ' Directories must not be an empty array ' ) ;
51
+ return [] ;
18
52
}
19
53
20
54
$ finder = Finder::create ()
@@ -23,14 +57,40 @@ public function findFiles(array $directories, array $fileExtensions): array
23
57
->size ('> 0 ' )
24
58
->in ($ directories );
25
59
26
- foreach ($ fileExtensions as $ fileExtension ) {
27
- $ finder ->name ('*. ' . $ fileExtension );
60
+ if ($ sortByName ) {
61
+ $ finder ->sortByName ();
62
+ }
63
+
64
+ if ($ suffixes !== []) {
65
+ $ suffixesPattern = $ this ->normalizeSuffixesToPattern ($ suffixes );
66
+ $ finder ->name ($ suffixesPattern );
28
67
}
29
68
30
- $ files = [];
69
+ $ filePaths = [];
31
70
foreach ($ finder as $ fileInfo ) {
32
- $ files [] = $ fileInfo ;
71
+ // getRealPath() function will return false when it checks broken symlinks.
72
+ // So we should check if this file exists or we got broken symlink
73
+
74
+ /** @var string|false $path */
75
+ $ path = $ fileInfo ->getRealPath ();
76
+ if ($ path === false ) {
77
+ continue ;
78
+ }
79
+
80
+ // TODO: Add skipper here
81
+
82
+ $ filePaths [] = $ path ;
33
83
}
34
- return $ files ;
84
+
85
+ return $ filePaths ;
86
+ }
87
+
88
+ /**
89
+ * @param string[] $suffixes
90
+ */
91
+ private function normalizeSuffixesToPattern (array $ suffixes ): string
92
+ {
93
+ $ suffixesPattern = implode ('| ' , $ suffixes );
94
+ return '#\.( ' . $ suffixesPattern . ')$# ' ;
35
95
}
36
96
}
0 commit comments