如何在Tortoise Hg日志窗口中显示钩子输出?

时间:2011-07-06 10:20:12

标签: mercurial hook tortoisehg

我需要用于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 个答案:

答案 0 :(得分:5)

我通过将其设为进程中挂钩而不是外部挂钩来实现它。但是,进程中hooks的定义完全不同。

首先,python文件只需要一个函数,该函数将由钩子定义中的名称调用。钩子函数传递uirepohooktype个对象。它还根据钩子的类型传递了其他对象。对于pretrxncommit,它会传递nodeparent1parent2,但您只对节点感兴趣,因此其余内容都会收集在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而不是全局的钩子中定义了这个钩子。后缀是指如何允许多个响应同一个钩子。

答案 1 :(得分:0)

如果钩子在通过例如服务器提供的存储库上运行hgserve:
我在pretxnchangegroup脚本中使用这个小Python函数来显示相同​​的输出

  • 在服务器日志中
  • 在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