2009-11-10 21 views
2

Perforce命令行有一個特殊的開關-G,它使用python的「pickle」序列化格式導致它的輸出爲機器可讀。一般來說,這實際上是如此嗎?例如,考慮輸出p4 -G diff -duw3 <file1> <file2> <file3>。據我所知,輸出是一系列的:pickle,raw diff,pickle,raw diff,pickle,raw diff。它似乎沒有包含任何能讓人可靠地定位pickle/diff邊界的分隔符。如何解析Perforce「pickle」二進制輸出?

我是否錯過了一些東西,或者這是「機器可讀的」格式,實際上不是機器可讀的?我如何才能找到其產出中的泡菜和原始差異之間的界限?

+1

正如道格拉斯說,這似乎是與P4的錯誤。您應該聯繫Perforce支持部門(並在此發佈回覆)。 – jhwist 2009-11-11 10:09:13

+0

如果我收到回覆,我會做 - 我使用免費的2用戶許可證,所以我可能聽不到回覆。 – 2009-11-11 11:39:03

回答

5

p4 -G輸出其數據在marshal ed表格不醃。

但是你是對的 - p4 -G diff -duw3也不會聯合國marshal,所以我想這裏有一個問題。

p4 -G opened unmarshals罰款。但是任何一種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])