Cómo extraer un logging de "editar tamaños" desde un repository de subversión

Tengo un repository de Subversion, y me gustaría get información detallada sobre la historia de quién editó qué, cuándo y cómo. Sé que puedo ejecutar svn log --xml para producir un buen svn log --xml fácil de usar de los paths modificados en cada revisión. Pero lo que también me gustaría averiguar es el tamaño de las ediciones de cada file.

Sé que hay muchas maneras de definir "distancia de edición", pero me complacerá cualquier cosa simple como "número de líneas que son diferentes" para los files de text.

Presumiblemente, puedo get todo esto parsing la salida de svnadmin dump , pero luego tendría que pasar time aprendiendo sobre el formatting de file de volcado, que prefiero evitar si puedo.

Qué puedes usar para esto:

  svn blame -r10:10 URL/file.java 

Esto imprimirá las líneas que se han cambiado en ese set de cambios particular que puede usar para extraer dicha información, pero esto no es más que una aproximación no exactamente.

El formatting svn dump resulta ser muy fácil de analizar. Si lo genero con svnadmin dump --deltas entonces el file de volcado contiene deltas para cada modificación de file, y puedo razonablemente tomar el tamaño del delta (en bytes) para que sea la distancia de edición.

En caso de que alguien venga aquí, aquí hay un script simple de Python que toma un file svn dump e imprime un file XML que contiene todas las properties. Los tamaños de edición están contenidos en las inputs //path/Text-content-length .

 def read_defs(f): res = {} while True: l = f.readline() if l in ['','\n']: break s = l.split(': ',1) if len(s)!=2: assert False, 'Bad definition line '+l res[s[0]] = (s[1][:-1] if s[1].endswith('\n') else s[1]) if len(res)==0 and l=='': return None return res def read_props(f): res = {} lastkey = None while True: l = f.readline() if l.startswith('PROPS-END'): break ln = int(l.split()[1]) l2 = f.read(ln); f.readline() if l.startswith('K'): lastkey = l2; res[l2] = None elif l.startswith('V'): res[lastkey] = l2 else: assert False, 'Unexpected prop entry '+l return res def parsedump(f): print '<?xml version="1.0"?>' print '<log>' inrevision,inpaths = False,False while True: d = read_defs(f) if d is None: break p = read_props(f) if 'Prop-content-length' in d else {} if 'Revision-number' in d: if inpaths: print '</paths>'; inpaths=False if inrevision: print '</logentry>' print '<logentry revision="'+d['Revision-number']+'">' inrevision = True for k,v in p.iteritems(): print '<'+k+'>'+v+'</'+k+'>' elif 'Node-path' in d: if not inpaths: print '<paths>'; inpaths=True print '<path>' for k,v in d.iteritems(): print '<'+k+'>'+v+'</'+k+'>' for k,v in p.iteritems(): print '<'+k+'>'+v+'</'+k+'>' print '</path>' cl = (int(d['Content-length']) if 'Content-length' in d else 0) pcl = (int(d['Prop-content-length']) if 'Prop-content-length' in d else 0) f.seek(cl-pcl,1) if inpaths: print '</paths>' if inrevision: print '</logentry>' print '</log>' import sys if __name__=='__main__': if len(sys.argv)==0: print 'Usage: svndump2xml FILENAME\nConverts FILENAME to xml, and prints to standard output' sys.exit(0) filename = sys.argv[1] with open(filename,'rb') as f: parsedump(f)