mercurial API: как мне получить 40-значный хэш версии из входящей команды?

Я использую API-интерфейс python mercurial в своем проекте.

from mercurial import ui, hg, commands
from mercurial.node import hex

user_id = ui.ui()
hg_repo = hg.repository(user_id, '/path/to/repo')

hg_repo.ui.pushbuffer()
some_is_coming = commands.incoming(hg_repo.ui, hg_repo, source='default',
                                       bundle=None, force=False)
if some_is_coming:
    output = hg_repo.ui.popbuffer()

In [95]: output
Out[95]: 'comparing with ssh:host-name\nsearching for changes\nchangeset:   1:e74dcb2eb5e1\ntag:         tip\nuser:        that-is-me\ndate:        Fri Nov 06 12:26:53 2015 +0100\nsummary:     added input.txt\n\n'

Извлечь краткую информацию об узле e74dcb2eb5e1 будет несложно. Что мне действительно нужно, так это 40-значный шестнадцатеричный идентификатор версии. Есть ли способ получить эту информацию без предварительного извлечения репо?


person LarsVegas    schedule 06.11.2015    source источник


Ответы (1)


Вам нужно указать шаблон, который предоставляет полный хэш узла как часть его вывода. Кроме того, commands.incoming возвращает числовой код ошибки, где ноль указывает на успех. т.е. вам нужно что-то вроде:

from mercurial import ui, hg, commands
from mercurial.node import hex

user_id = ui.ui()
hg_repo = hg.repository(user_id, '/path/to/repo')

hg_repo.ui.pushbuffer()
command_result = commands.incoming(hg_repo.ui, hg_repo, source='default',
    bundle=None, force=False, template="json")
if command_result == 0:
    output = hg_repo.ui.popbuffer()
    print output

Еще две вещи: во-первых, вы также получите диагностический вывод ("сравнение с..."), который можно подавить с помощью -q (или ui.setconfig("ui", "quiet", "yes")). Однако обратите внимание, что этот параметр также повлияет на шаблоны по умолчанию, и вам, возможно, придется предоставить свой собственный. Во-вторых, рекомендуется установить переменную среды HGPLAIN, чтобы псевдонимы и значения по умолчанию из вашего .hgrc игнорировались (см. hg help scripting).

В качестве альтернативы вы можете использовать командный сервер Mercurial, реализованный в hglib (доступен через pip install python-hglib).

import hglib

client = hglib.open(".")
# Standard implementation of incoming, which returns a list of tuples.
# force=False and bundle=None are the defaults, so we don't need to
# provide them here.
print client.incoming(path="default")
# Or the raw command output with a custom template.
changeset = "[ {rev|json}, {node|json}, {author|json}, {desc|json}, {branch|json}, {bookmarks|json}, {tags|json}, {date|json} ]\n"
print client.rawcommand(["incoming", "-q", "-T" + changeset])
person Reimer Behrends    schedule 06.11.2015
comment
Очень интересно, спасибо, что поделились! Мне удалось получить информацию, используя peer: peer = hg.peer(ui.ui(), {}, remote_host), а затем node.hex(peer.lookup(short_hash), где short_hash = 'e74dcb2eb5e1'. Что, конечно, имеет свои недостатки. - person LarsVegas; 07.11.2015
comment
Очень интересно. Интересно: где задокументировано форматирование |json? Моя документация hg, кажется, не говорит мне (по крайней мере, где я смотрю) - person planetmaker; 07.11.2015
comment
@planetmaker: см. hg help scripting. Обратите внимание, что стили json и xml являются экспериментальными и могут измениться в будущем. - person Reimer Behrends; 08.11.2015
comment
О хо. Я бы никогда не догадался, что тема помощи тоже. Очень приятно читать. Большое спасибо. - person planetmaker; 08.11.2015