-output-replacements-xml は本質的に私が望む答えを私に与えるので、これはそれよりも簡単であるべきだと私が感じる理由の1つです。ただし、置換が不要な場合の出力は非常に予測可能であるため、出力の解析はそれほど難しくありません。
私が今持っているのは
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 を自分で実行して確認することはできます。