Как отобразить вывод хука в окне журнала Tortoise Hg?

Мне нужен простой хук для 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 показывать вывод из хука?


person Victor Haydin    schedule 06.07.2011    source источник
comment
Просто предположение, но пробовали ли вы писать в sys.out вместо sys.err?   -  person bbaja42    schedule 06.07.2011


Ответы (2)


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

Во-первых, файлу 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 репозитория, а не в глобальном. Суффиксы — это то, как можно разрешить несколько ответов на один и тот же хук.

person Joel B Fant    schedule 06.07.2011

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

  • в журнале сервера
  • в панели журнала рабочего места 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 
person jan    schedule 27.02.2014