2012-10-09 62 views
0

正如我已经开始使用一个钩子Mercurial: enforce "hg pull -u" before "hg commit" 后随不允许HG推-f - 但允许汞拉创造新的头

[hooks] 
pretxnchangegroup.forbid_2heads = /usr/local/bin/forbid_2head.sh 

其中forbid_2head.sh看起来像这样

#!/bin/bash 
BRANCH=`hg branch` 
COUNT=`hg heads --template '{branch}|{rev}\n' | grep ^${BRANCH} | wc -l` 
if [ "$COUNT" -ne "1" ] ; then 
    echo "==========================================================" 
    echo "Trying to push more than one head, which is not allowed" 
    echo "You seem to try to add changes to an old changeset!" 
    echo "==========================================================" 
    exit 1 
fi 
exit 0 

它是在http://tutorials.davidherron.com/2008/10/forbidding-multiple-heads-in-shared.html 发现的脚本的派生物,我允许多个命名分支。

我现在的问题是,

  • 它停止汞推-f这是我想要的东西
  • 也停止汞拉的情况下有传入变更,我必须提交传出。这确实是不好的

我可以以任何方式重复使用相同的脚本,但更改挂钩设置并停止“hg push -f”? 或者我可以在forbid_2head.sh知道这是一个推或拉命令运行?

回答

1

首先,剧本是不是完全正确的:它只是在计算当前已签出服务器上的分支的磁头数(一hg branch)报告。您可以通过使用

hg heads tip 

得到的tip分公司的负责人进行改进。但是,有人可能会在同一时间超过一个分支推的变更,让你真正想要的是

hg heads --template '{branch}\n' $HG_NODE:tip 

找到由$HG_NODE:tip感动树枝分支负责人(变更集在还未提交事务推) 。然后您可以将其与

hg log --template '{branch}\n' -r $HG_NODE:tip | sort -u 

哪些是更改组触摸的分支。

如果你不想让现有的多头,那么你就可以简化上述只是

$(hg heads --template 'x' | wc -c) -eq $(hg branches | wc -l) 

刚刚测试该分支头的数目等于分支的数量 - 即每个命名分支只有一个分支头。

有了这个,让我来提一下$HG_SOURCE。该环境变量由Mercurial在运行钩子时设置:如果更改组使用直接文件系统访问被推入存储库,则其值为push;如果更改组通过SSH或HTTP进入,则值为serve。请参阅the Mercurial book

所以,最后,我相信这是一个很好的“禁止多头”脚本:

#!/bin/sh 
HEADS=$(hg heads --template 'x' | wc -c) 
BRANCHES=$(hg branches | wc -l) 
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES