2009-11-10 2 views
2

Командная строка Perforce имеет специальный переключатель -G, который, предположительно, заставляет его вывод быть машиносчитываемым, используя формат сериализации «pickle» python. Неужели это вообще так?Как разобрать Perforce «pickle» двоичный выход?

Например, рассмотрите вывод p4 -G diff -duw3 <file1> <file2> <file3>. Вывод, насколько я могу судить, представляет собой последовательность: pickle, raw diff, pickle, raw diff, pickle, raw diff. Он, как представляется, не содержит разделителей, которые позволяли бы надежно находить границы рассола/дифракции.

Я что-то пропустил или это «машиночитаемый» формат на самом деле не удобочитаемый машиной? Как я могу найти границы между соленьями и сырыми различиями в своем выходе?

+1

Как сказал Дуглас, это, кажется, ошибка с p4. Вы должны связаться с Perforce Support для этого (и напишите здесь ответ). – jhwist

+0

Будет, если я получу ответ - я на бесплатной 2-пользовательской лицензии, поэтому я, возможно, не слышу. –

ответ

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]) 
Смежные вопросы