Mercurial Pre-Commit Hook: Как подключить программу Python в текущем каталоге? - PullRequest
9 голосов
/ 26 июля 2011

Я пытаюсь создать перехват Mercurial, который запускается, когда коммиты помещаются в главный репозиторий. Я создал скрипт 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 \ Имя_пользователя \ mercurial.ini) я добавил следующее утверждение:

[hooks]
prechangegroup = python:./commit.py:getV1ID

Сценарий python запускается, если я помещаю его в папку .hg, но не когда я делаю это. Может ли кто-нибудь помочь мне пролить свет на этот вопрос? Большое спасибо.

1 Ответ

6 голосов
/ 26 июля 2011

Я получил это решение через IRC для Mercurial.Как указано в одном из моих комментариев, сценарий для ловушки должен быть указан как абсолютный путь, или это должен быть модуль python в PYTHONPATH.Следовательно, pmezard по IRC предложил мне иметь фиксированный скрипт, который вызывает локальный commit.py.Это можно сделать, как показано ниже:

В mercurial.ini подключите «глобальный» python-скрипт, который находится в каталоге .hg домашнего пользователя, как показано ниже:

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

«глобальный» python-скрипт 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 и, следовательно, каждым репозиториемможет поддерживать собственный настроенный скрипт коммита.

...