22

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

Mercurial 书中有一些示例钩子:

我个人不觉得这些很有用。我想看看:

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

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

4

4 回答 4

16

对于正式存储库,我最喜欢的钩子是拒绝多头的钩子。如果您有一个需要合并后提示来自动构建的持续集成系统,那就太好了。

这里有几个例子:MercurialWiki:TipsAndTricks - 防止会产生多个正面的推动

我使用 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
于 2009-11-10T16:12:43.463 回答
9

我刚刚创建了一个小的 pretxncommit 钩子,用于检查制表符和尾随空格并将其很好地报告给用户。它还提供了清理这些文件(或所有文件)的命令。

请参阅CheckFiles扩展。

于 2010-11-26T21:36:09.977 回答
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
于 2011-05-11T17:12:56.947 回答
0

我喜欢上面提到的 Single Head Per Branch hook;但是,branchtags()应该替换为,branchmap()因为 branchtags() 不再可用。(我无法评论那个,所以我把它贴在这里)。

我也喜欢来自https://bobhood.wordpress.com/2012/12/14/branch-freezing-with-mercurial/的 Frozen Branches的钩子。您在 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),事务将被中止。

于 2015-12-03T18:15:35.940 回答