Disallow hg push -f - но разрешить hg pull создать новую голову

В качестве продолжения для Mercurial: примените "hg pull -u" перед "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"? Или я могу в hibid_2head.sh знать, выполняется ли команда push или pull?

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. Смотрите книгу Меркурий.

Итак, в заключение, я считаю, что это хороший сценарий "Запретить несколько голов":

#!/bin/sh
HEADS=$(hg heads --template 'x' | wc -c)
BRANCHES=$(hg branches | wc -l)
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES
Другие вопросы по тегам