エラーのあるファイルはコミットしない(git編)
あんま知られてないけど,PHP界隈でも
っていう,アドベントカレンダーやってたみたいです.ぜんぜんしりませんでしたそしてちらっと読んだけどあまりおもしろくn(r
で,その中にちょっと面白げな記事を見つけたので,紹介.
git の pre-commit hook を使って,エラーチェック
だいたいはテスト走らせてコミットとか,実行させてからコミットとかするけど,ちょっとしたところの修正だから確認もせずにコミットしてしかもよりによってそれがエラー起こしてたりとか,まぁ,たまにありますよね.
そのために,コミット直前の pre-commit にフックして,PHP Lintを走らせ,その結果次第でコミットをなかったことにしちゃったりしませんか,という趣旨の話.
で,具体的には,
- コミットされたファイルのPHPの文法チェックしたりする実行ファイルを用意
- プロジェクトの,.git/hooks/pre-commit で実行させる
の2つの準備が必要でする.
コミットされたファイルの文法チェック
これは,Web Advent 2008 / Don’t Commit That Error をそのまま使ってしまいます.
#!/usr/bin/php <?php $output = array(); $return = 0; exec('git rev-parse --verify HEAD 2> /dev/null', $output, $return); $against = $return == 0 ? 'HEAD' : '4b825dc642cb6eb9a060e54bf8d69288fbee4904'; exec("git diff-index --cached --name-only {$against}", $output); $filename_pattern = '/\.php$/'; $exit_status = 0; foreach ($output as $file) { if (!preg_match($filename_pattern, $file)) { // don't check files that aren't PHP continue; } $lint_output = array(); exec("php -l " . escapeshellarg($file), $lint_output, $return); if ($return == 0) { continue; } echo implode("\n", $lint_output), "\n"; $exit_status = 1; } exit($exit_status);
ちなみに,これを,プロジェクトの .git/hooks/pre-commit にそのまま貼り付けて 「chmod -x pre-commit」 とかしてもOK.
でも,git init したときにすでに pre-commit の中にシェルスクリプト(とPerlのコード)がかかれてたりして,よくわからないからこれ全部PHPにしちゃうのもなんかな,と思ったので,今回は ~/.git/hooks/pre-commit として作成して,実行権限を付加.
プロジェクトの,.git/hooks/pre-commit を編集
を編集して,こちらも実行権限を付加.
ファイルの先頭(shebangのあと)に,
~/.git/hooks/pre-commit if test $? -ne 0 then exit 1 fi
を追加.
そうすると
実行時にsyntaxエラーがあると
% git commit -m " hook test" PHP Parse error: syntax error, unexpected $end, expecting ',' or ';' in hoge.php on line 12 Parse error: syntax error, unexpected $end, expecting ',' or ';' in hoge.php on line 12 Errors parsing hoge.php
とか表示されてコミットされない.