我正在尝试创建一个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脚本,但是当我执行此操作时则不会。任何人都可以帮助我阐明这个问题吗?非常感谢。
答案 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.py
由global
commit-script运行,因此每个存储库都可以维护自己的自定义提交脚本。