2009-11-10 2 views
2

PERFORCE 명령 행에는 파이썬의 "피클 (pickle)"직렬화 형식을 사용하여 컴퓨터 출력을 읽을 수있는 특수 스위치 -G가 있습니다. 이게 실제로 그렇게 일반적입니까?Perforce "피클"바이너리 출력을 구문 분석하는 방법은 무엇입니까?

예를 들어, 출력을 p4 -G diff -duw3 <file1> <file2> <file3>으로 간주하십시오. 필자가 알 수있는 한 출력은 pickle, raw diff, pickle, raw diff, pickle, raw diff의 순서입니다. pickle/diff 경계를 신뢰할 수있게 배치 할 수있는 구분 기호를 포함하지 않습니다.

내가 누락되었거나 실제로 기계가 읽을 수없는 "기계 판독 가능"형식입니까? 출력물에서 pickles와 raw diffs 사이의 경계를 어떻게 찾을 수 있습니까?

+1

, P4 버그 것 같다 :

다음은 관련 기술 자료 문서입니다. Perforce Support에 연락하여 (여기에 답변을 게시해야합니다.) – jhwist

+0

응답을 받으면 수행 할 것입니다. 무료 2 사용자 라이센스를 사용 중이므로 다시 음성을들을 수 없습니다. –

답변

5

p4 -G은 절취되지 않은 marshal에 데이터를 출력합니다.

하지만 맞습니다 - p4 -G diff -duw3marshal이 아니므로 거기에 문제가있는 것 같습니다.

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]) 
관련 문제