2015-04-15 27 views
0

我正在處理Mercurial的一個提交鉤子,並遇到相對路徑問題。如何從hg鉤子獲取命令的工作目錄?

說我的鉤子想看看提交的文件的內容,並警告是否有包含短語「xyzzy」。然而,用戶已決定把從一個子文件夾提交,並通過在文件作爲模式的名稱...

C:\clone\subdir> hg commit file.txt -m 'test' 

我的鉤被調用C:\克隆作爲工作目錄,但HG_PATS包含簡單的file.txt沒有subdir \前綴。我怎樣才能得到hg命令本身的工作目錄?我找不到在文檔中執行此操作的方法。

我能想出如何得到它的唯一方法是查找進程樹來查找第一個hg.exe並獲取其工作目錄。但是這不能完全移植到其他操作系統上。 (我知道我可以寫一個擴展,但是真的想避免這種情況。)

+0

這個鉤子是怎麼寫的,批處理文件,powershell,python? – Nanhydrin

+0

它是perl,但重要的是它掛鉤了[鉤子],它以工作目錄作爲回購根啓動進程並且不傳達工作目錄是什麼。 – scobi

回答

0

感謝您的答覆和評論,但經過一些更多的研究後,我確定沒有乾淨的方式來做我想要的外部鉤子。我確實實施了我在我的問題中提到的CWD破解。不是很多代碼,但相當討厭,在Windows上,它需要通過tlist.exe無法訪問外部進程CWD。它可以工作,但是...。

正確的做法似乎是編寫一個in-process hook(示例庫hghooklib)。通常的版本控制告誡在寫入任何擴展時都適用,儘管我認爲對於我們的鉤子來說,與hg的接口非常簡單,以至於我們都可以。在我的問題中,我提到我不想寫一個擴展,但我想像一個像hgeol一樣的完全擴展。一個帶有單個函數入口點的僅帶鉤子的擴展感覺更受限制和簡單,這是我想在這一點上。)

1

如果您使用pretxncommit掛鉤,那麼你會得到$HG_NODE這是提交ID,但提交尚未確定在那一點,所以你仍然可以返回1來取消它。

那麼你可以使用

hg log -r $HG_NODE --template '{files}' 

得到的文件在提交名單,和它給你全相對於回購根路徑。

這不完全是你以後的事情,但它可能讓你足夠接近,讓你做你想要的內容檢查。

+0

該問題在問題中被簡化了一點 - 該鉤子還允許用戶選擇自動修復(例如標籤<->空格)。我認爲這是需要預先提交的,因爲哈希值會改變。 – scobi

+0

我看到了,你想自動執行操作,然後繼續進行提交。我能想到的唯一的其他選擇就是在預提交鉤子上執行該操作,並僅處理工作目錄中所有已更改的文件,因爲您無法獲取提交的特定文件。 – Nanhydrin

+0

是的,這也是一位同事的建議,直到我可以將我的CWD移出實驗狀態,這就是我們必須要做的。問題是,這種行爲可能會讓人非常驚訝(「爲什麼它會混淆我不提交的文件?」),所以我臨時發出警告,提醒用戶在指定鉤子仍然適用的模式時提醒用戶所有修改的文件。 – scobi

相關問題