pre-commitで`php -l`をする

commit前にlintを動かしたいと思ったので、その設定方法を調べた。php -lphp --syntax-checkは同じ。

git管理ディレクトリである.gitの中にあるhooksディレクトリにサンプルがあるので、それを参考にして以下のようなファイルを作成した。

#!/bin/sh

# 変更/追加したファイルの一覧を取得する
files=$(git diff --cached --name-only --diff-filter=AM)
# 取得したファイル一覧をリストとしてphpのlintを実行する
php_extension=php
end_flag=0
for file in $files; do
  extension=${file##*.} # 拡張子(.を除く)を取り出すために前方最長一致で変数展開する
  if [ ${extension} = ${php_extension} ]; then # 拡張子がphpの時のみ構文チェックを行う
    php --syntax-check $file
    command_result=${?} # $?は別のコマンドを実行すると置き換わるので変数に格納して繰り返し参照できるようにする
    if [ ${command_result} != 0 ]; then
      if [ ${end_flag} = 0 ]; then
        end_flag=${command_result}
      fi
    fi
  fi
done
if [ ${end_flag} = 0 ]; then
  echo 'syntax ok'
  exit 0
else
  echo 'syntax error. commit abort'
  exit 1
fi

これを.git/hooks/pre-commitとして保存すれば、commit前にこのスクリプトが実行される。

注意として、このスクリプト自体をgitで管理することはできない。そのため、他の開発者にも使用してもらいたい場合は別のディレクトリで管理しておいてそちらを参照する設定にするか、開発環境をセットアップする際にhooksへコピーするようなスクリプトを別途用意しておかなければならない。

それとエラーが起きたファイルを修正したらgit addを忘れないように。stagingされていないので、他のファイルだけcommitされてしまう。