Для того, для обертывания одной команды (в вашем случае commit
) вы можете использовать псевдоним или расширение. Подход псевдонимов довольно прост, но имеет некоторые недостатки. Пример псевдонима:
commit = !$HG commit --config alias.commit=commit --config hooks.precommit.clang=/tmp/msg "[email protected]"
Есть несколько тонких вопросов, связанных с созданием такой псевдоним: во-первых, обычные псевдонимы не принимают --config
В параметре (все настройки уже разобран в точке расширения псевдонима). Поэтому нам нужно использовать псевдоним оболочки (!$HG
), чтобы обойти эту проблему; во-вторых, чтобы избежать застревания в рекурсии при расширении псевдонима оболочки (в отличие от обычных псевдонимов, Mercurial не может сделать это для псевдонимов оболочки), мы должны иметь реальные значения commit
(следовательно, часть --config alias.commit=commit
).
Этот подход имеет несколько недостатков: во-первых, он удваивает время запуска (поскольку Mercurial дважды вызывается для псевдонима оболочки); в то время как это относительно немного над головой, этого может быть достаточно, чтобы раздражать человека. Во-вторых, он плохо взаимодействует со сценариями; скрипты и графические интерфейсы могут либо непреднамеренно использовать псевдоним, когда они не намереваются или (что еще хуже) отключить его, минуя крючок.
Альтернативой является использование расширения для обертывания команды commit
. Например:
# Simple extension to provide a hook for manual commits only
"""hook for manual commits
This extension allows the selective definition of a hook for
manual commits only (i.e. outside graft, histedit, rebase, etc.).
In order to use it, add the following lines to your ``.hg/hgrc`` or
``~/.hgrc`` file::
[extensions]
manualcommithook=/path/to/extension
[hooks]
premanualcommit=/path/to/hook
The ``hooks.premanualcommit`` hook will then be (temporarily) installed
under ``hooks.precommit.manual``, but only for manual commits.
"""
from mercurial import commands, extensions
def commit_with_hook(original_cmd, ui, repo, *pats, **opts):
hook = ui.config("hooks", "premanualcommit")
if hook:
if ui.config("hooks", "precommit.manual"):
ui.warn("overriding existing precommit.manual hook\n")
ui.setconfig("hooks", "precommit.manual", hook)
return original_cmd(ui, repo, *pats, **opts)
def uisetup(ui):
extensions.wrapcommand(commands.table, "commit", commit_with_hook)
См. Комментарий к документации для получения инструкций по использованию удлинителя.