Mercurial hook 用于设置标签名称策略

2024-04-08

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

.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
  

如何进行此检查预交换组 hook?

我尝试编写这段代码:



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
  

但是当我(用上层推送到仓库时预交换组启用钩子:



  $ 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 tag!


*解释问题:为什么不rev.tags()返回gg tag?

rev.tags()不返回gg标签,因为您推送的修订版上没有该标签。默认情况下hg tag将标记工作目录的父目录。新的变更集仅添加到.hgtags文件。该标签已添加到两个存储库已有的变更集中。尝试做出一些改变并承诺,then对其进行标记,以便您推送 2 个变更集,其中一个变更集带有错误标签。

此外,由于标记的工作方式,您实际上不会知道哪个版本上有该标记。新的变更集可能会在更早的变更集上添加标签。也许查看某人是否推送了错误标签的更好方法是检查新变更集所做的任何添加.hgtags.

如果您解析更改为.hgtags,您需要正确解析这些更改,这样您就不会从删除标签的条目中得到误报。您还需要收集不良标签的完整列表,而不是在第一次发现时就中断。您可能会找到添加标签的行gg更改集,但后来有两行将其删除,这也应该删除您的查找并允许钩子成功通过,因为这意味着用户在推送之前删除了错误标签。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mercurial hook 用于设置标签名称策略 的相关文章

随机推荐