我之所以认为应该比它容易的原因之一是因为-output-replacements-xml本质上给了我想要的答案,只是没有以一种易于使用的方式给我。但是,由于不需要替换的输出是非常可预测的,因此解析输出不是太难。
我现在所拥有的是
clang-format -style=file -output-replacements-xml | grep -c "<replacement " >/dev/null
实际上,这将返回我想要的退出代码的反函数,因为如果某项匹配,则grep返回0,否则则返回1。但这很容易解决。
所以我的git pre-commit hook的相关部分是
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格式已找到要替换的替换的替换(与替换相反)。(丢弃所有输出,因为XML对用户没有意义。)
- 最后一个命令退出1(grep说我们什么都没找到),我们已经完成,一切都很好。
- 如果不是,则显示一条消息并退出1,这将取消提交。不幸的是,我们没有一种简单的方法来告诉用户问题出在哪个文件上,但是他们可以自己运行clang格式并查看。
#!/bin/bash
顶部。(我将全部内容都放在了要点上,但其中还包含其他特定于项目的内容。)我的内容唯一的区别是注释,它们解释了与上述相同的内容以及对clang格式路径的完全限定。