Mercurial расширение или ловушка, чтобы предотвратить возврат изменений слияния
Как отмечено в документации, hg backout
Команда может вызвать проблемы при использовании слияния наборов изменений. Недавно у нас было несколько случаев, когда новые разработчики поддерживали наборы изменений слиянием и приводили к тому, что код, который мы хотели сохранить, был возвращен, когда все снова слилось воедино.
Чтобы избежать этого, я пытаюсь придумать хороший способ предотвратить это вообще. Есть ли хороший общий способ, которым я мог бы написать ловушку или просто полностью отключить команду возврата?
(Часть нашей стандартной установки для разработчиков заключается в установке пользовательского набора расширений, поэтому у меня уже есть хороший способ установить эти типы правил локально для всей нашей команды разработчиков - я просто не думал о хорошем способе реализации Набор правил.)
2 ответа
Вот простой хук на основе Python, который предотвращает возврат слияний. Благодарю @Oben за указание в правильном направлении.
def prebackout_prevent_backout_merge( ui, repo, **kwargs ):
'''Don't allow backouts to of merge changesets.'''
# Figure out if a --parent version was given or not.
backout_to_parent = kwargs['opts'].get( 'parent', None )
# If no parent version was given, proceed.
if backout_to_parent is '':
return False
# Otherwise abort the operation.
from mercurial import util
raise util.Abort( 'Backout of a merge changeset is not allowed.' )
Вы можете настроить этот хук в.hgrc или Mercurial.ini с помощью:
[hooks]
pre-backout.ttd_prevent_backout_merge = python:PATH_TO_HOOK_SCRIPT:prebackout_prevent_backout_merge
Как насчет этого:
$ hg --version
Mercurial Distributed SCM (version 2.6.3)
...
$ hg log --graph --template='{rev} {desc}'
@ 5 c5
|
o 4 merge
|\
| o 3 c4
| |
o | 2 c3
|/
o 1 c2
|
o 0 c1
$ hg backout 4
abort: cannot backout a merge changeset
Похоже, что Mercurial делает то, что вы хотите по умолчанию. Может быть, вам нужна более свежая версия Mercurial.
Если вы привязаны к старой версии Mercurial, вот хакерский хук (для *nix/Bash), который отменяет возврат слияний:
[hooks]
pre-backout=REV=`echo $HG_PATS | sed -e "s/[^0-9]//g"`; test `hg log -r "parents($REV)" --template='{node}\n' | wc -l` -eq 1 || { echo 'do not do that'; exit 1; }
Извлекает номер ревизии из $HG_PATS
а затем использует hg log
а также wc
подсчитать количество родителей рассматриваемой ревизии. Если есть более одного родителя, это слияние.
Тем не менее, я настоятельно рекомендую использовать последнюю версию Mercurial: посмотрите заметки о выпуске, чтобы узнать, какие интересные функции вам не хватает.