Mercurial Pre-Commit Hook: как подключиться к программе python в текущем каталоге?

Я пытаюсь создать крючок 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\UserName\mercurial.ini) я добавил следующий оператор:

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

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


person Vite Falcon    schedule 26.07.2011    source источник
comment
Это работает, если вы используете абсолютный путь?   -  person agf    schedule 26.07.2011
comment
Предоставление абсолютного пути побеждает всю цель. Разработчики клонируют проекты в разные каталоги, и они будут работать более чем над одним проектом одновременно. Постоянное изменение mercurial.ini не кажется лучшим решением. Я нашел решение, которое я опубликую в ближайшее время.   -  person Vite Falcon    schedule 26.07.2011
comment
Я пытался определить, была ли проблема связана с конкретным относительным путем, который вы использовали, или с чем-то еще.   -  person agf    schedule 26.07.2011
comment
да. Относительные пути не работают, потому что рабочий каталог при вызове скрипта ловушки должен быть либо абсолютным путем, либо должен быть модулем python в PYTHONPATH.   -  person Vite Falcon    schedule 26.07.2011


Ответы (1)


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

person Vite Falcon    schedule 26.07.2011