【问题标题】:Mercurial Pre-Commit Hook: How to hook to python program in current directory?Mercurial Pre-Commit Hook:如何挂钩到当前目录中的 python 程序?
【发布时间】:2011-10-13 08:01:19
【问题描述】:

我正在尝试创建一个在提交被推送到主存储库时运行的 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

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

【问题讨论】:

  • 使用绝对路径是否有效?
  • 提供绝对路径会破坏整个目的。开发人员将项目克隆到不同的目录,他们一次将处理多个项目。不得不不断修改mercurial.ini 似乎不是最好的解决方案。我确实找到了解决方案,我很快就会发布。
  • 我试图确定问题是您使用的特定相对路径还是其他原因。
  • 是的。相对路径不起作用,因为在调用钩子脚本时,工作目录应该是绝对路径,或者应该是 PYTHONPATH 中的 python 模块。

标签: python windows mercurial pre-commit-hook


【解决方案1】:

我通过 IRC for Mercurial 获得了这个解决方案。正如我的一个 cmets 中所述,钩子的脚本应该指定为绝对路径,或者它应该是 PYTHONPATH 中的 python 模块。因此,pmezard 通过 IRC 建议我应该有一个固定脚本来调用本地 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 提交脚本运行,因此每个存储库都可以维护自己的自定义提交脚本。

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多