有用的Mercurial Hooks

时间:2009-11-10 06:05:49

标签: mercurial hook

您遇到过哪些有用的Mercurial钩子?

一些示例挂钩位于Mercurial book

我个人认为这些非常有用。我想看看:

  • 拒绝多个头
  • 使用合并拒绝更改组(如果您希望用户始终进行rebase,则非常有用)
    • 使用合并拒绝更改组,除非提交消息具有特殊字符串
  • 自动链接到Fogbugz或TFS(类似于bugzilla钩子)
  • 黑名单,会拒绝具有某些变更设置ID的推送。 (如果您使用MQ从其他克隆中提取更改,则非常有用)

请坚持使用bat和bash或Python的钩子。这样,* nix和Windows用户都可以使用它们。

4 个答案:

答案 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)

另一个好钩子是这个。它允许多个头,但只有它们在不同的分支中。

Single head per branch

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),则交易将被中止。