Subversion: svn diffした時にコミットのログも一緒に表示するスクリプト

最近、Pugsの初期のコードをよく読んでいる。コードを読んでいると、現在読んでいるコードとそれ以前のコードを比較したくなる時がある。そんな時は、Subversionリポジトリからチェックアウトしてできたワーキングディレクトリで以下のようなコマンドを実行してやれば良い。これでリビジョン4とリビジョン5の差分が見られる。

% svn diff -r 4:5
Index: Lexer.hs
===================================================================
--- Lexer.hs    (revision 4)
+++ Lexer.hs    (revision 5)
@@ -140,9 +140,9 @@
                         }
                       <?> "literal string")
 
-singleStrChar = quotedQuote <|> noneOf "'"
+singleStrChar = try quotedQuote <|> noneOf "'"
[...]

差分が見られるだけでも嬉しいけれども、コミット時のログも差分と同時に見られるともっと嬉しい。

そこで、それを実現してくれるスクリプトPerlで書いてみた。実行権限を付けて~/binにでも入れておけば、どこにいても使えるようになる。

% vim ~/bin/svndiff
#!/usr/bin/perl
use strict;
use warnings;

sub usage {
    print "Usage: svndiff target_rev [prev_rev]\n";
    exit;
}

my $target_rev = shift || usage();
my $prev_rev   = shift || $target_rev - 1;
my $diff_arg = "-r " . $prev_rev . ":" . $target_rev;

my $log  = `svn log -r $target_rev`;
my $diff = `svn diff $diff_arg`;

print $log . $diff;

このスクリプトを実行すると、以下のような結果が得られる。上部にコミットのログ、それに続いてdiffの結果が表示される。たったこれだけのことでも、コードの差分を追いかけやすくなると思う。

% svndiff 5
------------------------------------------------------------------------
r5 | autrijus | 2005-02-07 09:14:52 +0900 (Mon, 07 Feb 2005) | 2 lines

* ingy's patch re: building on osx.
* juerd reported that only \' should escapes in ''.
------------------------------------------------------------------------
Index: Lexer.hs
===================================================================
--- Lexer.hs    (revision 4)
+++ Lexer.hs    (revision 5)
@@ -140,9 +140,9 @@
                         }
                       <?> "literal string")
 
-singleStrChar = quotedQuote <|> noneOf "'"
+singleStrChar = try quotedQuote <|> noneOf "'"
[...]