2010-07-20 43 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,他們似乎有它工作得很好。也許你可以嘗試他們的命令行選項。

相關問題