cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

pep8をgitのpre-commitでコミット前にチェック git mvのリネームにも対応

PEP8とpep8

PythonはPEP8でコーディング規約をしっかり決まっていて、その自動チェッカーpep8もある。PEP8にも漏れはあるものの、pep8をパスした他人のコードは自分のコードとシームレスに読むことができ、複数人でのコーディングで威力を発揮する。

pep8の自動化

このpep8は全員が忘れず走らせるというのは難しいので、gitのpre-commitを利用してコミットする際に自動でpep8を走らせ、チェックをパスしないとコミットできないようにする。

Python, PEP8 and Git hooks | EmmaTech
githooks/pep8-pyflakes-pre-commit.py at master · danigm/githooks · GitHub
が参考になる。(2つ目はpyflakesも自動チェックしている)

問題発生

今まではこれでうまくいっていた。
しかし、先日チーム開発のメンバーから自動チェックが上手く行かなかったと報告をもらった。

原因

調べてみると原因は

git mv before.py after.py

というようにリネームを行うと

git status --porcelain

した時の出力が

R before.py -> after.py

となり、pre-commitのパターン

'^[AM]+\s+(?P<name>.*\.py)'

にマッチしなくなるのが原因だった。
ちなみに上記パターンは新規作成と編集にマッチする。

同様に

git mv before.py after.py

した後にafter.pyを編集した場合、する前にbefore.pyを編集した場合は

git status --porcelain

した時の出力が

RM before.py -> after.py

となりやはりパターンにマッチしない。

解決

そこで

'^[RM]+\s+.*\.py\s+[-][>]\s+(?P<name>.*\.py)'

でもパターンマッチを行い、リネームにも対応できるようにした。

修正版はgistに上げてある。