2010-04-23 22 views

Respuesta

9

Este script Python corto proporcionará un CSV con su salida del registro de SVN:

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author').encode('utf-8'), 
       child.findtext('msg').encode('utf-8'), 
     ]) 

Pasa a través de argumentos de línea de comando para la llamada SVN subyacente, por lo que si sólo desea ver la revisión de 34 y más tarde, puede invocarlo de la siguiente manera:

$ svnlog2csv -r 34:HEAD >my_spreadsheet.csv 
+0

¡Gracias! Esta secuencia de comandos funcionó muy bien para mí. – Johann

2

¡Gracias por la secuencia de comandos! He añadido esta ligera modificación debido a nuestro repositorio SVN es UTF-8 con caracteres acentuados (francés) y el guión borked:

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 
import codecs 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author'), 
       child.findtext('msg').encode("utf-8"), 
     ]) 

Cheers,

+0

FYI - no necesita importar 'codecs' para llamar' codificar' en una cadena; Dicho esto, esta es una adición útil, y espero que me perdones por haberla adoptado. ¡Gracias! –

1

Otra solución rápida que he tenido un gran éxito con es here at Chris' blog. Es un programa Java que lo convierte rápidamente en un archivo CSV. También puede usar la versión en línea que se muestra allí. Por lo general, publica artículos de JavaScript, pero supongo que también conoce Java, ya que supuestamente son bastante similares.

+2

Java! = JavaScript no son 'similares' en ningún otro modo que no sean 'Java' en el nombre; que alguien en Netscape debería ser derrotado por hacer. –

2

Gracias a todos, muy útil. Descubrí que en las computadoras con Windows, python csv_writer espera una salida de archivo binario; de lo contrario, se emiten retornos de carro adicionales. La siguiente secuencia de comandos maneja este caso y también elimina las líneas nuevas en el medio de los mensajes de confirmación (reemplazados con barra diagonal) para garantizar una salida de una línea.

#!/usr/bin/env python 

import csv 
import subprocess 
import sys 
import xml.etree.cElementTree as etree 

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:], 
          stdout=subprocess.PIPE).communicate()[0] 
log_xml = etree.XML(log_text) 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

csv_writer = csv.writer(sys.stdout) 

for child in log_xml.getchildren(): 
     csv_writer.writerow([ 
       child.attrib['revision'], 
       child.findtext('date'), 
       child.findtext('author'), 
       child.findtext('msg').encode("utf-8").replace('\n','/'), 
     ]) 

(Ahora, que desea otra cosa svn log tomaron las mismas opciones que git log ?? ;-)

0

me encontré con este pequeño script útil

svn log -r {2015-05-01}:{2015-05-31} http://svn.company.co.id/dev/ | tr -d '\n' | sed -r 's/-{2,}/\n/g' | sed -r 's/ \([^\)]+\)//g' | sed -r 's/^r//' | sed -r "s/[0-9]+ lines?//g" | sort -g | sed 's/ | /;/g' > list.csv 

que exporta svn log de fechas 1 de mayo de 2015 al 31 de mayo de 2015 list.csv .. aquí estoy usando semi colon como separadores ... porque mis desarrolladores usan comas en sus notas ...

Cuestiones relacionadas