从python hook调用mercurial命令(“hg update”)

时间:2012-01-23 13:31:50

标签: mercurial mercurial-hook

我在Windows 2008 64位和IIS上设置了Mercurial hgweb。存储库的位置是网络共享。

我想在存储库上创建一个钩子,以在更改组上发出“hg update”命令。我无法使用外部挂钩,因为这会启动cmd.exe,并将网络共享作为工作目录(并且cmd.exe不支持网络共享)。

因此,我正在寻找一个调用mercurial命令的python钩子的例子。我注意到有一个mercurial.commands模块,但我在网上找不到任何例子,我对Python不是很有经验。

是否有任何使用Python钩子调用mercurial命令的示例 - 是否可以在hgrc中执行此操作,或者我是否需要外部.py文件?

2 个答案:

答案 0 :(得分:3)

您需要一个外部.py文件用于Python扩展。要使用内部API,就像从命令行调用Mercurial一样,请使用

 from mercurial.dispatch import dispatch, request
 dispatch(request(['update']))

这是Mercurial 1.9之后的语法。在早期版本中,您将使用

 from mercurial.dispatch import dispatch
 dispatch(['update'])

传递给requestdispatch的列表是命令行中hg后面的参数。

答案 1 :(得分:3)

受Martin的回答启发,我想我会尝试编写一些Python,这就是我如何设法让它运行起来的。我正在使用Mercurial 2.0.2和mercurial.commands模块(其中,AFAIK,包含在Mercurial Python包中)。

我在服务器上创建了一个myhook.py文件:

import mercurial.commands

def update(ui, repo, **kwargs):
    mercurial.commands.update(ui, repo)

然后,在服务器上的.hg / hgrc文件中,我添加了以下内容:

[hooks]
changegroup = python:C:\path\to\my\myhook.py:update

我会更改执行命令的行,专门更新为'tip'。如果你使用命名分支,那么命令将无效。我相信这会更好:      commands.update(ui,repo,repo ['tip'])