Есть ли 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, где любая ревизия может быть рабочим каталогом:

  1. Если оба REV1 и REV2 представляют рабочий каталог, ничего не делайте.
  2. Если REV1 представляет рабочий каталог, а REV2 - реальную ревизию, используйте hg diff -r REV2,
  3. Если REV1 является актуальной версией, а REV2 представляет рабочий каталог, используйте hg diff --reverse -r REV1,
  4. Если и REV1, и REV2 являются актуальными ревизиями, используйте hg diff -r REV1 -r REV2,
Другие вопросы по тегам