PerlでWebサービスやライブラリを開発している際, 「今, この変数の中には何が入っているんだろう?」となった時にはよくData::Printerを使っています. Data::Printerは非常に便利なのですが, 先日誤って勢い良くData::Printerを使って変数をダンプするコードを混入したままにcommit/pushをしてしまって, いろいろと大変なことになったので, これを防げるようにしようという気持ちになりました.
Data::Printerを使う時は, 大抵Vimのスニペットで「DDP」をuse
して使うようにしています.
なので, Gitでcommitする際に, Perlのコードの中に「DDP」という文字列が含まれていれば, commitに失敗するようにすれば良さそうです.
「commit時に処理を走らせる」, となればGitのpre-commit
のhookを使ってやればよさそう*1, ということで次のようなpre-commit
スクリプトが出来上がりました.
#!/bin/sh if ag --perl DDP $(git rev-parse --show-toplevel) >/dev/null ; then echo "some file contains code for debugging: DDP" exit 1; fi
grep
などで頑張っても良かったのですが, いつも使っていて必ずインストールしているag
コマンドを使いました.
ag
コマンドに対して--perl
オプションを与えて, 検索対象をPerl系のファイルのみに制限*2した上で, git rev-parse --show-toplevel
で取得したGitリポジトリのルートディレクトリを対象に, DDP
という文言を探します.
その結果, もしDDP
という文言が含まれていた場合, 警告を表示した上でexit 1
して, Gitのcommit処理を停止します.
まとめ
Gitのpre-commit
スクリプトと, ag
コマンドを組み合わせて, Perl用のデバッグコードが残っている時にGitでコミットできないようにする仕組みを作りました.
ag
コマンドでは, 他にも--ruby
とか--js
とか--php
のオプションが使えて, それぞれRuby/JavaScript/PHPに関連するファイルのみを対象にして検索をすることも出来るので, Perl以外の言語でもこのような仕組みを作ることができそうです.
*1:Gitのフックシステムについては, Git - Git フック のページなどが参考になります.
*2:拡張子が, .pl .pm .pm6 .pod .t であるファイルのみ検索対象にします