如何更改 hg 日志的默认行为以仅显示祖先?
How to change default behaviour of hg log to only show ancestors?
是否可以更改 hg log
的默认行为以仅显示当前祖先?
即:
hg log --rev "reverse(ancestors(.))"
事实是,我总是希望hg log
这样做。
我知道我可以在我的 .bashrc
中做这样的事情,但我想知道是否有一种灵活的方法来做到这一点。
hg () {
if [[ -eq "log" ]]
then
# TODO: Append other arguments to this...
hg log --rev "reverse(ancestors(.))"
else
# Run the command
fi
}
虽然您可以使用别名来完成此操作(见下文),但这里最简洁的方法是扩展:
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)
如果 log
的 --rev
和 --branch
选项(或其缩写 -r
和 -b
)都没有,这将仅使用您的新默认值已设置,因此如果提供其中之一,则保留原始行为。
您可以用通常的方式安装这样的扩展,即在您的 ~/.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
功能。
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
的别名不仅会阻止您访问原始行为(需要 另一个 别名来恢复原始含义);更重要的是,一旦您开始期待非标准行为,当您在不受您的 .hgrc
控制的另一个帐户或上下文中键入 hg log
时,您迟早会受到影响。 (在相同情况下输入 hg alog
只会产生 "unknown command" 错误)。
是否可以更改 hg log
的默认行为以仅显示当前祖先?
即:
hg log --rev "reverse(ancestors(.))"
事实是,我总是希望hg log
这样做。
我知道我可以在我的 .bashrc
中做这样的事情,但我想知道是否有一种灵活的方法来做到这一点。
hg () {
if [[ -eq "log" ]]
then
# TODO: Append other arguments to this...
hg log --rev "reverse(ancestors(.))"
else
# Run the command
fi
}
虽然您可以使用别名来完成此操作(见下文),但这里最简洁的方法是扩展:
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)
如果 log
的 --rev
和 --branch
选项(或其缩写 -r
和 -b
)都没有,这将仅使用您的新默认值已设置,因此如果提供其中之一,则保留原始行为。
您可以用通常的方式安装这样的扩展,即在您的 ~/.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
功能。
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
的别名不仅会阻止您访问原始行为(需要 另一个 别名来恢复原始含义);更重要的是,一旦您开始期待非标准行为,当您在不受您的 .hgrc
控制的另一个帐户或上下文中键入 hg log
时,您迟早会受到影响。 (在相同情况下输入 hg alog
只会产生 "unknown command" 错误)。