Как предотвратить фиксацию с использованием pre-commit и hg incoming?

Иногда разработчики в моей команде забывают добавить ревизии других разработчиков, прежде чем коммитить свои собственные (правда, я тоже так делаю). Для недельного проекта в дереве могут быть десятки изменений, которые новая фиксация пропускает. При попытке push hg прерывает работу с новым сообщением удаленной головы, затем они извлекают и объединяют все эти новые коммиты. Я ищу простой способ проверить, есть ли какие-либо новые изменения до того, как кто-то совершит фиксацию, и есть ли они, чтобы предотвратить фиксацию. В идеале должно быть четкое сообщение о том, почему фиксация не удалась.

Кажется, что ловушку должно быть очень легко выполнить, но ловушка перед фиксацией продолжит работу с кодом состояния 0, а hg incoming вернет 1, когда нет изменений. Все, что мне нужно сделать, это инвертировать статус входящей команды hg, но я не могу найти синтаксис для этого. Большинство результатов поиска, которые я нашел, погружаются прямо в написание хуков Python, но это кажется излишним для такой простой проблемы.

Я ищу что-то вроде этого:

[hooks]
pre-commit != hg incoming
or
pre-commit = hg incoming == 0

Я тоже не уверен, куда пойдет это сообщение.


person NeilAE    schedule 07.08.2014    source источник
comment
Сценарий python может быть не таким уж излишним, если вам тоже нужно сообщение!   -  person Vince    schedule 07.08.2014
comment
@Vince: Мне не нужны сообщения, это было бы идеально. Я думаю, что мое разочарование было связано с невозможностью применить простую логику НЕ к результату команды Hg.   -  person NeilAE    schedule 07.08.2014
comment
блокирование любых локальных операций в случае некоторого удаленного состояния - это ПЛОХАЯ ИДЕЯ (tm). В любом случае, вы можете попробовать переопределить hg commit с помощью shell-alias   -  person Lazy Badger    schedule 07.08.2014


Ответы (3)


В Windows вы можете использовать эту команду для проверки входящих изменений:

[hooks]
pre-commit.checkNew = CMD /V /C "hg incoming & IF !ErrorLevel! EQU 0 (Exit 1) Else (Exit 0)"

Если будут обнаружены новые изменения, это отменит фиксацию, и вам нужно будет извлечь (и, возможно, объединить) новые изменения.

person stomtech    schedule 07.07.2017

В основном у вас все было правильно, но вы ошиблись:

[hooks]
precommit = ! hg incoming

В хуке нет тире, которое может отменить фиксацию.

Если, однако, вы превратите систему DVCS в то, что люди не могут совершать без подключения к Интернету, ваши коллеги натравят на вас нервы. :)

person Ry4an Brase    schedule 08.08.2014
comment
спасибо @ Ry4an. Мы используем битбакет, и иногда он становится недоступным, однако это будет локальный перехватчик, который разработчик может легко удалить. На самом деле это просто напоминание о том, что нужно предотвратить сценарий «ой, я забыл вытащить первым». - person NeilAE; 08.08.2014
comment
Этот хук по-прежнему у меня не работает. Я получаю прерывание: прерывание precommit завершено со статусом 1 [Код: 255] (от tortoiseHg). В командной строке я получаю '!' is not recognized as an internal or external command, operable program or batch file. abort: precommit hook exited with status 1 - person NeilAE; 08.08.2014
comment
Ах! Вы в окнах! ! является частью оболочки unix. Он отменяет код выхода любой команды. ! true ; echo $? печатает 1 (потому что 1 неверно в области кода выхода) - person Ry4an Brase; 08.08.2014

Я нашел решение, перечитав документы еще раз: контроль продолжения обработки. Где я обнаружил, что используется команда grep.

[hooks]
precommit.comment = REM Don't forget to pull first!
precommit.test = hg incoming | grep -q "no changes found"

Когда разработчик получает неудавшуюся фиксацию, он может проверить выходной журнал и увидеть примечание. Не очень красиво, но в большинстве случаев должно хватить. -q предотвращает появление в журнале «изменений не обнаружено», которые могут сбивать с толку после неудачной фиксации. Я добавил свои собственные расширения .comment и .test, чтобы хуки запускались в правильном порядке (c до t).

person NeilAE    schedule 08.08.2014