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

时间:2014-02-20 10:02:57

标签: python python-2.7 mercurial dvcs

我写了以下脚本:

#!/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”命令的输出来获取修订号?

有没有pythonic方式来做到这一点?

o / p“hg tags”命令:

提示523:e317b6828206

TOOL_1.4 522:5bb1197f2e36

TOOL_1.3 515:7362c0effe40

TOOL_1.1 406:33379f244971

2 个答案:

答案 0 :(得分:2)

正如我之前在答案中所说,在玩Mercurial revsets are your friend时。也就是说,你想要的内容似乎没有被revset文档所涵盖,但在log命令的帮助中提到了。

在您的代码中,您似乎想要diff“最新”两个标记之间的更改,以下内容应该为您完成这项工作:

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

我意识到你正在使用Python,但上面的命令将完成繁琐的工作,而你的Python代码可以专注于较少的琐碎任务。重要的部分是引号中的位,我将解释。

tagged()是已标记的所有修订的列表 - 它应引用与hg tags相同的修订版,但它只列出每个修订版一次,而hg tags将显示多个修订版单一修订的标签,如果是这种情况。

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

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


更新:好的,我被Python中的diff抛出了。在再次阅读时,看起来你基本上想要最后两个标签之间的log输出?使用revsets会变得有点复杂,但使用上述知识可以创建一个类似的revset:

hg log -r "last(tagged(),2):last(tagged())"

我们正在有效地选择最后两个标签,以及最后一个标签(!!)并在它们之间执行所有包含集的日志。正如LazyBadger在答案中所示,log输出可以使用--template进行调整。我会选择一个简单的--template "{node}\t{tags}\n",但请查看here以获取有关您可以获得的乐趣的更多信息。

答案 1 :(得分:1)

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

使用

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

登录表单

>hg log -r "1.6"
changeset:   1104:7d47a0f73135
tag:         1.6
...

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

  • 使用revsets,您可以完全从结果命令中删除变量

步骤一步

所有代码:hg log -r "tag()"

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

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

最终命令变为

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

FIX:用于冗余括号和缺少引号

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