【问题标题】:Is there a Mercurial revset for "working directory"?“工作目录”是否有 Mercurial 修订集?
【发布时间】:2016-02-04 16:01:52
【问题描述】:

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

【问题讨论】:

  • 嗯,不带选项的hg diff 等价于hg diff -r .,而. 表示工作目录的parent。使用一个版本参数,Mercurial 会将工作目录与指定的版本进行比较(如果省略,则与.)进行比较。您能否更具体一点,即您试图将工作目录(或任何其他修订版)与什么进行比较?
  • 我想找到两个状态之间的差异。默认情况下,“之前”状态是当前父级的最后一个公共祖先,“之后”状态是工作目录,但脚本可以接受任一状态的参数并将它们传递给 hg diff。无条件地将参数传递给 hg diff 比根据脚本参数的值有条件地传递它们更容易,因此,我想知道脚本的默认“after”参数的值,它在传递时相当于“工作目录”到 hg 差异。

标签: mercurial mercurial-revsets


【解决方案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

【讨论】:

  • 我没有检查以确保它有效,但它的存在意味着我的问题的答案是“否”,我感谢补丁的贡献。
  • 正确,无法将工作目录指定为修订版,我正在描述一种解决方法;如果不清楚,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多