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

Vit*_*con 9 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

如果我把它放在.hg文件夹中,python脚本会运行,但是当我这样做时它不会运行.任何人都可以帮助我阐明这个问题吗?非常感谢.

Vit*_*con 6

我通过IRC for Mercurial获得了此解决方案。如我的评论之一所述,该挂钩的脚本应指定为绝对路径,或者应在PYTHONPATH中使用python模块。因此,pmezard在IRC上我建议我应该有一个调用local的固定脚本commit.py。可以如下所示进行:

在中mercurial.ini,连接到位于.hg用户家目录中的“全局” python脚本,如下所示:

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

“全局” python脚本commit.py看起来像这样:

来自汞进口ui,hg
导入操作系统

Chdir类:
    def __init __(self,newPath):
        self.savedPath = os.getcwd()
        os.chdir(newPath)

    def __enter __(self):
        返回自我

    def __exit __(自身,类型,值,回溯):
        os.chdir(self.savedPath)

def run(ui,repo,** kwargs):
    如果kwargs ['source'] =='push':
        与Chdir(repo.root)更改为:
            导入本地提交
            sys.exit(localcommit.main(ui,repo,** kwargs))

然后localcommit.py,存储库目录中的会由globalcommit-script 运行,因此每个存储库都可以维护自己的自定义commit-script。