2010-07-20 40 views
3

使用Windows,Mercurial和extdiff扩展(对于Mercurial)。我试图设置extdiff来使用WinDiff作为外部差异工具,但我认为我已经将问题缩小到足以说明问题在于甚至还没有达到目标。Mercurial/extdiff不会更改为临时目录(因为我认为它应该)

从我所了解的extdiff中,它只是调用你的cmd.winmerge程序,并将必要的目录传递给它。我也工作过这里列出一些假设的(这可能会或可能不准确,我只是学习水银):

http://bitbucket.org/tortoisehg/stable/issue/457/multiple-extdiff-threads-in-one-process-causes-side#comment-36216

它说:

The extdiff (visual diff) extension works like this: 

1-Generate temporary directory(ies) for older changesets 
2-run util.system(cwd=tempdir, "yourdiff tool dir1 dir2") 
    util.system does: 
     2.1 store cwd; 
     2.2 cd tempdir 
3-run your diff tool, wait for it to exit 
4-cd oldcwd 
5-Then finally extdiff deletes the temp directories. 

的麻烦我的意思是extdiff在继续之前似乎没有改变到临时目录中,因为它看起来应该在上面的步骤2.1中进行。

在试图找出问题时,我写了一个批处理文件,以查看cd是什么,传递了什么以及传递的具体方式。批处理文件如下:

@echo off 
echo %cd% 
echo %1 
echo %2 
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2 

然后,我设置了extdiff以使用此批处理文件作为我的extdiff程序。这是有效的,但我发现当它响应%cd%时,它就像预期的那样只是c:\,而不是c:\ temp。我已经验证过extdiff是在临时目录中创建临时文件(因为它应该按照上面的步骤1;类似于c:\ temp \ extdiff.xxxxxx \ someFolder.someChangesetID \ file.ext),所以我知道它是查看这些目录。在调用WinMerge之前,它没有正确地改变它们,所以当打开WinMerge时,它看不到临时文件(因为它不在正确的工作目录中)。

这基本上就是我卡住的地方。我不知道还有什么要离开这里。我想的只是把

cd %tmp% 

在我的批处理文件,但仍然无法抓住它extdiff在创建临时文件的extdiff.xxxxx \子目录

总结::-(


编辑:更改批处理文件

@echo off 
echo %cd%\extdiff* 
echo %1 
echo %2 
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2 

似乎使它的工作(注意改变第二行),但它似乎仍然是一个讨厌的黑客,而不是它应该如何工作。 : - \

编辑:这里是我的Mercurial.ini文件:

[ui] 
username = Tim Skoch <[email protected]> 
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst 

[extensions] 
hgext.graphlog = 
hgext.extdiff = 

[extdiff] 
cmd.winmerge = d:\Documents\apps\mercurial\diff_winmerge.bat 
+0

第一段是指WinDiff(我从Windows SDK中识别),而不是WinMerge。 – 2010-07-20 20:55:40

+0

查看“Mercurial.ini”或“.hg \ hgrc”的相关部分将会很有帮助。 – 2010-07-20 20:56:50

+0

我已经添加了我的Mercurial.ini文件;我认为没关系,因为它看起来很好(但是我再次发帖寻求帮助,所以我显然不是100%自信)。只是CWD没有得到适当的改变。 – loneboat 2010-07-20 21:32:12

回答

2

我可以证实,extdiff变化到一个临时目录开始您的diff程序之前。您可以使用--debug来查看此。在这里我使用true作为diff程序(它只是存在立刻):

$ hg extdiff -p true --debug 
making snapshot of 2 files from rev 18480437f81b 
    a 
    b 
making snapshot of 2 files from working directory 
    a 
    b 
running "'true' 'foo.18480437f81b' 'foo'" in /tmp/extdiff.IJ9clg 
cleaning up temp directory 

两个参数的比较程序是目录:旧版本的快照目录和一个新的版本。它们在/tmp/extdiff.IJ9clg临时目录中。

一个令人困惑的一点是,为diff程序的参数依赖于修改的文件的数目是不同的。只需修改一个文件,就不需要创建工作副本的快照。所以,如果a是唯一修改的文件,你会看到

$ hg extdiff -p true --debug 
making snapshot of 1 files from rev 18480437f81b 
    a 
running "'true' '/tmp/extdiff.mUlnP_/foo.18480437f81b/a' '/home/mg/tmp/foo/a'" 
in /tmp/extdiff.mUlnP_ 
cleaning up temp directory 

这里diff程序启动两个文件作为参数。如hg help -e extdiff中所述,您可以使用一些变量来构建命令行。默认对应于0​​。

你说的WinMerge“不能正确找到文件”。有关于WinMerge的other questions and answers on SO,他们似乎有它工作得很好。也许你可以尝试他们的命令行选项。

相关问题