【发布时间】:2010-07-20 18:41:01
【问题描述】:
使用 Windows、Mercurial 和 extdiff 扩展(用于 Mercurial)。我试图设置 extdiff 以将 WinDiff 用作外部差异工具,但我认为我已经将问题缩小到足以说问题是在我还没走到那一步之前。
根据我对 extdiff 的理解,它只是调用您的 cmd.winmerge 程序,并将必要的目录传递给它。我也在处理这里列出的一些假设(可能准确也可能不准确;我只是在学习 Mercurial):
上面写着:
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 <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
【问题讨论】:
-
第一段指的是 WinDiff(我从 Windows SDK 中认出),而不是 WinMerge。
-
查看
Mercurial.ini或.hg\hgrc的相关部分会很有帮助。 -
我已经添加了我的 Mercurial.ini 文件;我认为这没关系,因为它似乎称它很好(但话又说回来,我在发帖寻求帮助,所以我显然不是 100% 有信心)。只是 CWD 没有正确更改。
-
我安装了 WinMerge 并让它正常工作。我的 Mercurial.ini 条目有:
cmd.winmerge=c:\work\tools\winmerge\winmergeu.exe,使用hg winmerge调用。我使用 Beyond Compare 并且我不能同时打开两个比较会话,因此您可能会检查您是否没有留下杂散的 WinMerge 进程。除此之外,我没有想法,抱歉。
标签: windows command-line mercurial batch-file winmerge