2015年8月6日木曜日

git + astyle: pre-commit や alias で自動整形を自動的に叩く例

コーディング規約をastyleで適用する場合、かつgitを使う場合、例としてコーディング規約UICXXCRR1のオプションを与えたastyleのgitリポジトリーへの適用コマンドラインは次ようになります:

astyle \
  --style=break \
  --indent=spaces=2 \
  --indent-switches \
  --indent-namespaces \
  --indent-preproc-block \
  --indent-preproc-define \
  --indent-col1-comments \
  --break-blocks \
  --pad-oper \
  --pad-paren \
  --delete-empty-lines \
  --fill-empty-lines \
  --align-pointer=type \
  --align-reference=type \
  --remove-brackets \
  --keep-one-line-blocks \
  --keep-one-line-statements \
  --convert-tabs \
  --remove-comment-prefix \
  --max-code-length=100 \
  --mode=c \
  --lineend=linux \
  --suffix=none \
  --options=none \
  `git ls-files | awk '{if ($1 !~/^submodule\// && $1 ~/\.(cxx|hxx|inl)$/) print}'`

astyleに続くバッククォート部分は、

  1. git ls-filesでgitの管理対象のリポジトリールートからの相対パスを列挙、
  2. |で続けている部分は何かとフィルターしたり足し引きしたい場合などの例としてsubmodule/以下にgit submodule群がありそれは除外したい場合、astyleの対象をのawkを挙げました。

これをgitリポジトリーの.git/hooks/pre-commitか、あるいは~/.gitconfig[alias]へ仕込んでgit astyleとか、コミットコマンドと複合したgit commit-with-astyleなど用意すると良いでしょう。

(注: .gitconfig/[alias]へ入れる場合には\\\にしないと転けます。)


ちなみに、以前はfindでファイル一覧を生成して使っていたのですが、「git ls-files使えばいいじゃん」という投槍が飛んできて、確かにと思ったのでこちらを使っています。awkはカスタマイズが楽にできて正規表現も標準で記述性が良く便利なので使用。

0 件のコメント:

コメントを投稿