【问题标题】:Mercurial hook to set policy on tag names用于设置标签名称策略的 Mercurial 钩子
【发布时间】:2011-10-08 11:31:41
【问题描述】:

我编写(进程内)钩子来防止在本地添加 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): 断言(钩子类型 == 'pretag') re_ = re.compile(goodtag_re) 如果不是 re_.match(tag): ui.warn('无效的标签名 "%s".\n' % 标签) ui.warn('使用tip之一,ver-xx.xx.xx\n') 返回真 返回假

如何检查 pretxnchangegroup 钩子?

我尝试编写这段代码:

def pushbadtag(ui, repo, hooktype, node, **kwargs): 断言(钩子类型 == 'pretxnchangegroup') re_ = re.compile(goodtag_re) 对于 xrange 中的 rev(repo[node].rev(), len(repo)): ui.warn('rev: %d\n' % rev) 对于 repo[rev].tags() 中的标签: ui.warn('标签:' + 标签 + '\n') 如果不是 re_.match(tag): ui.warn('无效的标签名 "%s" for rev: "%s".\n' % (tag, rev)) ui.warn('使用tip之一,ver-xx.xx.xx\n') 返回真 返回假

但是当我(在启用了上层 pretxnchangegroup 挂钩的情况下推送回购时:

$ hg 标签 gg $ hg推-f 推送到 /cygdrive/d/home/tmp/hg/good 寻找变化 添加变更集 添加清单 添加文件更改 添加了 1 个变更集,对 1 个文件进行了 1 个更改(+1 个头) 转:35 标签: 小费

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

【问题讨论】:

    标签: mercurial mercurial-hook


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2018-12-19
      • 2020-06-06
      相关资源
      最近更新 更多