【问题标题】:Call a mercurial command ("hg update") from a python hook从 python 钩子调用一个 mercurial 命令(“hg update”)
【发布时间】:2012-02-16 20:21:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mercurial mercurial-hook


    【解决方案1】:

    受 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
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢 Martin - 我发现有一个我也可以使用的 mercurial.commands 模块 - 我设法让它工作 - 请参阅下面的答案。
      • @LeeAtkinson:这也是一个优雅的解决方案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多