防止推送添加到封闭分支的提交

时间:2010-10-18 17:13:49

标签: mercurial branch

如何将Mercurial服务器配置为在关闭后限制对命名分支的提交?我只希望存储库管理员能够重新打开分支。

https://www.mercurial-scm.org/wiki/PruningDeadBranches表示关闭的变更集可以通过“变更集的额外字段中的close = 1”来识别。目前尚不清楚如何使用Mercurial API读取变更集的额外字段。

3 个答案:

答案 0 :(得分:7)

有一个与Mercurial一起分发的ACL扩展。 您应该能够通过拒绝提交除管理员之外的每个分支来指定冻结的分支。我不确定命名分支机构是否可以利用此功能。

配置acls:

[acl.deny.branches] 
frozen-branch = *

[acl.allow.branches]
branch_name = admin

答案 1 :(得分:4)

服务器不能限制提交,但它可以拒绝接受违反约束的推送。这是一个可以放在服务器上的钩子,用于拒绝任何具有闭合分支上任何变更集的推送:

#!/bin/sh
for thenode in $(hg log -r $HG_NODE:tip --template '{node}\n') ; do
     if hg branches --closed | grep -q "^$(hg id --branch -r $thenode).*\(closed\)"  ; then
          echo Commits to closed branches are not allowed -- bad changeset $thenode
          exit 1
     fi
done

你可以安装这样的钩子:

[hooks]
prechangegroup = /path/to/that.sh

几乎可以肯定有一种方法可以使用你引用的API的in-python钩子来实现它,但shell钩子的效果也很好。

答案 2 :(得分:1)

这是一个进程内挂钩,应拒绝封闭分支上的其他更改集。

from mercurial import context, ui
def run(ui, repo, node, **kwargs):
    ctx = repo[node]
    for rev in xrange(ctx.rev(), len(repo)):
        ctx = context.changectx(repo, rev)
        parent1 = ctx.parents()[0]
        if parent1 != None and parent1.extra().get('close'):
            ui.warn("Commit to closed branch is forbidden!\n")
            return True
    return False

钩子可以在pretxncommit模式下运行(在本地提交事务期间检查)或者在使用以下hgrc条目的prexnchangegroup模式(从外部仓库添加更改集时检查):

[hooks]
pretxncommit.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run
pretxnchangegroup.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run

不确定此挂钩是否适用于2.2之前的Mercurial版本。