1

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

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

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

我知道 hg 缺少 git 的“管道”命令的等价物,但我什至找不到提供我正在寻找的东西的 python API。

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

4

4 回答 4

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方法已记录在案。

于 2014-03-27T13:30:49.223 回答
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.
于 2016-08-04T13:14:37.367 回答
0

hg id -B在现有书签的情况下仅返回书签名称,什么都没有 - 如果书签不存在

于 2014-03-27T12:49:52.653 回答
0

按照 Martin Geisler 的回答和这篇文章,这里有一个适用于 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
于 2014-03-28T09:25:46.487 回答