2010-03-16 40 views
6

我一直在試圖如何訪問Mercurial進程內掛鉤中的提交消息?

def debug_hook(ui, repo, **kwargs): 
    changectx = repo[None] 
    ui.status('change.desc: %s\n' % changectx.description()) 
    return True 

但它始終打印一個空字符串。這是因爲它是一個precommit鉤子,並且該消息尚未提供?還是我錯過了一些明顯的東西?

回答

2

我認爲你是對的,在precommit消息還不存在。如果您使用prexxcommit它會,但我不是100%確定它在什麼時候可以做,因爲交易幾乎完成。

+0

事實證明,這是答案的一部分(使用prexxcommit)。我會發佈一個答案的細節。 – davidavr

8

原來有兩件事情錯了我最初的方法:

  1. 作爲JK指出的那樣,precommit事件發生前的承諾,以便爲正在處理提交的元數據不存在然而。通過使用pretxncommit來代替,元數據存在,但事務尚未提交到數據庫。
  2. 使用changectx = repo[None]可爲您提供工作目錄的更改上下文。但是我們想要使用當前提交的信息,所以使用changectx = repo['tip']來代替最新的元數據。

請注意,如果您使用changectx = repo['tip']precommit事件,你就會得到最後一次提交處理,而不是當前您正在使用的一個。

+0

是的,雖然「這個掛鉤可以訪問與幾乎是新的變更集關聯的元數據,但是它不應該對這些數據做任何永久性處理,它也不能修改工作目錄。 –

+2

這就是爲什麼在堆棧溢出時鼓勵詢問和回答自己的問題的原因。一年多後,這個答案對我來說非常有幫助,因爲我正在瀏覽可用於HG API的[非常稀少的文檔](http://mercurial.selenic.com/wiki/MercurialApi)。 –