我正在尝试编写hg diff
脚本并希望接受将传递给-r
选项的参数,如果没有给出参数,则默认为工作目录。但是,似乎没有值可以传递给-r
以指示“工作目录”,而是必须完全省略该选项,这会导致我的脚本中出现以下逻辑:
if [ -z "${to_rev}" ]; then
to_rev_args=""
else
to_rev_args="-r ${to_rev}"
fi
hg diff ... ${to_rev_args}
我相信这是唯一的方法吗?我们可以假设让脚本接受-r
参数并将整个事情传递给Mercurial不是一种选择;参数必须符合一套工具使用的样式。
答案 0 :(得分: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,其中任何一个版本可能是工作目录:
hg diff -r REV2
。hg diff --reverse -r REV1
。hg diff -r REV1 -r REV2
。