我想自动添加活动书签名称(如果有的话)到提交消息
我发现这个方法做一些类似于预提交钩子的事情。但是,它使用分支名称,这是多余的,因为命名的分支是元数据的一部分。我想要活动书签。
在这个例子中使用的内部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