RedmineでCVSとSVNのコミットコメントの文字コードが違う場合の対処
現在うちで使っているメインのバージョン管理ツールは SVN(Subversion) だが、過去の案件で CVS を使っているものがある。
開発が活発に続いているものは、タイミングをみて SVN へ移行してきたのだが、ひそやかに保守が続いていて、そこまでコストをかけられないものは CVS のままという状況だ。
SVN から GIT などの分散リポジトリも使ってみようということになり、今までは、SVN+Trac だったのを、Redmine に移すことにした。
(Redmine を CakePHP へ移植している candycane も考えてみたのだが、ちょっとまだ実務に投入するのは怖いかなぁと。。)
せっかく Redmine にするのであれば、CVSの案件もまとめて管理をしようということになり、追加をしようとしたが、CVSのバージョンが古くてリポジトリの追加ができなかった。
Redmine では、CVSのリポジトリを参照するのに rls というコマンドを使用しているのだが、これが、yum などで入れたバージョンでは使えないのでした。
そこで、ローカルのサーバで CVS の環境を構築して、実際にアップデートしてみてテストを行った。
役に立ったサイト。
http://www.sea-bird.org/doc/Linux/cvs_pserver.html
http://www.sea-bird.org/pukiwiki/index.php?CVS%2FCVS%A5%B5%A1%BC%A5%D0%A4%CE%C0%DF%C4%EA%A4%CE%B4%AC
http://www.asahi-net.or.jp/~wv7y-kmr/memo/cvsserver.html#cvsaccess
アップデートのログ
# 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
コミットコメントの文字化け対処
CVS 登録直後は、リポジトリは参照出来るのだが、以下のコマンドを動かしてコミットログを取得すると動かなくなる
ruby /phat/to/script/runner "Repository.fetch_changesets" -e production
CVS を redmine に登録すると、コミットログが文字化けしてしまい、文字化け状態だとリポジトリが開けないという状況になってしまいました。
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 を再実行でコミットコメントも文字化けせずに取得できました。