"working directory" 是否有 Mercurial revset?

Is there a Mercurial revset for "working directory"?

我正在尝试编写 hg diff 脚本并希望接受将传递给 -r 选项的参数,如果没有给出参数,则默认为工作目录。但是,似乎没有值可以传递给 -r 以指示 "working directory",而是必须完全省略该选项,这导致我的脚本中出现以下逻辑:

if [ -z "${to_rev}" ]; then
  to_rev_args=""
else
  to_rev_args="-r ${to_rev}"
fi

hg diff ... ${to_rev_args}

我认为这是唯一的方法对吗?我们可以假设让脚本接受一个 -r 参数并将整个事情传递给 Mercurial 不是一个选项;参数必须符合一套工具使用的样式。

以下 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