LoginSignup
0
0

More than 5 years have passed since last update.

TortoiseHgのdocdiffって、Excel比較で必ずエラーになるよね。

Last updated at Posted at 2017-03-07

 とりあえず、自分用メモ。TortoiseHg 4.1(Windows x64)でのお話。

WinでTortoiseHgな私は、以前から気になっていた事が...

「Excel比較、なんかエラー出るだけで使えないんですけど!!」

 イチイチdiffツールの選択画面が出てきて、Excel関連のファイルだとデフォルトでdocdiffが選択されるのもげんなり...

 という事で、ちょっくらちょっといじってみることに。

デフォルト設定群は hgrc.d にあるのだ

 デフォルトのconfigは、TortoiseHgインストールフォルダ以下の、 hgrc.d 以下にワラワラ落ちている。ReadOnlyなので、attrib外さないと編集できません。

 デフォルトのマージツールを指定しているのは、MergePatterns.rcというファイルなので、ここに記述されているExcel関連ファイルの指定(**.xlsx=docdiff とか)をコメント化してしまうと、docdiffが選択される事は無くなる。

 他にもMergeTools.rcで、それぞれのMerge/Diffツールの挙動やパラメータについての記述がある。

hg showconfig merge-tools

とかやると、ダダダダ~っと出てくるやつら。docdiffの設定はTortoise版のみ入っていて、素のpython版Mercurialには入っていない。ここをいじれば...とも思ったが、docdiffのdiff用argumentは...

MergeTools.rc
docdiff.diffargs=$child $parent

超シンプル。
どこを直せと?

エラー出してるのはdocdiffじゃなくて、比較スクリプトだから!!

 docdiffはpy2exeで固めたpythonスクリプトっぽいが、拡張子に応じてスクリプトを呼び出しているだけ。実際エラーもよく見ればWSHが出している。

 エラーを吐き出すのは処理実体のスクリプトファイル。diff-scripts以下に入ってる。

 なので、そちらを覗いてみる。Excelの比較スクリプトはdiff-xls.jsなので、ソースを眺めてみると...

diff-xls.js
if (objScript.GetBaseName(sBaseDoc) === objScript.GetBaseName(sNewDoc))
{
    Abort("File '" + sBaseDoc + "' and '" + sNewDoc + "' is same file name.\nCannot compare the documents.", "Same file name");
}

って記述が...

ぉぃ。Scripting.FileSystemObject.GetBaseName()ってば、パスと拡張子抜きのファイル名でんがな。TortoiseHgの一時ファイルは[元ファイル名.拡張子]~x1とかだから、これじゃ毎回エラーになって当たり前...

...なので、

diff-xls.js
if (objScript.GetFileName(sBaseDoc) === objScript.GetFileName(sNewDoc))

と、GetBaseName()の代わりにGetFileName()を使えば幸せになれるのでした。
(Tortoise svnは確かBaseName側が変更されて拡張子は変わらない仕様だったので、このスクリプトでも問題なかった)

 これ結構前のバージョンからそうだったと思うんだけど、diff-toolsなんてTortoise svnに入ってたから持ってきたけど、所詮オマケだからテストもしてないんだろか?? TortoiseHgのメニューから呼び出した場合は100%エラーだしね…^^;

 ちなみに、同名ファイルが開けないExcelのためにスクリプトにこんなチェックが入っているワケだけれども、他のスクリプトたちには同名チェックは入っていないと思うので、多分大丈夫。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0