2015-11-23 2 views
1

Я хотел бы запустить clang-format (на самом деле clang-format-diff.py, чтобы форматировать только то, что было изменено) на код, который я совершаю в Mercurial автоматически. Я знаю, что могу сделать это с помощью precommit hook. На самом деле, я делал это в прошлом, но it messed up some histedits, поэтому я удалил крюк, а теперь сделаю это вручную, выполнив команду перед совершением.Предотвратить запуск крюка с использованием меркурийного использования на histedit

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

Есть ли способ запускать крючок только на «нормальные» коммиты, а не на histedit или rebase?

ответ

2

Не знаю, насколько я знаю. Но вы можете создать себе псевдоним для использования вместо rebase и histedit, давайте назовем их hrebase и hhistedit, которые отключат крючок для их использования.

Для того, чтобы отключить крюк для одного запуска в командной строке вы можете использовать --config hook.HOOKNAME=, таким образом, например:

hg --config hook.HOOKNAME= rebase -d2 -b5 

и, таким образом, вы определяете псевдоним:

[alias] 
hrebase = rebase --config hook.HOOKNAME= 
hhistedit = histedit --config hook.HOOKNAME= 
1

Для того, для обертывания одной команды (в вашем случае 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) 

См. Комментарий к документации для получения инструкций по использованию удлинителя.

Смежные вопросы