查找逻辑更改日志

Finding logical change log

我正在尝试找到一种获取 oddly-specific 日志集的方法。这是另一个程序的输入,我在其中解析日志并用它们做一些事情,但理想情况下,尽可能多地使用 hg 命令来最小化我的 post-processing.[=12= 会很好]

我想要所有标记为 "O" 和 none 的 "X" 提交:

A5 O
   |
   |
   |
A4 O   X B4  X C2
   |\  |     |
   | \ |     |
   |  \|     |
A3 O   O B3  |
   |   |     |
   |   |     |
   |   |     |
A2 O   O B2  X C1
   |   |     |
   |   |     |
   |   |     |
   |   O B1  |
   |  /|     |
   | / |     |
   |/  |     |
A1 X   X B0  X C0
   |
   |
   |
A0 X

鉴于此图表,其中 A、B 和 C 是不同的分支,我们的用户需要 A2 和 A5 之间的更改日志。问题是他们还想知道合并到 A 中的任何分支的其余历史记录。

hg log -r A2:A5 将 return:

首先,我根本不想要 C。它没有连接到这里的任何东西。 但我想要的是 B1,或者更一般地说,自上次合并到 A 以来 B 中的所有更改。我也不想要 B4。所以如果我的尾巴连接得更远,我需要找到其余的。令人恼火的是,他们想要A1。

我目前的计划是日志A2:A5,然后我通过解析结果创建一个树结构。最后,我寻找任何悬挂的尾巴,并获取该尾巴和 A2 以及 A2 的共同祖先的日志,仅用于该分支。这有点令人费解和疯狂。

有什么想法或建议可以使这变得简单并减少我必须做的工作 post-process?

对您当前方法的改进是 hg log -r "A5 % parents(A2)"。这相当于 A5 及其所有祖先,减去 A1 及其任何祖先,因此 returns:

  • A2A3A4A5
  • B0B1B2B3

值得注意的是,以下内容将被排除在外:

  • C
  • 中的任何变更集
  • B 中尚未合并到 A 中的变更集(例如 B4

在生成的 revset 中只有一个不需要的变更集:B0。删除它的标准对我来说有点不清楚(看到祖先 A0B0C0 可能会有所帮助,因为它们都将在某个时候源自一个公共节点).我认为在构建 revset 之前,需要澄清在合并到 A2::A5 的分支上倒退的停止条件。

但是,该 revset 可能会非常复杂,而对上述 revset 进行后处理可能会更容易。

编辑:一些进一步的想法

你最好做多个不同的 revsets:

  1. hg log -r "A2::A5" returns 从 A2A5 的 DAG(即 A2A3A4A5)
  2. hg log -r "(parents( A2::A5 & merge() ) - ( A2::A5 + parents(A2) ) )" 将 return 任何已合并 DAG 从 A2A5 的变更集(即 B3)

第一个将直接转到您的最终结果集。第二个你可以迭代(假设还有一个分支 D 和一个 D3 合并到感兴趣的分支中)并遍历每个分支到停止条件,然后将相关的变更集添加到最终结果中设置。

迭代合并的分支以在正确的时间停止可能比尝试修剪错误包含的变更集的更大结果集更简单