2005年11月03日

SVNとSJISとUTF8

別件でblogを用意することにしたのだが、今のblosxomはUTF-8で処理するようになってる。SJISに変えるのもいろいろやってみた限りではなんか面倒そうだったので、SVNにSJISでコミットしたあとにUTF-8変換してentriesに配備するフックをかけるようにした。

SVNのpost-commitはこんな感じ。

REPOS="$1"
REV="$2"
cd 〜/checkout
svn update
LANG=C svnlook changed -r "$REV" "$REPOS" | sync.pl

svnlookの結果を受けるsync.pl。ひどいコードだが(mkdirやrm -rはピュアPerlコードにしてもいいっちゃいいんだけど)、まぁ動くか。サーバ側では何もコミットされないという前提なので、フラグはA、D、Uしか見てない。

#!/usr/bin/perl
$base = "〜/blosxom/entries";
$org = "〜/checkout";

while (<>) {
  chomp;
  my($tag, $f) = split(/\s+/, $_, 2);
  if ($f =~ /.*\/$/) {
    # Directory
    if ($tag eq 'A' && ! -d "$base/$f") {
      system("mkdir -p $base/$f");
    } elsif ($tag eq 'D' && -d "$base/$f") {
      system("rm -r $base/$f");
    }
  } else {
    # File
    if ($tag eq 'A' || $tag eq 'U' && -f "$org/$f") {
      system("nkf --utf8 $org/$f > $base/$f");
    } elsif ($tag eq 'D' && -f "$base/$f") {
      unlink("$base/$f");
    }
  }
}