如何解析Perforce“pickle”二进制输出?

时间:2009-11-10 23:37:15

标签: pickle perforce

Perforce命令行有一个特殊的开关-G,它可以使用python的“pickle”序列化格式使其输出成为机器可读的。一般来说,这实际上是这样吗?

例如,考虑p4 -G diff -duw3 <file1> <file2> <file3>的输出。据我所知,输出是一系列:pickle,raw diff,pickle,raw diff,pickle,raw diff。它似乎不包含任何能够使人们可靠地定位pickle / diff边界的分隔符。

我是否遗漏了某些东西,或者这种“机器可读”的格式实际上是不是机器可读的?如何在输出中找到泡菜和原始差异之间的界限?

1 个答案:

答案 0 :(得分:5)

p4 -Gmarshal形式输出其数据,而不是腌制。

但你是对的 - p4 -G diff -duw3也不会取消marshal,所以我猜那里存在问题。

然而,

p4 -G opened解组很好。但是,任何类型的diff都会失败。

以下是相关知识库文章:http://kb.perforce.com/ToolsScripts/PerforceUtilities/UsingP4G

#!/usr/bin/env python
import marshal
import subprocess

# proc = subprocess.Popen(["p4","-G","diff","-duw3","configure.ac","Makefile.am"],stdout=subprocess.PIPE)
proc = subprocess.Popen(["p4","-G","diff"],stdout=subprocess.PIPE)
# proc = subprocess.Popen(["p4","-G","opened"],stdout=subprocess.PIPE)
pipe = proc.stdout
output = []
try:
    while 1:
        record = marshal.load(pipe)
        output.append(record)
except EOFError:
    pass
pipe.close()
proc.wait()

# print list of dictionary records
c = 0
for dict in output:
    c = c + 1
    print "\n--%d--" % c
    for key in dict.keys():
        print "%s: %s" % ( key, dict[key] )