sifue's blog

プログラマな二児の父の日常

CVSのコミットの統計情報をCSVとして出力するワンライナー

最近、お気に入りのワンライナーを登録しておくサイト
Command-line-fu:
http://www.commandlinefu.com/
百式で紹介されていたりして、久しぶりにワンライナーを書いてみることにしました。
 
お題は、CVSで管理している統計情報をCSVで分析できるようにして吐き出すというもの。リポジトリを使っている開発メンバーのコミット回数や編集行数などを分析するために出すあれです。

どうせなので、自分がよくいじるEclipse Technology NebulaプロジェクトのCVSを例に書いてみました。ちなみに動作は、Mac OSX 10.5.6のbashでやってます。至らないところもあるかもしれませんが、いろいろいじって自分でカスタマイズしてもらえると助かります。

まずログイン。

cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/technology login

匿名なので、パスワードはEnterを押して無視。
 
最初にコミット回数の統計情報を取得してみます。

cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/technology history -caD'1 month ago' | sed -e "s/ */,/g" | grep -e "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$" > history_month.csv

historyコマンドで今月のコミットのログを取得します。さらにカンマで区切って、うまくCSVにできなかった行をはじいて保存という感じです。無論、monthをyear、week、day、hourに変えても大丈夫です。カレントディレクトリのhistory_month.csvに保存されています。
 
この規模だと数分かかりますが、でてくるCSVは、

M,2009-01-09,11:37,+0000,apanchenk,1.12,LocalEnvironment.java,org.eclipse.dltk/core/plugins/org.eclipse.dltk.core/environment/org/eclipse/dltk/core/internal/environment,==,
M,2009-01-09,11:38,+0000,apanchenk,1.8,EnvironmentManager.java,org.eclipse.dltk/core/plugins/org.eclipse.dltk.core/environment/org/eclipse/dltk/core/environment,==,

のようになります。
最初のアルファベットは、A:追加、M:マージ、R:削除、その後は、日付、日時、タイムゾーン、ユーザー名、リビジョン、ファイル名、パッケージ名、?、?という感じです。
このCSVExcelのピポッドテーブルやAccess、クライアントが充実しているSQLiteなんかの簡単なDBにインポートして統計調査すれば、開発メンバーのコミット回数や、どのパッケージがどのタイミングで開発が盛んだったのかがわかったりします。なにげにMySQLCSVのインポートができるみたいですね。こっちを使っても良いかも。
 
次に、編集した行数についての統計情報を取得します。

cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/technology rlog . | grep -e "^date:.*author:.*lines:"| sed -e "s/date: //" -e "s/; author: /,/" -e "s/; state: /,/" -e "s/; lines: /,/" -e "s/; commitid:.*//" -e "s/;$//" -e "s/ /,/g" | grep -e "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$" | grep -e "^2008-12" > rlog_200812.csv

のようになります。一度すべての統計情報を取得しているので、下手をすれば数時間かかります。無論"^2008-12"を"^2008"としたりすれば年間のデータが取得できます。EclipseのJDTのひとつひとつのファイルの履歴をみるのと同じなので、結構重いです。カレントディレクトリのrlog_200812.csvに保存されます。
 
出てくるCSVは以下の通り。

2008-12-16,03:47:53,+0900,kteegala,Exp,+1,-22
2008-12-19,06:22:14,+0900,msquillac,Exp,+4,-0
2008-12-02,23:22:56,+0900,msquillac,Exp,+4,-19

左から日付、時刻、タイムゾーン、ユーザー名、状態、追加行数、削除行数となっています。追加行・削除行の数をカウントすれば、各ユーザーの変更行数などがわかったりします。
 
ちょうど年度も終わり、開発も区切りがつくプロジェクトも多いと思いますので、どれぐらい自分がソースをいじったのか、コミットをしたのかを調べてみるのもおもしろいかもしれません。
 
追伸
Subversion版はまたいつか…。
Eclipse3.4系では、Subversiveはうまく動かず、Subsclipseは挙動が怪しい…。やっぱりEclipseではCVSを使わざるを得ないのか。JDTのバージョンアップに少し遅れて、SVNクライアントができるのがつらいところ。