2011-07-19 36 views
2

我寫的(進程)掛鉤,以防止添加本地BAD標籤名稱:水銀鉤上設置標籤名稱政策

.hg/hgrc

 
pretag.badtagname = python:.hg/hgcheck.py:localbadtag 

.hg/hgcheck的.py

 
goodtag_re = r'(ver-\d+\.\d+\.\d+|tip)$' 
def localbadtag(ui, repo, hooktype, node, **kwargs): 
    assert(hooktype == 'pretag') 
    re_ = re.compile(goodtag_re) 
    if not re_.match(tag): 
     ui.warn('Invalid tag name "%s".\n' % tag) 
     ui.warn('Use one of tip, ver-xx.xx.xx\n') 
     return True 
    return False 

如何使這個支票pretxnchangegroup鉤?

我嘗試寫這樣的代碼:

 
def pushbadtag(ui, repo, hooktype, node, **kwargs): 
    assert(hooktype == 'pretxnchangegroup') 
    re_ = re.compile(goodtag_re) 
    for rev in xrange(repo[node].rev(), len(repo)): 
     ui.warn('rev: %d\n' % rev) 
     for tag in repo[rev].tags(): 
      ui.warn('tag: ' + tag + '\n') 
      if not re_.match(tag): 
       ui.warn('Invalid tag name "%s" for rev: "%s".\n' % (tag, rev)) 
       ui.warn('Use one of tip, ver-xx.xx.xx\n') 
       return True 
    return False 

但是當我(推回購與上pretxnchangegroup鉤啓用:

 
    $ hg tag gg 
    $ hg push -f 
pushing to /cygdrive/d/home/tmp/hg/good 
searching for changes 
adding changesets 
adding manifests 
adding file changes 
added 1 changesets with 1 changes to 1 files (+1 heads) 
rev: 35 
tag: tip 

你可以看到,rev.tags()不返回gg標記!

回答

3

*解釋的問題:爲什麼rev.tags()未返回n gg標籤?

rev.tags()不會返回gg標記,因爲您推送的修訂版本上沒有該標記。默認hg tag會標記工作目錄的父項。新的更改集僅添加到.hgtags文件中。該標籤已添加到兩個倉庫已有的變更集中。嘗試進行一些更改和提交,然後然後標記,以便您推送2個更改集,並且其中一個將具有不良標記。

此外,由於標籤的工作方式,您實際上並不知道哪個修訂版上有標籤。新的變化可能會在更早的變更集上添加標籤。也許更好的方式來看看是否有人推出一個不好的標籤是檢查新變更集對.hgtags所做的任何增加。

如果您解析更改爲.hgtags,則需要正確解析這些更改,以免從刪除標記的條目中獲得誤報。您還需要收集不良標籤的完整列表,而不是打開第一個查找標籤。您可能會發現一行將標記gg添加到變更集中,但後來有兩行刪除它,這也會刪除您的查找並允許該鉤子成功通過,因爲這意味着用戶在推送之前移除了其錯誤標記。