Mercurial挂钩可在标签名称上设置策略

Mercurial挂钩可在标签名称上设置策略

本文介绍了Mercurial挂钩可在标签名称上设置策略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写(进程内)钩子来防止在本地添加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 标签!

解决方案

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

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

此外,由于标记的工作方式,您实际上将不知道哪个修订版本带有标记.新的变更集可能在更早的变更集上添加了标签.也许最好的方法是检查新变更集对.hgtags所做的任何添加.

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

I write (in-process) hook to prevent add BAD tag name locally:

.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

How make this check for pretxnchangegroup hook?

I try write this code:

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

but when I (push to repo with upper pretxnchangegroup hook enabled:

  $ 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

you can see that rev.tags() do not return gg tag!

解决方案

*Interpreted question: Why doesn't rev.tags() return the gg tag?

rev.tags() doesn't return the gg tag because the revision you pushed doesn't have that tag on it. By default hg tag will tag the working directory's parent. The new changeset only adds to the .hgtags file. The tag was added to a changeset both repos already had. Try making some changes and commiting, then tagging that so that you're pushing 2 changesets and one will have the bad tag.

Also, because of the way tagging works, you won't actually know which revision has the tag on it. The new changsets could potentially have added a tag on a much earlier changeset. Perhaps a better way of seeing if somebody is pushing a bad tag is to examine any additions the new changesets make to .hgtags.

If you parse changes to .hgtags, you'll want to parse those changes correctly so that you don't get false positives from entries that are removing tags. You'll also want to gather a complete list of bad tags rather than breaking on the first find. You might find a line that adds tag gg to a changeset, but later are 2 lines that remove it, which should also remove your find and allow the hook to pass successfully since it means the user removed their bad tag before pushing.

这篇关于Mercurial挂钩可在标签名称上设置策略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 11:42