Вызвать команду mercurial ("hg update") из ловушки Python
У меня установлен Mercurial hgweb на 64-битной Windows 2008 и IIS. Расположение репозиториев является сетевым ресурсом.
Я хочу создать ловушку в хранилище для выдачи команды "hg update" на чейнджер. Я не могу использовать внешний хук, так как это приведет к запуску cmd.exe с общим сетевым ресурсом в качестве рабочего каталога (и cmd.exe не поддерживает сетевые ресурсы).
Поэтому я ищу, чтобы найти пример ловушки Python, который вызывает команду Mercurial. Я заметил, что есть модуль mercurial.commands, но я не могу найти какие-либо примеры на веб-сайтах, и я не очень опытен с Python.
Есть ли примеры для вызова команды mercurial с использованием ловушки Python - и возможно ли сделать все это в hgrc, или мне нужен внешний файл.py?
2 ответа
Вдохновленный ответом Мартина, я подумал, что попытаюсь написать какой-нибудь 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
Я бы изменил строку, где выполняется команда, чтобы специально обновить до "tip". Если вы используете именованные ветви, то, как указано выше, команда не будет иметь никакого эффекта. Я считаю, что это было бы лучше: commands.update(интерфейс, репо, репо ['tip'])
Вам нужен внешний .py
файл для расширения Python. Чтобы использовать внутренний API, как будто Mercurial был вызван из командной строки, используйте
from mercurial.dispatch import dispatch, request
dispatch(request(['update']))
Это синтаксис после Mercurial 1.9. В более ранних версиях вы бы использовали
from mercurial.dispatch import dispatch
dispatch(['update'])
Список, который вы передаете request
или же dispatch
аргументы следующие hg
в командной строке.