2016-02-04 3 views
0

Я пытаюсь выполнить скрипт hg diff и хочу принять аргумент, который будет передан в параметр -r, и если аргумент не указан, по умолчанию рабочий каталог. Тем не менее, представляется, что нет никакого значения, которые могут быть переданы в -r указать «рабочий каталог», а вместо этого параметр должен быть полностью опущен, что приводит к следующей логике в моем сценарии:Есть ли Mercurial revset для «рабочего каталога»?

if [ -z "${to_rev}" ]; then 
    to_rev_args="" 
else 
    to_rev_args="-r ${to_rev}" 
fi 

hg diff ... ${to_rev_args} 

Я правильно полагая, что это единственный путь? Мы можем предположить, что принятие сценария принимает аргумент -r и передача всего этого в Mercurial не является вариантом; аргументы должны соответствовать стилю, используемому набором инструментов.

+1

Ну, 'hg diff' без параметров эквивалентно' hg diff -r .', а '.' обозначает * parent * рабочего каталога. С одним аргументом в редакции Mercurial будет сравнивать рабочий каталог с тем, что указано в указанной версии (и, если опущено, - '.'). Можете ли вы быть более конкретным, т. Е. Что вы пытаетесь отличить рабочий каталог (или любую другую ревизию) от? –

+0

Я хочу найти различия между двумя состояниями. По умолчанию состояние «before» является последним публичным предком текущего родителя, а «after» - рабочим каталогом, но сценарий может принимать аргументы для любого состояния и передавать их на hg diff. Легче безоговорочно передать аргументы hg diff, чем условно передать их на основе значений аргументов скрипта, поэтому я хотел бы знать значение для аргумента по умолчанию «после», которое эквивалентно «рабочему каталогу» при его передаче до hg diff. –

ответ

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.
+0

Я не проверял, чтобы это работало, но его существование означает, что ответ на мой вопрос «нет», и я ценю вклад патча. –

+0

Правильно, нет способа указать рабочий каталог как ревизию, и я описывал обходной путь; мои извинения, если это было непонятно. –

Смежные вопросы