Как изменить поведение по умолчанию журнала hg, чтобы показывать только предков?

Можно ли изменить поведение по умолчанию hg log показывать только нынешних предков?

Т.е. это:

hg log --rev "reverse(ancestors(.))"

Дело в том, я всегда хочу hg log сделать это.

Я знаю, что я мог бы сделать что-то подобное в моем .bashrc но мне было интересно, был ли меркуриальный способ сделать это.

hg () {

    if [[ $2 -eq "log" ]]
    then
        # TODO: Append other arguments to this...
        hg log --rev "reverse(ancestors(.))" 
    else
        # Run the command
    fi
}

2 ответа

Решение

Функция псевдонима hg это правильный инструмент для этого. Хотя вы можете создавать псевдонимы, которые изменяют поведение встроенных команд по умолчанию, hg config (раздел "alias") имеет следующее сказать:

Note:
   It is possible to create aliases with the same names as existing
   commands, which will then override the original definitions. This is
   almost always a bad idea!

Рекомендуемая практика - создать псевдоним. alog и просто тренируйте пальцы, чтобы печатать hg alog вместо hg log, Размещение этого в ~/.hgrc (или эквивалент) сделает это:

[alias]
alog = log --rev "reverse(ancestors(.))"

Почему это лучшее решение? Не только псевдоним для log заблокировать вам доступ к исходному поведению (требуя другого псевдонима, который возвращает исходное значение); что еще более важно, как только вы начнете ожидать нестандартного поведения, рано или поздно вы получите немного при вводе hg log в другом аккаунте или контексте, который не контролируется вашим .hgrc, (Typing hg alog при таких же обстоятельствах возникнет только ошибка "неизвестная команда").

Хотя вы можете сделать это с помощью псевдонима (см. Ниже), самый чистый подход - это расширение:

from mercurial import extensions, commands

testedwith = "3.5"

default_log_rev = "reverse(ancestors(.))"

def override_log(original_cmd, ui, repo, *pats, **opts):
  have_rev = False
  for opt in ["rev", "branch"]:
    if opts.has_key(opt) and opts[opt]:
      have_rev = True
  if not have_rev:
    opts["rev"] = [default_log_rev]
  return original_cmd(ui, repo, *pats, **opts)

def uisetup(ui):
  extensions.wrapcommand(commands.table, "log", override_log)

Это будет использовать только ваш новый по умолчанию, если ни --rev ни --branch варианты (или их сокращения -r а также -b) из log установлены, тем самым сохраняя исходное поведение, если один из них предоставляется.

Вы можете установить такое расширение обычным способом, то есть, добавив что-то вроде следующего в ваш ~/.hgrc (при условии, что приведенный выше код находится в /path/to/logdefault.py):

[extensions]
logdefault = /path/to/logdefault.py

Если расширение является для вас супертяжелым, вы также можете создать псевдоним в своем ~/.hgrc:

[alias]
log = log --rev 'reverse(ancestors(.))'
rawlog = !$HG --config alias.log=log log "$@"

Второй псевдоним (rawlog) существует, так что вы все еще можете получить доступ к оригиналу log функциональность.

Другие вопросы по тегам