miauのブログ

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

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 を取得するのがいいと思います。