代码之家  ›  专栏  ›  技术社区  ›  Christian Specht

让Mercurial进程内挂钩在Windows上运行

  •  4
  • Christian Specht  · 技术社区  · 14 年前

    我想让一个反复无常的进程内钩子在Windows上运行。
    问题不是怎么写钩子 (在这种情况下,我想使用现有的一个 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]没有此类文件或目录 当我推的时候。
    我已经尝试了很多不同的变化,但它不起作用,我不知道我做错了什么。

    • 我需要 蟒蛇: 开始还是不?
    • 我需要指定文件扩展名吗 Py 或不是?
    • 我需要 路径/到… 如示例中所示,从Mercurial站点(见上文)?
    • 如果是,路径的正确语法是什么?(只是 C: MyRePo\\ 不起作用-python中的语法必须不同)

    另外,我把钩子文件放进了正确的文件夹吗?
    现在,它在我的存储库的主文件夹中(与.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邮件列表上寻求进一步的建议。
    不过,谢谢你的帮助,如果没有你,我可能不会来这么远!

    1 回复  |  直到 14 年前
        1
  •  5
  •   Martin Geisler    14 年前

    你应该使用

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

    并定义 debug_out 作为

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

    正如hg书中所解释的,所有钩子都用 ui 和A repo 参数加上一些额外的钩子特定参数。这个 Mercurial API page解释您可以使用 用户界面 和A 回购协议 争论。


    编辑: 啊哈…我已经看过了 the script . 它的设计并不是作为一个过程中的汞钩运行。相反,它被设计为作为一个单独的过程运行。所以你需要使用

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

    并确保您遵循脚本中的说明:它将讨论如何将路径设置为 hg.exe 二进制文件和Python解释器。后者意味着作者希望您安装python。脚本中有一个电子邮件地址——我建议您直接或通过bugtracker.net邮件列表与corey trager联系。因为它是一个bug追踪器,我想他们有一个合适的地方,你可以报告这个!-)