RedmineでCVSとSVNのコミットコメントの文字コードが違う場合の対処

現在うちで使っているメインのバージョン管理ツールは SVN(Subversion) だが、過去の案件で CVS を使っているものがある。
開発が活発に続いているものは、タイミングをみて SVN へ移行してきたのだが、ひそやかに保守が続いていて、そこまでコストをかけられないものは CVS のままという状況だ。


SVN から GIT などの分散リポジトリも使ってみようということになり、今までは、SVN+Trac だったのを、Redmine に移すことにした。
RedmineCakePHP へ移植している candycane も考えてみたのだが、ちょっとまだ実務に投入するのは怖いかなぁと。。)
せっかく Redmine にするのであれば、CVSの案件もまとめて管理をしようということになり、追加をしようとしたが、CVSのバージョンが古くてリポジトリの追加ができなかった。


Redmine では、CVSリポジトリを参照するのに rls というコマンドを使用しているのだが、これが、yum などで入れたバージョンでは使えないのでした。
そこで、ローカルのサーバで CVS の環境を構築して、実際にアップデートしてみてテストを行った。

アップデートのログ

# cd /usr/local/src
# wget http://ftp.gnu.org/non-gnu/cvs/binary/feature/x86-linux/RPMS/i386/cvs-1.12.12-ximbiot.1.i386.rpm
# rpm -qa | grep cvs
cvs-1.11.2-10
# rpm -Uvh cvs-1.12.12-ximbiot.1.i386.rpm
Preparing...                ########################################### [100%]
   1:cvs                    ########################################### [100%]
# rpm -qa | grep cvs
cvs-1.12.12-ximbiot.1


これで無事に Redmine から CVSリポジトリが参照できました。

コミットコメントの文字化け対処

CVS 登録直後は、リポジトリは参照出来るのだが、以下のコマンドを動かしてコミットログを取得すると動かなくなる

ruby /phat/to/script/runner "Repository.fetch_changesets" -e production

CVSredmine に登録すると、コミットログが文字化けしてしまい、文字化け状態だとリポジトリが開けないという状況になってしまいました。
http://redmine.jp/faq/repository/shift_jisutf-8/
このあたりの対応とか、リポジトリ消して作り直しとかしてるんですけどねぇ。。。


いろいろ確認したところ、
管理>設定>リポジトリ
コミットメッセージのエンコーディング = Shift_JIS
にすれば、CVSは文字化けせずに表示できるが、SVNが文字化けをする


めんどくさいので、CVSの時だけ nkf を通して文字コードutf-8になるようにパッチ当てちゃいました。

/path/to/redmine/lib/redmine/scm/adapters/cvs_adapter.rb のファイルです。

--- cvs_adapter.rb.bk   2010-02-26 19:23:10.000000000 +0900
+++ cvs_adapter.rb      2010-02-26 19:24:03.000000000 +0900
@@ -66,6 +66,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} rls -e"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)
@@ -111,6 +112,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} rlog"
           cmd << " -d\">#{time_to_cvstime(identifier_from)}\"" if identifier_from
           cmd << " #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           shellout(cmd) do |io|
             state="entry_start"

@@ -230,6 +232,7 @@
           logger.debug "<cvs> diff path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
           path_with_project="#{url}#{with_leading_slash(path)}"
           cmd = "#{CVS_BIN} -d #{root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -247,6 +250,7 @@
           cmd = "#{CVS_BIN} -d #{root_url} co"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " -p #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           cat = nil
           shellout(cmd) do |io|
             cat = io.read
@@ -260,6 +264,7 @@
           logger.debug "<cvs> annotate path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
           cmd = "#{CVS_BIN} -d #{root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
+          cmd << " | nkf -Sw"
           blame = Annotate.new
           shellout(cmd) do |io|
             io.each_line do |line|


これで、すでに文字化けているリポジトリは削除して再設定し、script/runner を再実行でコミットコメントも文字化けせずに取得できました。