実現したいこと
Gitのpre-commitフックを使って、コミット時にPHPファイルのコード整形と静的解析が実行されるようにしたい。
問題点
commit時にpre-commitに登録したスクリプトは動き、コード整形はされるがコミットができない。
途中でエラーが発生している。
参考にしたサイト
必要なパッケージ
- php-cs-fixer(コード整形)
- phpmd(静的解析)
それぞれのパッケージについては解説しません。
https://zenn.dev/takuyanagai0213/articles/2685fe51f7afe5#%E9%9D%99%E7%9A%84%E8%A7%A3%E6%9E%90%E3%83%84%E3%83%BC%E3%83%AB%E5%B0%8E%E5%85%A5
導入に関しては上記を参考にしました。
--devオプションをつけてインストールでも良いかと思います。
修正したpre-commitのスクリプト
#!/bin/bash
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
SYNTAX_CHECK=0
## 静的解析、及びフォーマッターの実行
# コミットされるファイルのうち、.phpで終わるもの
for FILE in `git diff-index --name-status $against -- | grep -E '^[AUM].*\.php$'| cut -c3-`; do
# シンタックスのチェック
if php -l $FILE; then
# PSR準拠でコード書き換え
./vendor/bin/php-cs-fixer fix $FILE
git add $FILE
# PHPMDで未使用変数などのチェック
if ! ./vendor/bin/phpmd $FILE text ruleset.xml; then
SYNTAX_CHECK=1
fi
else
SYNTAX_CHECK=1
fi
done
## 最後の確認
if [ $SYNTAX_CHECK -eq 0 ]; then
exit 0
else
echo -e $'\e[31;43m 修正を行った上で再度コミットしてください \e[m'
exit 1
fi
参考にしたサイト↓のままではエラーが発生していたので、後述の2行について修正を加えました。
https://zenn.dev/takuyanagai0213/articles/2685fe51f7afe5
32行目のif [ $SYNTAX_CHECK -eq 0 ]; then
35行目のecho -e $'\e[31;43m 修正を行った上で再度コミットしてください \e[m'
32行目はもともとはif [ $SYNTAX_CHECK -eq 0 -a $IS_ERROR -eq 0 ]; then
となっていました。IS_ERRORも参照しているが、スクリプト中では設定されていない変数なので、そこで落ちていたようです。(違っていたら教えてください!)
35行目については色をつけてメッセージを表示する箇所ですが、なぜか色がつかなかったので、
https://qiita.com/Sho2010@github/items/eae44da09aa279e7e598
を参考に少し記述を変更しましたら正しく色付きのメッセージが表示されました!(マジ感謝!!)