您遇到过哪些有用的Mercurial钩子?
一些示例挂钩位于Mercurial book:
中我个人认为这些非常有用。我想看看:
请坚持使用bat和bash或Python的钩子。这样,* nix和Windows用户都可以使用它们。
答案 0 :(得分:16)
我最喜欢的正式存储库钩子是拒绝多个头的人。当你有一个需要合并后提示自动构建的持续集成系统时,这很棒。
这里有几个例子:MercurialWiki: TipsAndTricks - prevent a push that would create multiple heads
我使用Netbeans的这个版本:
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
#
# To forbid pushes which creates two or more headss
#
# [hooks]
# pretxnchangegroup.forbid_2heads = python:forbid2_head.forbid_2heads
from mercurial import ui
from mercurial.i18n import gettext as _
def forbid_2heads(ui, repo, hooktype, node, **kwargs):
if len(repo.heads()) > 1:
ui.warn(_('Trying to push more than one head, try run "hg merge" before it.\n'))
return True
答案 1 :(得分:9)
我刚刚创建了一个小的pretxncommit钩子,它检查选项卡和尾随空格并向用户报告它。它还提供了清理这些文件(或所有文件)的命令。
请参阅CheckFiles扩展名。
答案 2 :(得分:5)
另一个好钩子是这个。它允许多个头,但只有它们在不同的分支中。
def hook(ui, repo, **kwargs):
for b in repo.branchtags():
if len(repo.branchheads(b)) > 1:
print "Two heads detected on branch '%s'" % b
print "Only one head per branch is allowed!"
return 1
return 0
答案 3 :(得分:0)
我喜欢上面提到的Single Head Per Branch钩子;但是,branchtags()
应替换为branchmap()
,因为branchtags()不再可用。 (我无法评论那个,所以我把它放在这里)。
我也喜欢冻结分支的https://bobhood.wordpress.com/2012/12/14/branch-freezing-with-mercurial/钩子。你可以在你的hgrc中添加一个部分:
[frozen_branches]
freeze_list = BranchFoo, BranchBar
并添加钩子:
def frozenbranches(ui, repo, **kwargs):
hooktype = kwargs['hooktype']
if hooktype != 'pretxnchangegroup':
ui.warn('frozenbranches: Only "pretxnchangegroup" hooks are supported by this hook\n')
return True
frozen_list = ui.configlist('frozen_branches', 'freeze_list')
if frozen_list is None:
# no frozen branches listed; allow all changes
return False
try:
ctx = repo[kwargs['node']]
start = ctx.rev()
end = len(repo)
for rev in xrange(start, end):
node = repo[rev]
branch = node.branch()
if branch in frozen_list:
ui.warn("abort: %d:%s includes modifications to frozen branch: '%s'!\n" % (rev, node.hex()[:12], branch))
# reject the entire changegroup
return True
except:
e = sys.exc_info()[0]
ui.warn("\nERROR !!!\n%s" % e)
return True
# allow the changegroup
return False
如果有人试图更新冻结的分支(例如,BranchFoo,BranchBar),则交易将被中止。