Mercurial Pre-Commit Hook: как зацепить программу Python в текущем каталоге?
-
26-10-2019 - |
Вопрос
Я пытаюсь создать ртутный крючок, который работает, когда коммиты доставляются в основной репозиторий. Я создал сценарий 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
не может быть глобальным сценарием Python, который может находиться в .hg
папка.
Чтобы Mercurial запустить местный commit.py
, в моем файле Mercurial.ini (в C: users username mercurial.ini) я добавил следующее оператор:
[hooks] prechangegroup = python:./commit.py:getV1ID
Сценарий Python работает, если я помещаю его внутрь .hg
Папка, но не когда я это делаю. Кто -нибудь может помочь мне пролить свет на этот вопрос? Большое спасибо.
Решение
Я получил это решение по IRC для Mercurial. Как указано в одном из моих комментариев, сценарий для крючка должен быть указан как абсолютный путь или он должен модуль Python в PythonPath. Следовательно, меня предложили pmezard
над IRC, что у меня должен быть фиксированный сценарий, который вызывает локальный commit.py
. Анкет Это можно сделать, как показано ниже:
В mercurial.ini
, клейте к «глобальному» питону, который находится в .hg
каталог дома пользователя, как показано ниже:
[hooks] preoutgoing = python:%USERPROFILE%\.hg\commit.py:run
«Глобальный» питон-сценария, 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-Fript и, следовательно, каждый репозиторий может поддерживать свой собственный индивидуальный коммит-фонд.