Mercurial Pre-Commit Hook: как зацепить программу Python в текущем каталоге?

StackOverflow https://stackoverflow.com/questions/6829112

Вопрос

Я пытаюсь создать ртутный крючок, который работает, когда коммиты доставляются в основной репозиторий. Я создал сценарий 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 и, следовательно, каждый репозиторий может поддерживать свой собственный индивидуальный коммит-фонд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top