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: посмотрите заметки о выпуске, чтобы узнать, какие интересные функции вам не хватает.

Другие вопросы по тегам