pre-commitでRuboCop検査をしたいが、手を加えていない既存のコードに足を引っ張られたくはなかったため、差分のみでRuboCop検査できる方法を探した。検索に出てくるのは差分のみと言いつつ、"差分のあったファイル全体"にRuboCop検査をするものであり、期待するものではなかった。
PRで差分のみに対してRuboCop違反を自動でコメントしてくれるReviewdogがある。これをローカルで飼えば、期待する動きになるのではないかと思い試したところ、期待通りだったので記録しておく。
ReviewdogのインストールはMacを使っているためHomebrewで行う。
brew install reviewdog/tap/reviewdog
コンテナでRuboCopを動かす場合に使える、関連GemをアプリケーションのGemfile.lockのバージョンでインストールする場合のメモ。
gem install -N rubocop:$(ruby -ne 'print $& if /^\s{4}rubocop\s\(\K.*(?=\))/' Gemfile.lock) \
rubocop-rails:$(ruby -ne 'print $& if /^\s{4}rubocop-rails\s\(\K.*(?=\))/' Gemfile.lock) \
rubocop-performance:$(ruby -ne 'print $& if /^\s{4}rubocop-performance\s\(\K.*(?=\))/' Gemfile.lock)
これはReviewdogのaction-rubocopでそういう設定ができたので、インストール部分を参考にさせてもらった。
実行は"差分のあったファイル全体"のRuboCop検査の結果をReviewdogに食わせるだけ。
git diff --cached --name-only |\
grep -e '\.rb$' -e 'Gemfile$' -e 'Rakefile$' -e 'config\.ru$' -e '\.gemspec$' |\
xargs rubocop |\
reviewdog -f=rubocop -fail-on-error -diff="git diff --cached" -reporter=local
差分のファイルの取り方はもっといい方法があるかもしれない。