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 であるファイルのみ検索対象にします