检查当前目录是否在mercurial下的最快方法是什么?

时间:2017-07-01 19:20:11

标签: mercurial zsh

我试图加快我的zsh主题提示,hg检查比git慢一点。这导致在使用hg插件时显示较慢的提示。

对于git,我们使用git rev-parse --is-inside-work-tree,这是标准且非常快。

对于hg,我试图找到类似的命令,但没有什么是快的:

  • hg --cwd $PWD root
  • hg summary
  • hg root
  • hg -q stat

所有这些命令都有效,但效率不如git rev-parse --is-inside-work-tree

还尝试了这个目前最好的小脚本。我能做些什么来加速这个剧本呢?

is_dir_hg() {
  local root="$(pwd -P)"
  while [[ $root && ! -d $root/.hg ]]
  do
    root="${root%/*}"
  done

  echo "$root"
}

请注意,即使我们不在根目录中,该解决方案也必须检测hg目录。

2 个答案:

答案 0 :(得分:5)

我怀疑你可以比你的脚本做得更好,除非你编写了一个相同的编译程序。

Git的测试,使用git rev-parse,用C编码并编译成一个简单的二进制文件,因此运行得非常快。 Mercurial是用Python编写的,因此您需要支付Python启动费用。此外,您在Mercurial中加载的任何扩展都需要搜索扩展路径和额外的运行时加载,这使得Mercurial比Git更灵活,但速度更慢。

如果hg root足够快,您可以同时运行hg rootgit rev-parse --show-toplevel(如果需要,可以解析符号链接)并查看哪一个更接近当前目录(再次解决符号链接),如果两者都成功。大概你已经尝试过这个并且速度不够快。

您可以像在示例代码中那样使用自己的路径搜索。但是,您可以搜索.hg.hg,而不是只是搜索.git,并在找到任何一个时停止。许多shell有许多提示库,其中有几个使用这种方法。

所有方法都有点容易出错,特别是因为可能在Mercurial存储库中有一个Git存储库,反之亦然(例如,/path/to/current/working/dir可能是current级别的Mercurial和Git在dir级别,反之亦然)。同时,.git目录的存在不足以保证您在有效的Git工作树中。例如,Git认为目录只是在以下情况下才是存储库:

  • 它可以找到Git目录本身(可能使用$GIT_DIR; Mercurial似乎没有覆盖Git方式的环境变量;如果没有$GIT_DIR,则从当前目录开始并爬上需要的话);和
  • 找到的Git目录包含一个名为HEAD的文件;和
  • 找到的目录包含refs目录;和
  • $GIT_OBJECT_DIRECTORY指向目录,或找到的目录包含objects/目录。

攀登到root的搜索通常会测试并停止在挂载点,因此如果$HOME/foo 是一个Git存储库,但您当前的工作目录是{{1这是一个挂载点,这是一个Git存储库,Git不会将$HOME/foo/bar检测为存储库。简单的shell外路径搜索会将$HOME/foo检测为存储库。

默认情况下,Mercurial只查找每个父目录中的$HOME/foo目录,因此您可以在此处更加坚定。

请注意,您甚至可以拥有一个同时具有.hg.hg个子目录的目录,两个都是有效的存储库(我已经为了实验目的而这样做了;它有效,它只是一点点棘手:您将要忽略其他VCS的VCS控制文件)。这可能不是你需要处理的东西,这很好,因为没有明显正确的方法来处理它。 : - )

答案 1 :(得分:0)

我将使用hg id,它也可以有效地设置返回码。