Mercurial hook用于设置标记名称的策略

时间:2011-07-19 12:09:24

标签: mercurial mercurial-hook

我编写(进程内)钩子以防止在本地添加BAD标记名称:

.hg / hgrc

pretag.badtagname = python:.hg/hgcheck.py:localbadtag

.hg / hgcheck.py

goodtag_re = r'(ver-\d+\.\d+\.\d+|tip)$'
def localbadtag(ui, repo, hooktype, node, **kwargs):
    assert(hooktype == 'pretag')
    re_ = re.compile(goodtag_re)
    if not re_.match(tag):
        ui.warn('Invalid tag name "%s".\n' % tag)
        ui.warn('Use one of tip, ver-xx.xx.xx\n')
        return True
    return False

如何检查 pretxnchangegroup 挂钩?

我尝试编写此代码:

def pushbadtag(ui, repo, hooktype, node, **kwargs):
    assert(hooktype == 'pretxnchangegroup')
    re_ = re.compile(goodtag_re)
    for rev in xrange(repo[node].rev(), len(repo)):
        ui.warn('rev: %d\n' % rev)
        for tag in repo[rev].tags():
            ui.warn('tag: ' + tag + '\n')
            if not re_.match(tag):
                ui.warn('Invalid tag name "%s" for rev: "%s".\n' % (tag, rev))
                ui.warn('Use one of tip, ver-xx.xx.xx\n')
                return True
    return False

但是当我(推送回到上面的 pretxnchangegroup 钩子启用时:

  $ hg tag gg
  $ hg push -f
pushing to /cygdrive/d/home/tmp/hg/good
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
rev: 35
tag: tip

你可以看到rev.tags()不会返回 gg 标签!

1 个答案:

答案 0 :(得分:3)

*解释的问题:为什么rev.tags()没有返回gg代码?

rev.tags()未返回gg标记,因为您推送的修订版本上没有该标记。默认情况下,hg tag将标记工作目录的父级。新变更集仅添加到.hgtags文件。该标签已添加到repos已经拥有的变更集中。尝试进行一些更改并提交,然后标记,以便您推送2个更改集,其中一个将包含错误标记。

此外,由于标记的工作方式,您实际上不会知道哪个修订版上有标记。新的changsets可能会在更早的变更集上添加标记。也许更好的方法是看某人是否推出了一个不好的标签,就是检查新的变更集对.hgtags所做的任何补充。

如果您将更改解析为.hgtags,则需要正确解析这些更改,以免从删除标记的条目中获得误报。您还需要收集完整的错误标签列表,而不是打破第一个查找。您可能会找到一个向变更集添加标记gg的行,但后来有2行删除它,这也应该删除您的查找并允许挂钩成功通过,因为这意味着用户在推送之前删除了它们的错误标记