2014-03-27 38 views
1

我想自動將活動書籤名稱(如果有)添加到提交消息中。在不解析命令輸出的情況下訪問活動書籤名稱?

我發現this method做一個pre-commit鉤子類似的東西。但是它使用分支名稱,這是冗餘的,因爲命名分支是元數據的一部分。我想代之以活動書籤。在本例中使用

內部API方面似乎並沒有持有書籤信息(見MercurialApi)。使用hglib我可以得到hg bookmarks的結果,然後解析它,找到*的行,修剪到右欄......這很醜。

據我所知,汞缺乏Git的「管道」命令的等效的,但我甚至無法找到一個Python API,提供什麼我要找的。

是書籤由內部API管理(如果是的話,哪裏是醫生?),或如何避免解析解決方案?

回答

1

我相信你可以使用Python-hglib:

import hglib 
client = hglib.open('.') 
bookmarks, active = client.bookmarks() 
if active == -1: 
    print 'no active bookmark' 
else: 
    print 'active bookmark:', bookmarks[active][0] 

的混亂可能是,在MercurialAPI wiki頁面上記錄的API是內部的 API。由python-hglib提供的API顯然沒有真正記錄在任何地方,除了在庫的代碼中。例如,記錄了bookmarks method

0

hg id -B在現有書籤回報書籤名稱的情況下而已,沒有什麼 - 如果書籤不存在

+0

謝謝,但我只是檢查,如果有兩個書籤,改變活動一個不會改變'汞ID -B'的輸出。 – Shadok

0

繼馬丁·蓋斯勒的答案,this post,這裏是在Windows上運行的掛鉤:

hgrc

[hooks] 
precommit.bookmark = python:/path/to/hg-hooks.py:prefix_commit_message 

hg-hooks.py

import sys, mercurial 

## to be accepted in TortoiseHg, see http://tortoisehg.bitbucket.io/manual/2.9/faq.html 
sys.path.append(r'C:\Python27\Lib\site-packages') 
import hglib 

def _get_active_bookmark(path): 
    '''Return the active bookmark or None. 
    ''' 
    client = hglib.open(path) 
    bookmarks, active = client.bookmarks() 
    if active == -1: 
     return None 
    else: 
     return bookmarks[active][0] 


### 
### Available hooks 
### 

def prefix_commit_message(ui, repo, **kwargs): 
    '''Prepend [active bookmark name] to commit message. 
    ''' 
    commitctx = repo.commitctx 

    def rewrite_ctx(ctx, error): 
     book = _get_active_bookmark(repo.root) 
     if book: 
      old_text = ctx._text 
      if not old_text.lstrip().startswith("["): 
       ctx._text = "[" + book + "] "+ old_text 
     return commitctx(ctx, error) 

    repo.commitctx = rewrite_ctx 
1

對於命令行用法/ shell掛鉤,使用這個命令打印活動書籤名稱或空字符串。

hg log -r . -T '{activebookmark}' 

活動書籤始終在當前提交中(否則它將處於非活動狀態)。日誌模板變量activebookmark將打印活動書籤(如果與變更集關聯)。無論是否有活動書籤,您都將獲得退出代碼0(成功),但打印的字符串會有所不同。例如會話:

$ hg bookmark myfeature 
$ hg log -r . -T '{activebookmark}' 
myfeature 
$ hg bookmark --inactive 
$ hg log -r . -T '{activebookmark}' 

$ # We got an empty line. 
相關問題