如何将hg日志的默认行为更改为仅显示祖先?

时间:2016-03-02 17:04:24

标签: mercurial hg-log

是否可以更改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 个答案:

答案 0 :(得分:4)

虽然你可以使用别名来实现这一点(见下文),但这里最干净的方法是扩展:

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的{​​{1}}和--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功能。

答案 1 :(得分:1)

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时,您迟早会得到一点不受{{1 }}。 (在相同情况下键入.hgrc只会产生"未知命令"错误。)