Как показать вывод хука в окне журнала Tortoise Hg? - PullRequest
5 голосов
/ 06 июля 2011

Мне нужен простой хук для Mercurial, который проверяет коммит комментария, используя шаблон.Вот мой крючок:

#!/usr/bin/env python
#
# save as .hg/check_whitespace.py and make executable

import re

def check_comment(comment):
    #
    print 'Checking comment...'
    pattern = '^((Issue \d+:)|(No Issue:)).+'
    if re.match(pattern, comment, flags=re.IGNORECASE):
        return 1
    else:
        print >> sys.stderr, 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"'
        return 0

if __name__ == '__main__':
    import os, sys
    comment=os.popen('hg tip --template "{desc}"').read()
    if not check_comment(comment):
        sys.exit(1)
sys.exit(0)

Работает.Он даже показывает сообщение об ошибке 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"', когда я фиксирую с консоли.Но когда я пытаюсь сделать коммит из Tortoise Hg Workbench, отображается только системное сообщение: abort: pretxncommit.check_comment hook exited with status 1.

Мне нужно сообщить пользователю, что не так.Есть ли способ заставить Tortoise Hg показывать вывод с крючка?

Ответы [ 2 ]

5 голосов
/ 06 июля 2011

Я заставил его работать, сделав его внутрипроцессным хуком , а не внешним хуком. Внутрипроцессные крючки определены совсем по-другому, однако.

Во-первых, файлу python требуется только одна функция, которая будет вызываться по имени в определении ловушки. Функция ловушки передается объектам ui, repo и hooktype. Также передаются дополнительные объекты в зависимости от типа крючка. Для pretrxncommit он передается node, parent1 и parent2, но вас интересует только узел, поэтому остальные собираются в kwargs. Объект ui используется для выдачи сообщений о состоянии и ошибках.

Содержимое check_comment.py:

#!/usr/bin/env python

import re

def check_comment(ui, repo, hooktype, node=None, **kwargs):
    ui.status('Checking comment...\n')
    comment = repo[node].description()
    pattern = '^((Issue \d+:)|(No Issue:)).+'
    if not re.match(pattern, comment, flags=re.IGNORECASE):
        ui.warn('Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"\n')
        return True

В hgrc хук будет определяться с python:/path/to/file.py:function_name, например:

[hooks]
pretxncommit.check_comment = python:/path/to/check_comment.py:check_comment

.suffix_name на pretxncommit состоит в том, чтобы избежать переопределения любого глобально определенного хука, особенно если он определен в hgrc хранилища, а не в глобальном. Суффиксы - это то, как можно разрешить несколько ответов на один и тот же хук.

0 голосов
/ 27 февраля 2014

В случае, если ловушка запускается в хранилище, которое обслуживается, например, через hgserve:
Я использую эту маленькую функцию Python в скрипте pretxnchangegroup, чтобы показать тот же вывод

  • на сервереlog
  • в рабочей среде TortoiseHg. Панорамирование журнала или строка cmd

:

def log(ui, string):
    print(string) # will show up as "remote:" on the client
    ui.status("{0}\n".format(string)) # will show up in the same hg process: hgserve ; append newline
    return 
...