Mercurial Pre-Commit Hook:如何挂钩当前目录中的python程序?

时间:2011-07-26 11:09:56

标签: python windows mercurial pre-commit-hook

我正在尝试创建一个Mercurial钩子,该钩子在将提交推送到主存储库时运行。我创建了一个python脚本,如下所示:

# commit.py

from mercurial import ui, hg
from mercurial.i18n import gettext as _

def getV1ID(ui, repo, **kwargs):
    ui.write("The hook works!!!")
    v1id = ui.prompt('Enter the VersionOne ID')
    ui.write('VersionOne ID: '+v1id)

对于每个分支,此commit.py是重复的,因为它包含在将代码推送到主存储库之前需要运行的机制。只有那些预推机制通过才能推动推动。用户可以修改他们的本地commit.py,以便他们只运行这些预推送操作的子集,具体取决于他们所处理的项目,并且每个人可以一次处理多个项目。因此,commit.py不能是可以驻留在.hg文件夹中的全局python脚本。

要使mercurial运行本地commit.py,在我的mercurial.ini文件中(在C:\ Users \ UserName \ mercurial.ini中),我添加了以下语句:

[hooks]
prechangegroup = python:./commit.py:getV1ID

如果将python脚本放在.hg文件夹中,则会运行python脚本,但是当我执行此操作时则不会。任何人都可以帮助我阐明这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:6)

我通过IRC为Mercurial获得了这个解决方案。正如我的一篇评论中所述,钩子的脚本应该被指定为绝对路径,或者应该是PYTHONPATH中的python模块。因此,pmezard通过IRC建议我应该有一个调用本地commit.py的固定脚本。这可以如下所示完成:

mercurial.ini中,挂钩一个位于用户家中.hg目录的'全局'python脚本,如下所示:

[hooks]
preoutgoing = python:%USERPROFILE%\.hg\commit.py:run

'global'python-script commit.py看起来像这样:

from mercurial import ui, hg
import os

class Chdir:
    def __init__(self, newPath):
        self.savedPath = os.getcwd()
        os.chdir(newPath)

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        os.chdir(self.savedPath)

def run(ui, repo, **kwargs):
    if kwargs['source'] == 'push':
        with Chdir(repo.root) as dirchanged:
            import localcommit
            sys.exit(localcommit.main(ui, repo, **kwargs))

然后,存储库目录中的localcommit.pyglobal commit-script运行,因此每个存储库都可以维护自己的自定义提交脚本。