2016-03-02 51 views
0

是否可以更改默认行为hg log以仅显示当前祖先?如何更改hg日志的默认行为以仅显示祖先?

即此:

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 
} 

回答

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时得到一点信息,该信息不受.hgrc控制。 (在相同情况下输入hg alog只会产生“未知命令”错误)。

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也不--branch选项(或它们的缩写-r-blog被设置,因此如果其中之一被提供则保留原始行为。

您可以用通常的方式安装这样的扩展,通过添加类似以下到您的~/.hgrc IE(假设上面的代码是在/path/to/logdefault.py):

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

如果某分机是重量级的你,你也可以在你~/.hgrc创建别名:

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

第二别名(rawlog)的存在使得您仍然可以访问原来的log功能。

+0

什么是关于扩展的“更清洁”?对于一些可以用简单的选项完成的事情来说,这似乎是一种可怕的矫枉过正,因此可以很容易地将其封装在一个别名中。 – alexis

+0

它更清洁,不会破坏'hg log -r '的正常功能。扩展可以检查是否已经有修改参数,并且在这种情况下不提供默认参数;一个别名不能。 –

+0

对,那么当你重写原来的名字时有必要......谢谢。 – alexis

相关问题