-
Notifications
You must be signed in to change notification settings - Fork 506
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Ant-style path pattern support broken when ktlint
is invoked from the command line
#1601
Comments
An additional problem is that path patterns which ktlint produces automatically, when launched w/o arguments, are platform-specific, i. e. they use backslashes on Windows: #1611. This is a clear violation of Ant pattern syntax (see the linked pages). |
Yes, apparently I have just assumed that the path patterns followed the default directory separator of the file system.
|
…matching Globs always use a "/" as directory separator on all OS's. Input patterns containing a "\" on Windows OS are transformed to "/" as users on Windows more likely would assume that the "\" may be used. On WindowsOS, transform "\" in the filepath to "/" before comparing the filename with the regular expression (of the glob) which always uses "/" as separator. Refactor all logic which create globs based on an input path. - If a path (absolute or relative) point to a directory, that path is expanded to the default globs (*.kt, *.kts) in that specific directory or any of its subdirectories. - If a path (absolute or relative) does not point to a directory, e.g. it points to a file, or it is a pattern. See "**" replacement below. - On Windows OS patters containing a "*" (or "**") can not be resolved with default Paths utilities. In such case the given input pattern is handled as is. See "**" replacement below. Patterns that contain one or more occurrence of a "**" are split into multiple patterns so that files on that specific path and subdirectories will be matched. - For example, for path "some/path/**/*.kt" an additional pattern "some/path/*.kt" is generated to make sure that not only the "*.kt" files in a subdirectory of "some/path/" are found but also the "*.kt" in directory "some/path" as well. This is in sync with the "**" notation in a glob which should be interpreted as having zero or more intermediate subdirectories. - For example, for path "some/**/path/**/*.kt", multiple additional patterns are generated. As it contains two "**" patterns, 2 x 2 patterns are needed to match all possible combinations: - "some/**/path/**/*.kt" - "some/**/path/*.kt" - "some/path/**/*.kt" - "some/path/*.kt" Finally, on Windows OS more fixes are needed as the resulting globs may not contain any drive destinations as the start of the path. Such a drive destination is replaced with a "**". So "D:/some/path/*.kt" becomes "/some/path/*.kt". Note that the last glob representation is less strict than the original pattern as it could match on other drives that "D:/" as well. Extend trace logging. Closes pinterest#1600 Closes pinterest#1601
Hi @0x6675636b796f75676974687562 , As far as I can see, I have fixed the problem with path traversing (#1600) and the ant-path parsing. I would be grateful if you could test latest snapshot (see https://pinterest.github.io/ktlint/install/snapshot-build/) to see whether the problems are resolved on Windows. |
@paul-dingemans, I've tested the latest snapshot on Windows, and all the aforementioned Ant patterns work now. Thank you! |
Expected Behavior
Judging from its documentation,
ktlint
should support Ant-style path patterns, as described inObserved Behavior
Consider I have one or more
*.kt
files in thesrc/
subdirectory of the current directory.ktlint src/*.kt
zsh
(the more complex Ant-style patterns get expanded by the shell itself):Now, let's enclose the last argument in double quotes so that it gets expanded (as we hope for) by
ktlint
rather than the underlying shell:ktlint "src/*.kt"
— doesn't work (No files matched [src/*.kt]
).ktlint "**/*.kt"
— works.ktlint "./**/*.kt"
— doesn't work.ktlint "src/**/*.kt"
— doesn't work (this is actually the example from the output ofktlint --help
).ktlint "./src/**/*.kt"
— doesn't work.ktlint "**/src/*.kt"
— doesn't work.ktlint "./**/src/*.kt"
— doesn't work.ktlint "**/src/**/*.kt"
— doesn't work.ktlint "./**/src/**/*.kt"
— doesn't work.Steps to Reproduce
cmd.exe
:Your Environment
.editorconfig
settings: noneMINGW64_NT-10.0-19043 unit-725 3.3.4-341.x86_64 2022-05-09 11:56 UTC x86_64 Msys
Linux unit-725 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 GNU/Linux
The text was updated successfully, but these errors were encountered: