Ab.の日記: cvs2svn で shift_jis ベースの C++ プロジェクトを svn に移行
今回、trac で更新履歴がブラウズ出来ることが目的の一つなのですが、困ったことに auto-props では ; の文字をプロパティ内に設定できません(; がセパレータに使用されていてエスケープする手段が無い)
trac のデフォルトキャラクタセットを設定するのは美しくないので却下です。
http://members.at.infoseek.co.jp/sakura_editor/cvs2svn.html を参考にしようかななどとも考えたのですが、手元の cvs2svn は /usr/local/lib/python2.5/site-packages/cvs2svn_lib/ とかそんな中にばらばら細切れになってしまっていて、どうもローカルパッチを当てる気分にはなりません。
そんなこんなでどうしようかなーと cvs2svn のコマンドラインオプションを眺めていたら --dumpfile なんてものを見つけてピンと来たので別の方法で解決してみました。
とりあえず作業手順を後世の自分のためにメモ。
まずは何はともあれダンプして眺めてみます。
CVSROOT が無いと cvs2svn が怒るので移行するモジュールと CVSROOT を作業用にコピー
# cd /tmp
# mkdir x
# cp -r /cvs/foo /cvs/CVSROOT x
# cvs2svn --dumpfile=/tmp/svn.dump --trunk-only --encoding=cp932 --encoding=iso2022_jp --encoding=euc_jp --encoding=utf_8 --encoding=utf_8_sig x/foo
lv svn.dump
dump のここらへんを見て何とかなりそうだと確信(説明は不要ですね?)
K 8
svn:date
V 27
2003-12-02T07:59:39.000000Z
K 7
svn:log
V 52
Standard project directories initialized by cvs2svn.
PROPS-END
auto-props パターンを書くために、使われている拡張子と、拡張子無しのファイルのリストアップ
# find foo -type f -print | sed -e 's/^[^.]*//' -e 's/,v$//' | sort | uniq
.cpp
.cvsignore
.h
.ico
.msi
.pl
.rc
.rc2
.sln
.vcproj
.vdproj
# find foo -type f "!" -name "*.*" -print | sed -e 's/^.*\///' -e 's/,v$//' | sort | uniq
ChangeLog
Makefile
拡張子毎に念のためファイルを開いて文字コードを確認しつつ auto-props の設定を書きます。
mime-type の中身は /usr/local/lib/python2.5/site-packages/trac/mimeview/api.py あたりを参考にします。
;charset= とは書けないので |charset= にしておきます。
# emacs x/cvs2svn.config
# cat x/cvs2svn.config
[auto-props]
*.cpp = svn:mime-type=text/x-c++src|charset=SHIFT_JIS
*.h = svn:mime-type=text/x-c++hdr|charset=SHIFT_JIS
*.ico = svn:mime-type=image/x-icon
*.pl = svn:mime-type=text/x-perl
*.rc = svn:mime-type=text/plain|charset=SHIFT_JIS
*.rc2 = svn:mime-type=text/plain|charset=SHIFT_JIS
*.sln = svn:mime-type=text/plain|charset=SHIFT_JIS
*.vcproj = svn:mime-type=text/xml|charset=SHIFT_JIS
*.vdproj = svn:mime-type=text/plain|charset=SHIFT_JIS
.cvsignore = svn:mime-type=text/plain
Makefile = svn:mime-type=text/x-makefile
ChangeLog = svn:mime-type=text/plain|charset=SHIFT_JIS
もう一度 dump
# cvs2svn --dumpfile=/tmp/svn.dump --trunk-only --encoding=cp932 --encoding=iso2022_jp --encoding=euc_jp --encoding=utf_8 --encoding=utf_8_sig --auto-props=cvs2svn.config x/foo
出来た dump の中身のプロパティ部分はテキストで、文字数が変わらなければ単純に置換可能と推測したので、置換を試みます。
まずはそれっぽいところが正しく置換できるかと誤爆が無いかの確認。
svn.dump は4Mbyte程度と小さかったので emacs で incremental search をして目視で ^text/ で問題ない事を確認しましたが、目視で確認が不可能なくらい巨大なプロジェクトでもしかすると偶然引っかかる場合が無いとも限らない場合は svn:mime-type= の部分を svn:fake-type= 等と変えてみて出現位置が両者で同じかどうか確認するなどのチェックが必要でしょうか。
--auto-props 無しで dump させてみて、マッチする箇所がないかをチェックする方が良いかな。
# grep -a "|charset=" svn.dump | sed 's/^\(text\/.*\)|\(charset=.*\)/\1;\2/' | sort | uniq
text/plain;charset=SHIFT_JIS
text/x-c++hdr;charset=SHIFT_JIS
text/x-c++src;charset=SHIFT_JIS
text/xml;charset=SHIFT_JIS
そして、svn:mime-types が正しく設定された dump file を生成
# sed 's/^\(text\/.*\)|\(charset=.*\)/\1;\2/' svn.dump > svn.dump2
foo 用のディレクトリを svn repository に作成(無いと load が失敗するので作っておく)
# svn mkdir file:///svn/svn-repository/foo -m "mkdir foo"
dump を流し込む
# svnadmin load --parent-dir foo /svn/svn-repository < svn.dump2
以上で出来上がりです。
cvs2svn で shift_jis ベースの C++ プロジェクトを svn に移行 More ログイン