svn commit report mail

Rubyのが流行っているらしいが書けないので、素直にPerlで。
当然のように日本語が通らないので修正して使う。


修正する前のは、これを使います。CentOS5.5くらいには入っているはず。
/usr/share/doc/subversion-1.4.2/tools/hook-scripts/commit-email.pl


このスクリプト、驚くべきことに
いわゆるmain()が634行あります。
処理の流れは追いかけやすいかもしれないけれど...


ファイル毎に文字コードが違っていても大丈夫です。


それから、svnlookを起動する際、
システムメッセージ部分は英語(まあ、日本語UTF-8でも良いのだが)で、
コミットログはUTF-8で、
という指示をつけているところがポイントといえばポイントでしょうか。

--- /usr/share/doc/subversion-1.4.2/tools/hook-scripts/commit-email.pl  2009-08-11 06:59:52.000000000 +0900
+++ commit-email.pl     2011-06-09 15:41:36.000000000 +0900
@@ -581,6 +581,16 @@
                                         '-r', $rev, @no_diff_deleted,
                                         @no_diff_added);
         @difflines = map { /[\r\n]+$/ ? $_ : "$_\n" } @difflines;
+
+               # start
+               s/\r\n/\n/ for(@difflines);
+               use Encode;
+               use Encode::Guess qw/cp932 shiftjis euc-jp utf8/;
+               @difflines = (join("\n=", map {
+                       my $decoder = Encode::Guess->guess($_);
+                       if(ref $decoder) { $_ = encode("utf8", $decoder->decode($_)); }
+               } split(/\n=/, join('', @difflines))));
+               # end
       }
 
     if (defined $sendmail and @email_addresses)
@@ -763,6 +773,11 @@
     {
       croak "$0: read_from_process passed no arguments.\n";
     }
+  
+  # start
+  @_ = ("/usr/bin/env", "LC_MESSAGES=C", "LC_CTYPE=ja_JP.UTF-8", @_);
+  # end
+  
   my ($status, @output) = &safe_read_from_pipe(@_);
   if ($status)
     {