Как получить доступ к сообщению коммита во внутрипроцессном хуке Mercurial?

я пытался

def debug_hook(ui, repo, **kwargs):
    changectx = repo[None]
    ui.status('change.desc: %s\n' % changectx.description())
    return True

Но он всегда печатает пустую строку. Это потому, что это ловушка предварительной фиксации, а сообщение еще не доступно? Или я просто упускаю что-то очевидное?


person davidavr    schedule 16.03.2010    source источник


Ответы (2)


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

  1. Как указал jk, событие precommit происходит до фиксации, поэтому метаданные для обрабатываемой фиксации еще не существуют. При использовании вместо этого pretxncommit метаданные существуют, но транзакция еще не зафиксирована в базе данных.
  2. Использование changectx = repo[None] дает вам контекст изменения для рабочего каталога. Но нам нужна информация для текущего коммита, поэтому использование changectx = repo['tip'] вместо этого дает нам самые последние метаданные.

Обратите внимание, что если вы используете changectx = repo['tip'] с событием precommit, вы фактически получите последний обработанный коммит, а не текущий, над которым вы работаете.

person davidavr    schedule 17.03.2010
comment
да, я был немного обеспокоен этим из книги, хотя этот хук может получить доступ к метаданным, связанным с почти новым набором изменений, но он не должен делать с этими данными ничего постоянного. Он также не должен изменять рабочий каталог. - person jk.; 17.03.2010
comment
Вот почему в Stack Overflow рекомендуется задавать собственные вопросы и отвечать на них. Спустя год этот ответ действительно помог мне, когда я просматривал очень скудную документацию. для HG API. - person Tim Post♦; 30.09.2011

Я думаю, вы правы, что в предварительной фиксации сообщение еще не существует. если вы используете pretxncommit, это произойдет, но я не уверен на 100%, что он позволяет вам делать в этот момент, поскольку транзакция почти завершена.

person jk.    schedule 17.03.2010
comment
Оказывается, это часть ответа (используя pretxncommit). Я опубликую ответ с подробностями. - person davidavr; 17.03.2010