是否有“工作目录”的Mercurial revset?

时间:2016-02-04 16:01:52

标签: mercurial mercurial-revsets

我正在尝试编写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不是一种选择;参数必须符合一套工具使用的样式。

1 个答案:

答案 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,其中任何一个版本可能是工作目录:

  1. 如果REV1和REV2都代表工作目录,则不执行任何操作。
  2. 如果REV1代表工作目录,而REV2是实际修订版,请使用hg diff -r REV2
  3. 如果REV1是实际修订版,而REV2代表工作目录,请使用hg diff --reverse -r REV1
  4. 如果REV1和REV2都是实际修订版,请使用hg diff -r REV1 -r REV2