ひさびさに VSS から SVN への移行タスクが入ってきて、vss2svn.exe を試そうとしたけど、やっぱり挫折したとかそういう話。
Twitter でたまにつぶやいてた内容とほぼ同じですが、もう少し詳しいことも書いてます。
経緯
本番サーバ上のファイルは SVN に格納済だけど、DLL の元になった .cpp ファイルは SVN に入れていない状態だそうで。.cpp のソース部分だけを VSS から SVN に移行したいとのこと。
以前は vss2svn の 0.3 系(vss2svn.pl)を使ってたんだけど、今回は VSS をインストールしていなくても使える 0.10 以降のバージョン(vss2svn.exe)
を試してみようかなと。ダウンロードしたバージョンは 0.11.0。
特定のパスを抽出できないの?
で、早速使おうとしたんだけど・・・VSS のリポジトリ全体を SVN に移行する使い方を想定しているらしく、VSS 内のプロジェクトを指定するオプションがない。
によると、svnadmin dump 形式で出力されるらしいので、必要に応じて svndumpfilter で抽出することはできるみたいだけど。今回は巨大なリポジトリのごく一部を取り出したいわけで、ちょっと向いてない。
ソースをちょっといじれば特定のパスだけ抽出できないかな?と期待したんだけど、ソースを斜め読みした感じだとそれは難しいらしい。というのも、
- VSS は /hoge/fuga というようなパスがある場合、hoge と fuga が独立したデータとして格納する
- それぞれのデータにはそのファイル/フォルダのフルパスに関する情報は含まれていない
- vss2svn.exe(正確にはさらに内部で使われている ssphys)はこの生データを参照する
という話みたいで。結局全部のデータを取ってきたあとでしか、フィルタリングは行えないということになりそう。それじゃ意味ない。
日本語の問題は?
それ以外の問題として、日本語の扱いがうまくいかないらしい。
こちらで
vss2svn.plのDoSsCmd関数を見れば分かるが、windows-1252しかサポートしてないっぽい。
とあるけど、その処理は
# allow all characters in the windows-1252 codepage: see http://de.wikipedia.org/wiki/Windows-1252 $gSysOut =~ s/[\x00-\x09\x11\x12\x14-\x1F\x81\x8D\x8F\x90\x9D]/_/g; # just to be sure
みたいな感じで、Windows-1252 で使用されないコードを落としている。
これくらいなら改造の余地はありそうなんだけど、文字コードの定義ファイルである windows-1251.xml を見てみると、
<encmap name='windows-1251' expat='yes'> <range byte='x80' len='2' uni='x0402'/> <ch byte='x82' uni='x201a'/>
という感じで、マルチバイト文字は考慮されていない気がする。さらに、内部で使っている TinyXml は Shift_JIS をサポートしていないという話。もし改造するなら、UTF-8 に変換をかけてやるのが楽そう。
そんなこんなで
今回は vss2svn.exe でがんばる必要もないし、時間も限られていたので旧バージョンでやることに。次回はたぶんその辺の話。