4

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

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

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

有没有使用 Python 钩子调用 mercurial 命令的示例 - 是否可以在 hgrc 中完成所有这些操作,或者我是否需要一个外部 .py 文件?

4

2 回答 2

3

受马丁回答的启发,我想我会尝试编写一些 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

我会更改执行命令的行以专门更新到“提示”。如果您使用命名分支,那么上面的命令将无效。我相信这会更好: commands.update(ui, repo, repo['tip'])

于 2012-01-23T17:10:43.540 回答
3

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

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

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

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

您传递给的列表requestor是命令行上dispatch的参数。hg

于 2012-01-23T13:39:24.647 回答