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

标签 mercurial mercurial-hook

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

.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 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

但是当我(在启用上部 pretxnchangegroup 钩子(Hook)的情况下推送到存储库时:

  $ 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 标签!

最佳答案

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

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

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

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

关于Mercurial hook 用于设置标签名称策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746881/

相关文章:

Mercurial:从远程仓库获取分支的最新主版本

git - 如何使用 SourceTree 更新我的 fork 存储库?

version-control - 使用 Mercurial Hook 创建/加载数据库转储以进行版本控制

mercurial - tortoisehg 一步提交推送 - 如何以及日志文件在哪里

mercurial - 如何与所有其他开发人员共享 mercurial 中的 commit-hook?

Mercurial 更新到本地修订或哈希变更集

macos - 我如何将 Mercurial 集成到 Coda 中?

version-control - 在 Mercurial 中使用多个远程位置进行推拉

python - Pylint 无法在 mercurial 预提交 Hook 上加载插件

mercurial - 暂时禁用钩子(Hook)?