2014-03-27 39 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. 
相关问题