钩子限制一次只推送一个分支

时间:2011-05-27 16:12:31

标签: mercurial hook mercurial-hook remote-branch

如果您尝试多次推送分支,我正在尝试创建一个阻止推送到远程存储库的挂钩。

这是钩子:

#!/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 <Jay.Keshur@monitisegroup.com>
date:        Thu May 26 16:36:49 2011 +0100
summary:     commit on default

changeset:   59:43be74e39a44
branch:      branch1
tag:         tip
user:        keshurj <Jay.Keshur@monitisegroup.com>
date:        Thu May 26 16:40:25 2011 +0100
summary:     commit on branch1

并尝试使用hg push -b branch1进行推送,钩子仍然将$ {HG_NODE}视为8d2bebe08dd9,这是默认情况。

有没有办法确保通过远程钩子一次只对一个分支进行推送?

打开任何和所有建议(重新:此工作流程:))

3 个答案:

答案 0 :(得分:2)

您是否考虑过使用hg nudge之类的别名:

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

只是:

[alias]
nudge = push --rev .

这确保您只推送当前的父版本及其祖先。在上面的脚本中给出假设可能都在同一个分支中(或者需要推动它)。你需要创造一种新的习惯,但它非常直接。

答案 1 :(得分:1)

运行脚本时未定义$1作业中的{p> $CHANGESETS - 将其替换为$HG_NODE

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

这假设您将此作为pretxnchangegroup挂钩运行。 (经过hg 1.8.1的测试,但我相当肯定最近没有改变)。

答案 2 :(得分:0)

原来我做的事情很傻....变革集58是变更集59的父母。

谢谢你们。