2012-01-23 5 views
4

У меня есть Mercurial hgweb, настроенный на Windows 2008 64 бит и IIS. Расположение репозиториев - это сетевой ресурс.Вызвать меркурийную команду («hg update») из крючка python

Я хочу создать крючок в репозитории, чтобы выпустить команду «hg update» на changeroup. Я не могу использовать внешний крюк, так как это запустит cmd.exe с сетевым ресурсом в качестве рабочего каталога (а cmd.exe не поддерживает сетевые ресурсы).

Поэтому я ищу, чтобы найти пример крюка python, который вызывает команду mercurial. Я замечаю, что есть модуль mercurial.commands, но я не могу найти примеров в Интернете, и я не очень опытен с Python.

Есть ли примеры для вызова команды mercurial с помощью Python-крючка - и возможно ли это сделать в hgrc, или мне нужен внешний .py-файл?

ответ

3

Вдохновленный ответом Мартина, я думал, что попытаюсь написать какой-нибудь Python, и вот как мне удалось заставить его работать. Я использую Mercurial 2.0.2 и модуль mercurial.commands (который, AFAIK, включен в пакет Mercurial Python).

Я создал myhook.py файл на сервере:

import mercurial.commands 

def update(ui, repo, **kwargs): 
    mercurial.commands.update(ui, repo) 

Затем в моем .hg файле/hgrc на сервере, я добавил следующее:

[hooks] 
changegroup = python:C:\path\to\my\myhook.py:update 

Я хотел бы изменить строка, в которой выполняется команда, для конкретного обновления до «подсказки». Если вы используете именованные ветви, то, поскольку она выше команды, не будет иметь никакого эффекта. Я считаю, что это было бы лучше: commands.update (ui, repo, repo ['tip'])

3

Для расширения Python необходим внешний файл .py. Чтобы использовать внутренний API, как если бы Mercurial был вызван из командной строки, а затем использовать

from mercurial.dispatch import dispatch, request 
dispatch(request(['update'])) 

Это синтаксис после Mercurial 1.9. В более ранних версиях нужно использовать

from mercurial.dispatch import dispatch 
dispatch(['update']) 

список вы передаете request или dispatch это аргументы следующие hg в командной строке.

+0

Thanks Martin - Я обнаружил, что есть модуль mercurial.commands, который я также могу использовать, - и мне удалось заставить его работать - см. мой ответ ниже. –

+0

@ LeeAtkinson: Это также элегантное решение! –