我想自动将活动书签名称(如果有)添加到提交消息中。
我发现this method做了类似预提交钩子的事情。但是它使用分支名称,这是多余的,因为命名分支是元数据的一部分。我想要活动书签。
此示例中使用的内部API上下文似乎不包含书签信息(请参阅MercurialApi)。使用hglib我可以得到hg bookmarks
的结果,然后解析它,找到带有*
的行,修剪到右栏......那很难看。
我知道hg缺少相当于git的“plumbing”命令,但我甚至找不到提供我正在寻找的python API。
书签是否由内部API管理(如果是,doc在哪里?)或者如何避免解析解决方案?
答案 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