我正在尝试在Windows上运行一个Mercurial进程内挂钩
问题不在于如何编写钩子(我想使用现有的一个,在这种情况下BugTracker.Net的钩子用于Mercurial集成 - 我没有找到该文件的直接链接,但是你如果您下载BT.net here,可以看到它,它位于“mercurial”子文件夹中。
问题是如何告诉Mercurial运行它。
我花了很长时间阅读文档,但我现在卡住了。
(使用Python的某些知识可能会更容易 - 我没有)
我知道我必须在hgrc文件中插入一行(在我的存储库的.hg文件夹中)。
有一个示例in the HG Book,如下所示:
[hooks]
commit.example = python:mymodule.submodule.myhook
Mercurial site还有另一个例子,它看起来像这样:
[hooks]
changegroup = /path/to/changegrouphook
现在我想要一个“传入”钩子,所以至少我知道我必须这样做:
[hooks]
incoming.btnet = X
问题是找出“X” 文件名为 hg_hook_for_btnet.py ,在文件中有一行如下所示:
def debug_out(s):
我想这就是“功能”本身的名称 所以我的行需要看起来像这样:
[hooks]
incoming.btnet = python:hg_hook_for_btnet.debug_out
但是当我按下时,这会给我一个错误消息 [Errno 2]没有这样的文件或目录。
我已经尝试了很多不同的变化,但它不起作用,我不知道我做错了什么。
另外,我是否将钩子文件放入正确的文件夹中? 现在,它位于我的存储库的主文件夹中(与.hg文件夹处于同一级别)。
编辑:
马丁,我把它变成了这个:
[hooks]
incoming.btnet = python:~c:\HG\MyRepo\hg_hook_for_btnet.py:debug_out
现在我收到一条不同的消息: [Errno 22]参数无效
我想这是因为您提到的repo
和ui
参数。
那么,这是否意味着钩子脚本被破坏了? (正如我所说 - 我对Python一无所知,这是来自open source bugtracker的现有钩子脚本)
编辑2:
很抱歉有关进程内和进程分离的混淆 - 我知道存在差异,但我认为如果钩子是用Python编写的,那么它必须是自动进程的(事实证明我错了:-)
好的,根据您编辑的答案中的语法,脚本至少会运行
我安装了Python 2.7(在我在这里提出问题之前已经这样做了)并将脚本中的第一行更改为#!C:\Python27\python.exe
。
现在我明白了:
running hook incoming.btnet: c:\HG\MyRepo\hg_hook_for_btnet.py
warning: incoming.btnet hook exited with status 1
所以脚本运行,但仍然有一些错误 这似乎是一个与Bugtracker.NET相关的问题,所以我会在BT.NET邮件列表上询问进一步的建议 谢谢你的帮助,如果没有你,我甚至可能不会到目前为止!
答案 0 :(得分:5)
你应该使用
[hooks]
incoming.btnet = python:~/path/to/hg_hook_for_btnet.py:debug_out
并将debug_out
定义为
def debug_out(ui, repo, **kwargs):
# ...
正如HG书中所解释的那样 - 使用ui
和repo
参数以及一些额外的特定于钩子的参数调用所有钩子。 Mercurial API页面说明了您可以使用ui
和repo
参数执行的操作。
编辑:啊哈......我现在看了the script。它不是作为进程内Mercurial钩子运行的。它被设计为作为单独的进程运行。所以你需要使用
[hooks]
incoming.btnet = c:\HG\MyRepo\hg_hook_for_btnet.py
并确保按照脚本中的说明进行操作:它讨论了如何设置hg.exe
二进制文件和Python解释器的路径。后者意味着作者希望您安装Python。脚本中有一个电子邮件地址 - 我建议您直接或通过BugTracker.NET邮件列表联系corey Trager。由于它是一个bug跟踪器,我认为它们有一个适当的位置,你可以报告这个! : - )