TortoiseSVN+WinMerge で半角スペースを含むファイルを diff できない件→xdocdiff が原因でした
※早とちりしていましたので 19:30 くらいに全面的に書き直しました
TortoiseSVN から WinMerge を呼び出して diff を取ろうとすると、
問題が発生したため、WinMerge Application を終了します。 ご不便をおかけして申し訳ありません。
のように言われてしまうケースがあったので原因を調べてみました。
現象
WinMerge インストール時に TortoiseSVN の diff コマンドが
D:\WinMerge\WinMergeU.exe -e -ub -dl %bname -dr %yname %base %mine
のように設定されるわけですが、ファイル名(%base、%mine)が自動的にダブルクォートで囲まれる一方で、タイトル文字列(%bname と %yname)はダブルクォートで囲まれないのでエラーになってしまっているようです。
対策(まちがい)
TortoiseSVN の設定(External Programs→Diff Viewer→External)で %bname と %yname を
D:\WinMerge\WinMergeU.exe -e -ub -dl "%bname" -dr "%yname" %base %mine
のようにダブルクォートで囲んでしまえば、ちゃんと動作するようになった・・・と思ってたんですが、うまくいくのは .xls ファイルとかだけで、逆に .txt ファイル等でエラーになってしまいました。
もっと調査
TortoiseSVN で設定したとおりに WinMerge が呼ばれていたのでてっきり TortoiseSVN が直接 WinMerge を呼び出していると思ったんですが、.xls ファイルは xdocdiff を呼び出すように設定されていて。
xdocdiff 内部では
- 受け取ったファイルを xdoc2txt で txt に変更
- TortoiseSVN で設定されている diff ツールの情報を取得する
- 取得した diff ツールの %base 等を変換後の txt ファイル名に置き換えて実行
というようなことをやっているみたいで。
ここで %base と %mime のクォート処理が抜けているのがエラーの原因のようなので、xdocdiff の ゲストブック に要望を出しておきました。(承認制なので現時点では見られませんが・・・)
とりあえずの回避策
もし比較したいファイルがすべて xdocdiff で対応可能な形式であれば、上記のとおり TortoiseSVN の diff ツール設定で %base と %yname をダブルクォートで囲んでしまえばよいです。
まあふつうはそんな環境ではないでしょうから、xdocdiff を使うのはあきらめて、
を使って diff を取得するのがいいと思います。