2009-11-10 9 views
2

La ligne de commande Perforce possède un commutateur spécial, -G, qui est censé rendre sa sortie lisible par machine, en utilisant le format de sérialisation "pickle" de python. Est-ce réellement le cas, en général?Comment analyser la sortie binaire de Perforce "pickle"?

Par exemple, considérez la sortie de p4 -G diff -duw3 <file1> <file2> <file3>. La sortie, pour autant que je sache, est une séquence de: cornichon, diff brut, cornichon, diff brut, cornichon, diff brut. Il ne semble pas contenir de délimiteurs qui permettraient de localiser de manière fiable les limites pickle/diff. Ai-je oublié quelque chose ou est-ce que ce format "lisible par une machine" n'est pas réellement lisible par une machine? Comment puis-je trouver les limites entre les cornichons et les diffs bruts dans sa sortie?

+1

Comme Douglas a dit, il semble y avoir un bug avec p4. Vous devriez contacter le support Perforce pour cela (et poster leur réponse ici). – jhwist

+0

Je le ferai si je reçois une réponse - je suis sur la licence gratuite pour 2 utilisateurs, donc je ne pourrais pas entendre de retour. –

Répondre

5

p4 -G sort ses données sous la forme marshal non décapée.

Mais vous avez raison - p4 -G diff -duw3 aussi ne sera pas un marshal, donc je suppose qu'il y a un problème là.

p4 -G opened unmarshals bien cependant. Cependant, tout type de diff échoue.

Voici un article de base de connaissances pertinentes: 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])