我需要用于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显示钩子的输出?
答案 0 :(得分:5)
我通过将其设为进程中挂钩而不是外部挂钩来实现它。但是,进程中hooks的定义完全不同。
首先,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
而不是全局的钩子中定义了这个钩子。后缀是指如何允许多个响应同一个钩子。
答案 1 :(得分:0)
如果钩子在通过例如服务器提供的存储库上运行hgserve:
我在pretxnchangegroup
脚本中使用这个小Python函数来显示相同的输出
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