miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

vss2svn.exe を試してみる→やっぱりやめ

ひさびさに 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'/>

という感じで、マルチバイト文字は考慮されていない気がする。さらに、内部で使っている TinyXmlShift_JIS をサポートしていないという話。もし改造するなら、UTF-8 に変換をかけてやるのが楽そう。

そんなこんなで

今回は vss2svn.exe でがんばる必要もないし、時間も限られていたので旧バージョンでやることに。次回はたぶんその辺の話。