2011-05-27 34 views
0

我想创建一个钩子,阻止推到远程存储库,如果你试图推多个分支。钩一次只限制推送到一个分支

这里的钩:

#!/bin/bash 

HG_EXE="/opt/csw/bin/hg" 
CHANGESETS=`${HG_EXE} log -r $1:tip --template '{node} '` 

i=0 
for changeset in ${CHANGESETS} 
do 
     BRANCH=`${HG_EXE} log -r ${changeset} --template '{branches}'` 

     if [ "${BRANCH}" == "" ] 
     then 
       BRANCH="default" 
     fi 
     BRANCHES[$i]=${BRANCH} 
     i=$i+1 
done 

items=${#BRANCHES[*]} 
if [ $items -gt 1 ] 
then 
     i=0 
     while [ "${BRANCHES[${i}+1]}" != "" ] 
     do 
       if [ "${BRANCHES[${i}]}" != "${BRANCHES[${i}+1]}" ] 
       then 
        echo "ERROR: You are trying to push more than one branch, use  \"hg push -b [branch_name]\"" 
        exit 1 
       fi 
     i=$i+1 
     done 
fi 

问题: 如果我已经提交了两个分支:

changeset: 58:8d2bebe08dd9 
user:  keshurj <[email protected]> 
date:  Thu May 26 16:36:49 2011 +0100 
summary:  commit on default 

changeset: 59:43be74e39a44 
branch:  branch1 
tag:   tip 
user:  keshurj <[email protected]> 
date:  Thu May 26 16:40:25 2011 +0100 
summary:  commit on branch1 

并尝试使用汞推-b BRANCH1推,挂钩仍然可以看到$ {HG_NODE}为8d2bebe08dd9,默认为。

有没有什么方法可以确保通过远程钩子一次只对一个分支进行推送?

打开任何和所有的建议(复:这个工作流程:))

+0

没有理由认为'8d2bebe08dd9' 是'43be74e39a44'的父亲 – Matt 2011-05-27 18:20:09

回答

0

原来我在做一些愚蠢的....变更58变更59

谢谢你们的父。

1

提交作业$CHANGESETS$1运行脚本时没有定义 - 与$HG_NODE

http://www.selenic.com/mercurial/hgrc.5.html#hooks

更换这假定您正在将此作为prexxchangegroup钩子运行。 (经过1.8.1的测试,但我确信最近没有改变)。

+0

Matt,对不起,我忘了提及,我将$ HG_NODE作为pretxnchangegroup钩子的参数传入 – 2011-05-31 08:47:58

1

你有没有考虑只是使用别名像hg nudge

http://hgtip.com/tips/advanced/2009-09-28-nudge-a-gentler-push/

这仅仅是:

[alias] 
nudge = push --rev . 

这可以确保你只能把你的当前父修订和它的祖先。在上面的脚本中给出假设可能都在同一分支中(或者无论如何都需要推送)。你需要创造一个新的习惯,但它非常直接。