在不解析命令输出的情况下访问活动书签名称



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

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

在这个例子中使用的内部API上下文似乎没有保存书签信息(参见MercurialApi)。使用hglib我可以得到hg bookmarks的结果,然后解析它,找到与*的行,修剪到正确的列…这是丑陋的。

我知道hg缺少类似git的"管道"命令,但是我甚至找不到一个python API提供我正在寻找的东西。

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

我相信你可以使用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方法有文档说明,例如

对于命令行用法/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.

hg id -B在已有书签的情况下只返回bookmark-name,如果书签不存在则不返回任何内容

根据Martin Geisler的回答和这篇文章,这里是一个适用于Windows的钩子:

in hgrc:

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

and in 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:Python27Libsite-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

最新更新