Есть ли Mercurial revset для "рабочего каталога"?
Я пытаюсь написать сценарий hg diff
и хочу принять аргумент, который будет передан -r
и, если аргумент не указан, по умолчанию используется рабочий каталог. Однако, похоже, что нет значения, которое можно передать -r
чтобы указать "рабочий каталог", и вместо этого опция должна быть полностью опущена, что приводит к следующей логике в моем скрипте:
if [ -z "${to_rev}" ]; then
to_rev_args=""
else
to_rev_args="-r ${to_rev}"
fi
hg diff ... ${to_rev_args}
Правильно ли я верю, что это единственный путь? Можно предположить, что создание сценария принимает -r
спорить и передавать все это Mercurial не вариант; аргументы должны соответствовать стилю, используемому набором инструментов.
1 ответ
Следующее расширение Mercurial должно делать то, что вам нужно, позволяя вам указать рабочий каталог как псевдо-ревизию с именем "=
".
"""wdir diff
Allows specifying the working directory as a pseudo revision.
"""
testedwith = "3.5"
wdir_pseudo_rev = "="
from mercurial import commands, extensions
def wrap_diff(original_cmd, ui, repo, *pats, **opts):
revargs = opts["rev"]
if len(revargs) == 1:
if revargs[0] == wdir_pseudo_rev:
return
elif len(revargs) == 2:
if revargs[0] == wdir_pseudo_rev:
if revargs[1] == wdir_pseudo_rev:
return
else:
revargs.remove(wdir_pseudo_rev)
elif revargs[1] == wdir_pseudo_rev:
revargs.remove(wdir_pseudo_rev)
opts["reverse"] = not opts["reverse"]
return original_cmd(ui, repo, *pats, **opts)
def uisetup(ui):
extensions.wrapcommand(commands.table, "diff", wrap_diff)
Та же самая логика также может быть довольно легко закодирована в скрипте или другом программном коде, если вы не хотите иметь дело с расширением, вам просто нужно различить четыре разных случая:
Предположим, что вы хотите изменить REV1 и REV2, где любая ревизия может быть рабочим каталогом:
- Если оба REV1 и REV2 представляют рабочий каталог, ничего не делайте.
- Если REV1 представляет рабочий каталог, а REV2 - реальную ревизию, используйте
hg diff -r REV2
, - Если REV1 является актуальной версией, а REV2 представляет рабочий каталог, используйте
hg diff --reverse -r REV1
, - Если и REV1, и REV2 являются актуальными ревизиями, используйте
hg diff -r REV1 -r REV2
,