有没有办法可以clang-format在报告文件是否符合指定格式的模式下运行?一种干运行模式,它报告是否需要更改,但不进行更改.理想情况下,如果文件需要更改,我希望clang-format只返回非零退出代码.或者,更理想的是,非零退出代码和需要在标准输出上进行更改的文件列表.
我试图将问题保持通用,以便更多人可以回答,但我想要做的是编写一个git pre-commit钩子,它将拒绝任何与预期的.clang格式不匹配的提交.在索引中的文件列表上运行clang-format很容易.但是很难知道clang格式是否真的改变了什么.
我有一个潜在的解决方案-output-replacements-xml(我将作为答案发布),但它是一个黑客,我觉得这应该更直接.欢迎提出意见/建议,编辑,不同的答案/方法.
Dav*_*ren 42
我觉得这样的原因之一应该比它更容易因为-output-replacements-xml本质上给了我想要的答案,它只是不以易于消费的方式给我.但是,由于输出如果不需要替换是非常可预测的,解析输出并不太难.
我现在拥有的是
clang-format -style=file -output-replacements-xml | grep -c "<replacement " >/dev/null
Run Code Online (Sandbox Code Playgroud)
这实际上返回了我想要的退出代码的反转,因为如果匹配则grep返回0,如果没有则返回1.但这很容易处理.
所以我的git pre-commit钩子的相关位是
git diff --cached --name-only --diff-filter=ACMRT |
grep "\.[cmh]$" |
xargs -n1 clang-format -style=file -output-replacements-xml |
grep "<replacement " >/dev/null
if [ $? -ne 1 ]; then
echo "Commit did not match clang-format"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
小智 18
使用--dry-run和-Werror命令行选项。如果任何输入文件的格式不正确,它们将导致 ClangFormat 将任何格式违规输出到 stdout 并返回非零退出状态。
$ clang-format --dry-run --Werror foo.cpp
foo.cpp:129:23: error: code should be clang-formatted [-Wclang-format-violations]
if (rc <= 0) {
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
最初来自我的网站:https : //rigtorp.se/notes/clang-format/
您可以git diff与以下一起使用clang-format-diff:
$ git diff -U0 --no-color --staged HEAD | clang-format-diff -p1
Run Code Online (Sandbox Code Playgroud)
笔记:
--staged用于clang-format-diff仅在分阶段更改上运行$ git diff -U0 --no-color --staged HEAD -- $PWD/dir1 $PWD/dir2 $PWD/dir3 | clang-format-diff -p1
Run Code Online (Sandbox Code Playgroud)
pre-commit现在您的预提交可以是这样的:
$ git diff -U0 --no-color --staged HEAD -- $PWD/dir1 $PWD/dir2 $PWD/dir3 | clang-format-diff -p1
Run Code Online (Sandbox Code Playgroud)