The current algorithm is like "collect all included files and subtract all excluded files".
Collecting all included and all excluded files relies on the file system. This can become slow
when the patterns used to exclude files resolve to a large number of files.
The new approach only collects all lintable files and checks them against the exclude patterns.
This can be done by in-memory string-regex-match and does therefore not require file system accesses.
The new implementation also no longer traverses directories that already match an exclude pattern.
(cherry picked from commit 152355e36f)
At least ensure it compiles just fine on Windows.
* build: add CryptoSwift dependency for Windows
* SwiftLintBuiltInRules: treat Windows similar to Linux wrt `NSDataDetector`
* SwiftLintCore: initial pass for Windows support
Add some Windows specific handling for the paths in SwiftLintCore. The
one piece that this change does not cover is the handling of `glob` as
that is not an ISO C standard function and as such there is no `glob` on
Windows. This will be worked through separately.
* swiftlint: add a Windows port
This enables building the swiftlint command on Windows. There is no
system ioctl for terminal access, instead, we can use the Win32 Console
API surface to query the console size. In the case of a failure, assume
the width to be 80-columns (as the standard VGA console is 80x25).
* WIP/SwiftLintCore: port the `glob` function to Windows
Windows does not support `glob` as a standard C library function as that
is not part of the C standard. Attempt to emulate that through the use
of `FindFirstFileW` and `FindNextFile` to iterate the matching files
given a pattern. This should allow us to start enumerating the files as
if we had `glob` available.
The current algorithm is like "collect all included files and subtract all excluded files".
Collecting all included and all excluded files relies on the file system. This can become slow
when the patterns used to exclude files resolve to a large number of files.
The new approach only collects all lintable files and checks them against the exclude patterns.
This can be done by in-memory string-regex-match and does therefore not require file system accesses.
Ideally, SwiftLintCore would some day only contain components
that are needed to define rules. Consequently, it would be the
only bundle required to import for (external) rule development.