我觉得这应该比它更容易的原因之一是因为 -output-replacements-xml 本质上给了我想要的答案,它只是没有以一种易于使用的方式给我。但是,由于不需要替换的输出是非常可预测的,因此解析输出并不太难。
我现在拥有的是
clang-format -style=file -output-replacements-xml | grep -c "<replacement " >/dev/null
这实际上返回了我想要的退出代码的倒数,因为 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
- 获取索引中文件的完整文件名(不包括正在删除的文件和我可能不想处理文件的其他异常情况)
- 只保留我要检查格式的文件名(在我的情况下,只有 c、m 和 h 文件)
- 通过 xargs 运行结果以基本上“为每个”下一个命令
- 在所有文件上运行带有 -output-replacements-xml 选项的 clang-format
- 搜索表示 clang-format 已找到它想要进行的替换的替换(而不是替换)。(将所有输出作为 XML 丢弃对用户没有意义。)
- 最后一个命令退出 1(grep 说我们什么也没找到)我们完成了,一切都很好。
- 如果不是,则显示一条消息并退出 1,这将取消提交。不幸的是,我们没有简单的方法来告诉用户哪个文件是问题所在,但他们可以自己运行 clang-format 并查看。