C++ の lint ツールとして cpplint がよさそう。
キレイなコードを書くためにこれを強制したいんだけど、 editor の設定やなんかだと使ってるものによって方法が違うので逆にめんどくさくなってしまう。
じゃあ必ず通るパスはどこだということで git commit は絶対やるわけだからそこで cpplint をかけてしまおうという流れ。
cpplint に通らないと commit できなくする。
こういうときは pre-commit hooks を使うらしい。
というわけで設定を作ってみた。
cpplint を使うリポジトリーの直下に tools ディレクトリーを作ってその下に cpplint.py を置く。
で、次のファイルを .git/hooks/ の下におくと git commit 時に勝手に cpplint が走ってくれる。
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Redirect output to stderr.
exec 1>&2
cpplint=$(git rev-parse --show-toplevel)/tools/cpplint.py
filters='-whitespace/line_length,-readability/todo,-runtime/reference'
sum=0
# for cpp
for file in $(git diff-index --name-status $against -- | grep -E '\.[ch](pp)?$' | awk '{print $2}'); do
$cpplint --filter=$filters $file
sum=$(expr ${sum} + $?)
done
if [ ${sum} -eq 0 ]; then
exit 0
else
exit 1
fi
ファイルの位置を変えたいときや cpplint で見てほしい設定を変えたい場合は次の行をいじればいい。
cpplint=$(git rev-parse --show-toplevel)/tools/cpplint.py
filters='-whitespace/line_length,-readability/todo,-runtime/reference'