Mercurial预先提交挂钩:如何挂钩到当前目录中的python程序?

我试图创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提交脚本运行,因此每个存储库都可以维护自己的自定义提交脚本。