4

我正在尝试让 Mercurial 进程内挂钩在 Windows 上运行。
问题不在于如何编写钩子(我想使用现有的钩子,在这种情况下是 BugTracker.Net的用于 Mercurial 集成的钩子 - 我没有找到指向该文件的直接链接,但如果你可以看到它在此处下载 BT.net ,它位于“mercurial”子文件夹中)。
问题是如何告诉 Mercurial 运行它。

我花了很多时间阅读文档,但我现在卡住了。
(具有一定的 Python 知识可能会更容易 - 我没有)

我知道我必须在 hgrc 文件中插入一行(在我的存储库的 .hg 文件夹中)。

HG Book中有一个示例,如下所示:

[hooks]
commit.example = python:mymodule.submodule.myhook

Mercurial 网站上还有另一个示例,如下所示:

[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]当我推送时没有这样的文件或目录。
我已经尝试了很多不同的变化,但它不起作用,我不知道我做错了什么。

  • 我是否需要python:在开始或不需要?
  • 我需要指定文件扩展名.py吗?
  • 我是否需要/path/to/...如 Mercurial 网站的示例所示(见上文)?
  • 如果是,该路径的正确语法是什么?(只是c:\MyRepo\不起作用 - Python 中的语法必须不同)

另外,我是否将挂钩文件放入正确的文件夹中?
现在,它位于我的存储库的主文件夹中(与 .hg 文件夹处于同一级别)。


编辑:

马丁,我把它改成这样:

[hooks]
incoming.btnet = python:~c:\HG\MyRepo\hg_hook_for_btnet.py:debug_out

现在我收到一条不同的消息:[Errno 22] Invalid argument
我想这是因为你提到的repoand参数。ui

那么,这是否意味着钩子脚本被破坏了?
(正如我所说 - 我对 Python 一无所知,这是来自开源 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 邮件列表中询问进一步的建议。
谢谢你的帮助,如果没有你,我可能不会走这么远!

4

1 回答 1

6

你应该使用

[hooks]
incoming.btnet = python:~/path/to/hg_hook_for_btnet.py:debug_out

并定义debug_out

def debug_out(ui, repo, **kwargs):
    # ...

正如 HG 书中所解释的那样——所有的钩子都是用 aui和一个repo参数以及一些额外的特定于钩子的参数来调用的。Mercurial API页面解释了您可以使用和ui参数做什么repo


编辑:啊哈......我现在已经看过脚本了。它并非设计为作为进程内 Mercurial 挂钩运行。相反,它被设计为作为一个单独的进程运行。所以你需要使用

[hooks]
incoming.btnet = c:\HG\MyRepo\hg_hook_for_btnet.py

并确保您遵循脚本中的说明:它讨论了设置hg.exe二进制文件和 Python 解释器的路径。后者意味着作者希望你安装 Python。脚本中有一个电子邮件地址——我建议您直接或通过 BugTracker.NET 邮件列表联系 corey Trager。由于它是一个错误跟踪器,我认为他们有一个适当的地方可以报告这个!:-)

于 2010-07-22T12:45:11.990 回答