禁止hg push -f - 但允许hg pull创建新头

时间:2012-10-09 11:35:27

标签: mercurial mercurial-hook

作为Mercurial: enforce "hg pull -u" before "hg commit"的后续行动 我已经开始使用钩子了

[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找到的脚本的衍生物 我允许多个命名分支。

我现在遇到的问题是

  • 它停止了hg push -f这就是我想要的
  • 它还会停止hg pull,以防有传入的变更集并且我已经提交了传出。这确实很糟糕

我可以以任何方式重用相同的脚本但更改挂钩设置并停止“hg push -f”吗? 或者我可以在forbid_2head.sh中知道这是推送还是拉动命令?

1 个答案:

答案 0 :(得分: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,如果更改组进入,则值serve通过SSH或HTTP。请参阅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