访问活动书签名称而不解析命令输出?

时间:2014-03-27 11:50:47

标签: mercurial mercurial-api

我想自动将活动书签名称(如果有)添加到提交消息中。

我发现this method做了类似预提交钩子的事情。但是它使用分支名称,这是多余的,因为命名分支是元数据的一部分。我想要活动书签。

此示例中使用的内部API上下文似乎不包含书签信息(请参阅MercurialApi)。使用hglib我可以得到hg bookmarks的结果,然后解析它,找到带有*的行,修剪到右栏......那很难看。

我知道hg缺少相当于git的“plumbing”命令,但我甚至找不到提供我正在寻找的python API。

书签是否由内部API管理(如果是,doc在哪里?)或者如何避免解析解决方案?

4 个答案:

答案 0 :(得分: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被记录在案。

答案 1 :(得分: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.

答案 2 :(得分:0)

hg id -B如果现有书签只返回bookmark-name,则没有 - 如果书签不存在

答案 3 :(得分:0)

按照Martin Geisler的回答和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