2010-10-18 94 views
8

如何配置Mercurial服务器以限制提交到已命名分支关闭后的提交?我只希望存储库管理员能够重新打开分支。阻止添加到已关闭分支的提交推送

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

+0

该死!阻止意外犯下封闭分支的人应该更容易。 – Rory 2011-05-11 23:53:03

+2

大家一直在说“提交”,但你的意思是“推”。你永远不会阻止一个坚定的提交者,你只是拒绝他们的推动。 – 2012-09-18 13:36:18

回答

7

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

配置ACL:

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

[acl.allow.branches] 
branch_name = admin 
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钩子也能很好地工作。

+0

尽管我不能低估这个答案,但应该指出,这不起作用,因为$ HG_NODE不适用于prechangegroup。不幸的是,修复pretxnchangegroup的挂钩也不起作用,因为然后对分支是否关闭进行更改不再起作用,因为pretxnchangegroup试图添加更改集,因此分支已重新打开。我宁愿编写一个shell钩子,但仍然想知道如何为了这里讨论的特定目的做到这一点。 – 2015-08-14 13:01:47

+0

我得到了这份工作。您可以使用pretxnchangegroup钩子并使用与上面列出的脚本类似的脚本来检查$ HG_NODE中的每个节点:提示其父项之一在其额外字段中是否有“close = 1”。您可以使用hg log -r $ parentNode --template'{extras}'| grep -q“close = 1”来执行后面的检查。 – 2015-08-14 15:05:23

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模式(在本地检查提交事务)或pretxnchangegroup模式下运行(选中时的变更从外部回购添加的)用下面的hgrc条目:

[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版本中工作。