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



我已经编写了以下脚本:

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

有什么蟒蛇的方法可以做到这一点吗?

"hg-tags"命令的o/p:

提示523:e317b6828206

工具_1.4 522:5bb1197f2e36

工具1.3 515:7362c0效果40

工具1.1 406:33379f244971

正如我之前在回答中所说,当玩Mercurial revsets时,你是朋友。也就是说,您想要的内容似乎不在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输出?使用revset,这会变得有点复杂,但使用以上知识,你可以创建这样的revset:

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

我们有效地挑选了最后两个标签和最后一个标签(!!),并对它们之间的全包集进行了日志记录。log的输出可以通过--template进行调整,正如LazyBadger在他的回答中所示。我会选择一个简单的--template "{node}t{tags}n",但请在这里查看更多关于你可以享受的乐趣的信息。

  • 作为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())" ...

最新更新