Как отключить хуки pretxncommit с помощью mercurial queues или histedit?

У меня есть несколько хуков pretxncommit в моем локальном репозитории mercurial, эти хуки используются для проверки того, что сообщение коммита включает ссылку на билет и некоторые другие проверки работоспособности.

Моя проблема в том, что когда я пытаюсь использовать ртутные очереди, такие команды, как qnew, пытаются запустить эти хуки, и одна из проверок билетов завершается неудачей. Я видел ту же проблему с histedit и подобными расширениями.

Почему хуки pretxncommit выполняются с этими командами? Они выполняют какую-то внутреннюю фиксацию?

Как я могу заставить эти хуки запускаться только при коммитах?


person Jaime Soriano    schedule 04.10.2011    source источник


Ответы (3)


Да, qnew создает настоящую фиксацию и, таким образом, вызывает все соответствующие перехватчики фиксации. Вы можете убедиться в этом сами, временно отключив MQ на время применения исправления MQ и просмотрев журнал.

Невозможно сделать так, чтобы хук pretxncommit применялся только к некоторым командам, кроме как с помощью других хуков:

$ cat .hg/hgrc
[hooks]
pre-qnew = touch .hg/skiphook
post-qnew = rm .hg/skiphook
pretxncommit = test -e .hg/skiphook || echo not skipping
$ hg rm README  # make some change
$ hg qnew asdf  # no hook
$ hg qpop
$ hg rm README
$ hg ci -m asdf
not skipping

Здесь наш хук pretxncommit убеждается, что конкретный файл не существует, прежде чем запускать его (тривиальный) хук, а хуки pre-/post-qnew создают файл и очищают его.

person mpm    schedule 05.10.2011
comment
Я не думаю, что это решение имеет смысл, это своего рода взлом. С другой стороны, вы могли бы подумать, что можете решить эту проблему с помощью: - person stantonk; 25.01.2013

Функция abort_commit_to_wrong_branch в https://stackoverflow.com/a/19349636/350713 показывает подход к запуску ловушки только на «настоящая» фиксация, а не фиксация MQ. Идея состоит в том, чтобы проверить наличие атрибута _committingpatch в repo.

Если repo имеет атрибут '_committingpatch', это означает, что выполняется фиксация MQ. Соответствующая строка

if hasattr(repo, "_committingpatch"):

Это упоминается в функции newcommit в http://hg.intevation.org/mercurial/crew/file/7032dcff290c/hgext/mq.py#l293

person Faheem Mitha    schedule 13.10.2013

  • pretxncommit работает со всеми изменениями (записываемыми) внутри репозитория.
  • если вы хотите игнорировать операцию mq, вы можете найти родительский набор изменений и посмотреть, является ли он потомком тега qparent/qbase, или посмотреть на WC. что-л. как (грязный из головы, а не из теста) hg id -tr .

Или (может бред) - когда работаешь с MQ, то всегда работаешь с qtip, не так ли?

>hg parents
...
tag:         qtip
tag:         tip
..
person Lazy Badger    schedule 04.10.2011
comment
Вы имеете в виду проверить сами хуки, если они выполняются как mq-операция, и, если это так, прервать их? - person Jaime Soriano; 04.10.2011
comment
Да, но не прерывание, а выход с хорошим уровнем ошибок. Кстати, обнаружил позже, чем ответил -qfinish даже в этом случае будет большой головной болью - person Lazy Badger; 04.10.2011