问题
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