我试图创build一个Mercurial挂钩,当提交被推送到主存储库时运行。 我创build了一个python脚本,如下所示:
#commit.py 从mercurial import ui,hg 从mercurial.i18n导入gettext作为_ def getV1ID(ui,repo,** kwargs): ui.write(“The hook works !!!”) v1id = ui.prompt('inputVersionOne ID') ui.write('VersionOne ID:'+ v1id)
对于每个分支,这个commit.py
都是重复的,因为它包含了在代码被推送到主要的存储库之前需要运行的机制。 只有这些预推机制通过,推动才能成功。 用户可以修改他们的本地commit.py,以便他们只运行这些预推操作的一个子集,这取决于他们正在进行的项目,每个人一次可以在一个以上的项目中工作。 因此, commit.py
不能是一个可以驻留在.hg
文件夹中的全局python脚本。
为了让mercurial在我的mercurial.ini文件(在C:\ Users \ UserName \ mercurial.ini)中运行本地的commit.py
,我添加了下面的语句:
[钩] prechangegroup = python:./ commit.py:getV1ID
python脚本运行,如果我把它放在.hg
文件夹,但不是当我这样做。 任何人都可以帮助我解决这个问题? 非常感谢。
我通过IRC为Mercurial获得了这个解决方案。 正如我在其中一个评论中所述,钩子的脚本应该被指定为绝对路径,或者应该是PYTHONPATH中的一个python模块。 因此,我被IRC建议,我应该有一个固定的脚本来调用本地的commit.py
。 这可以如下所示完成:
在mercurial.ini
,钩住驻留在用户家的.hg
目录中的“全局”python脚本,如下所示:
[钩] preoutgoing = python:%USERPROFILE%\。hg \ commit.py:run
' commit.py
脚本, commit.py
看起来像这样:
从mercurial import ui,hg 进口操作系统 class Chdir: def __init __(self,newPath): self.savedPath = os.getcwd() os.chdir(NEWPATH) def __enter __(self): 回报自我 def __exit __(self,type,value,traceback): os.chdir(self.savedPath) def run(ui,repo,** kwargs): 如果kwargs ['source'] =='push': 与Chdir(repo.root)一样dirchanged: 导入localcommit sys.exit(localcommit.main(ui,repo,** kwargs))
然后,存储库目录中的localcommit.py
将由global
提交脚本运行,因此每个存储库都可以维护自己的自定义提交脚本。