9

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

# 提交.py

从 mercurial 进口 ui, hg
从 mercurial.i18n 导入 gettext 作为 _

def getV1ID(ui, repo, **kwargs):
    ui.write("钩子有效!!!")
    v1id = ui.prompt('输入 VersionOne ID')
    ui.write('版本号:'+v1id)

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

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

[钩子]
prechangegroup = python:./commit.py:getV1ID

如果我将它放在.hg文件夹中,python 脚本就会运行,但当我这样做时不会。谁能帮我阐明这个问题?非常感谢。

4

1 回答 1

6

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

mercurial.ini中,挂钩到驻留在.hg用户主目录中的“全局”python 脚本,如下所示:

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

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

从 mercurial 进口 ui, hg
导入操作系统

课程目录:
    def __init__(self, newPath):
        self.savedPath = os.getcwd()
        os.chdir(新路径)

    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:
            导入本地提交
            sys.exit(localcommit.main(ui, repo, **kwargs))

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

于 2011-07-26T16:07:57.413 回答