如何使用python脚本提取mercurial中最后两个标记之间的变更集(或提交)?

2024-09-28 03:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了以下脚本:

#!/usr/bin/python

import os

os.system('hg tags > tags.txt')

file = 'tags.txt'

path = os.path.join(os.getcwd(), file)

fp = open(path)

for i, line in enumerate(fp):

    if i == 1:

    latestTagLine = line`      

    elif i == 2:

        previousTagLine = line    

    elif i > 4:

        break

fp.close()

revLatestTag = latestTagLine.split(':')

l = revLatestTag[0].split(' ')

revPreviousTag = previousTagLine.split(':')

p = revPreviousTag[0].split(' ')

command = 'hg log -r {}:{} > diff.txt'.format(l[-1],p[-1])

os.system(command)

有没有什么方法可以不必解析“hg tags”命令的输出来获得修订号?在

有什么Python式的方法吗?在

“hg tags”命令的o/p:

提示523:e317b6828206

工具1.4 522:5bb1197f2e36

工具_1.3 515:7362cEffe40

工具1.1 406:33379f244971


Tags: 工具pathtxtoslinetagshgsystem
2条回答

正如我之前在回答中所说的,在玩Mercurial revsets are your friend时。也就是说,revset文档中并没有包含您想要的内容,而是在log命令的帮助中提到了这一点。在

在您的代码中,您似乎想要一个diff的“最新”两个标记之间发生了什么变化,下面的内容应该可以为您完成这项工作:

hg diff -r "last(tagged(),2)"

我知道您使用的是Python,但是上面的命令将完成繁重的工作,并且您的Python代码可以专注于不那么低级的任务。最重要的部分是引号中的一点,我会解释的。在

tagged()是所有已标记修订的列表-它应该引用与hg tags相同的修订,但是它只列出每个修订一次,而{}将为单个修订显示多个标记(如果是这样的话)。在

last(set,[n])过滤集合(在本例中是标记集)以显示最后的n项(如果省略,n为1)。在

其结果是一个revset,其中包含最后两个标记的更改,在上面的示例中,我们将其传递到hg diff。在


更新:好的,我被Python中的diff抛出了。再次阅读时,看起来您基本上想要最后两个标记之间的log输出?使用revset这会变得更加复杂,但是使用上面的知识,您可以创建一个revset,如下所示:

^{pr2}$

我们有效地挑选了最后两个标签和最后一个标签(!!)并在它们之间执行包含所有集合的日志。log输出可以用 template调整,正如lazybacker在他的回答中所显示的那样。{{a3}你可以去寻找更简单的信息。在

  • 作为hg log -r中revset的标识符,您可以使用任何标识,它唯一地标识变更集-标记名是可以的

>hg tags
tip                             1126:cb4dccc90ff1
1.6                             1104:7d47a0f73135
...

登录窗体

^{pr2}$

将找到正确的变更集,如您所见

  • 使用revsets,您可以从生成的命令中完全消除变量

一步一步

所有标记:hg log -r "tag()"

最新标记:hg log -r "last(tag())"

倒数第二个标记:hg log -r "first(last(tag(),2)))"(在某些情况下,可能是min()而不是{})

最终命令变成

hg log -r "((first(last(tag(),2))):(last(tag())))"

用于测试hgsubversion存储库抛光版的日志

hg log -r "((first(last(tag(),2))):(last(tag())))"  template "changeset: {node|short}\n{if(tags, 'Tag: {tags}\n')}\n"

产生这样的输出(跳过中等噪音)

changeset: d0f3a5c2cb56
Tag: 1.5.1

changeset: b5b1fce26f1f

...

changeset: 6e1dbf6cbc92

changeset: 7d47a0f73135
Tag: 1.6

修复:对于多余的括号和缺少的引号

hg log -r "first(last(tag(),2)):last(tag())" ...

相关问题 更多 >

    热门问题