Using clang-format
and clang-tidy
hooks with pre-commit to lint your C/C++ code.
Note
Automatically downloads a specific version of clang-format
or clang-tidy
binaries and installs it on the system.
Add this to your .pre-commit-config.yaml
repos: - repo: https://github.com/cpp-linter/cpp-linter-hooks rev: v0.3.0 # Use the ref you want to point at hooks: - id: clang-format args: [--style=Google] # Other coding style: LLVM, GNU, Chromium, Microsoft, Mozilla, WebKit. - id: clang-tidy args: [--checks='boost-*,bugprone-*,performance-*,readability-*,portability-*,modernize-*,clang-analyzer-*,cppcoreguidelines-*']
The example of using custom config: .clang-format
and .clang-tidy
repos: - repo: https://github.com/cpp-linter/cpp-linter-hooks rev: v0.3.0 hooks: - id: clang-format args: [--style=file] # to load .clang-format - id: clang-tidy args: [--checks=.clang-tidy] # path/to/.clang-tidy
The example of using any version of clang-tools.
repos: - repo: https://github.com/cpp-linter/cpp-linter-hooks rev: v0.3.0 hooks: - id: clang-format args: [--style=file, --version=16] - id: clang-tidy args: [--checks=.clang-tidy, --version=16]
clang-format.............................................................Failed - hook id: clang-format - files were modified by this hook
Here is the diff between the modified file.
--- a/testing/main.c +++ b/testing/main.c @@ -1,3 +1,6 @@ #include <stdio.h> -int main() {for (;;) break; printf("Hello world!\n");return 0;} - +int main() { + for (;;) break; + printf("Hello world!\n"); + return 0; +}
Pass --dry-run
to the args
of clang-format
(can also pass other arg which clang-format supports)
Then it will just print instead of changing the format. E.g:
clang-format.............................................................Failed - hook id: clang-format - exit code: 255 main.c:2:11: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^ main.c:2:13: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^ main.c:2:21: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^ main.c:2:28: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^ main.c:2:54: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^ main.c:2:63: warning: code should be clang-formatted [-Wclang-format-violations] int main() {for (;;) break; printf("Hello world!\n");return 0;} ^
clang-tidy...............................................................Failed - hook id: clang-tidy - exit code: 1 522 warnings generated. Suppressed 521 warnings (521 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. /home/runner/work/cpp-linter-hooks/cpp-linter-hooks/testing/main.c:4:13: warning: statement should be inside braces [readability-braces-around-statements] for (;;) ^ {
Any contribution is very welcome, including submitting issues, PRs, etc.
This project is licensed under the terms of the MIT license.