Mercurial hook to set policy on tag names

倾然丶 夕夏残阳落幕 提交于 2019-12-11 00:44:18

问题


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!


回答1:


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



来源:https://stackoverflow.com/questions/6746881/mercurial-hook-to-set-policy-on-tag-names

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!