3

使用 Windows、Mercurial 和 extdiff 扩展(用于 Mercurial)。我试图设置 extdiff 以将 WinDiff 用作外部差异工具,但我认为我已经将问题缩小到足以说问题是在我还没走到那一步之前。

根据我对 extdiff 的了解,它只是调用您的 cmd.winmerge 程序,并将必要的目录传递给它。我也在处理这里列出的一些假设(可能准确也可能不准确;我只是在学习 Mercurial):

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.xxxxx\ extdiff 在其中创建临时文件的子目录。

总之: :-(


编辑: 将批处理文件更改为

@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 <my_real@email.address>
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst

[extensions]
hgext.graphlog = 
hgext.extdiff = 

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

1 回答 1

2

我可以确认在启动差异程序之前extdiff 将更改为临时目录。你可以用--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

diff 程序的两个参数是目录:旧版本的快照目录和新版本的快照目录。它们位于/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,您可以使用一些变量来构建命令行。默认对应于$parent $child

您说 WinMerge“无法正确找到文件”。关于 WinMerge还有其他关于 SO 的问题和答案,它们似乎运行得很好。也许您可以尝试他们的命令行选项。

于 2012-01-30T14:05:14.860 回答