2010-04-23 13 views

risposta

9

Questo script Python breve fornirà un file CSV con lo SVN output di registro:

#!/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'), 
     ]) 

Si passa attraverso gli argomenti della riga di comando per la chiamata SVN sottostante, quindi se solo si vuole vedere la revisione 34 e più tardi, puoi invocarlo come segue:

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

Grazie! Questo script ha funzionato alla grande per me. – Johann

2

Grazie per la sceneggiatura! Ho aggiunto questa piccola modifica perché il nostro repository SVN è UTF-8 con caratteri accentati (francese) e lo script 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 - non è necessario importare 'codecs' per chiamare' encode' su una stringa; detto questo, questa è un'aggiunta utile, e spero che mi perdonerai per averlo adottato. Grazie! –

1

Un'altra soluzione rapida che ho avuto grande successo con è here at Chris' blog. È un programma Java che lo converte rapidamente in un file CSV. Puoi anche utilizzare la versione online che è mostrata lì. Solitamente pubblica articoli in JavaScript, ma immagino che sappia anche Java dal momento che sono apparentemente abbastanza simili.

+2

Java! = JavaScript non sono "simili" in alcun modo tranne che hanno 'Java' nel nome; quale qualcuno di Netscape dovrebbe essere battuto per averlo fatto. –

2

Grazie a tutti, molto utile. Ho trovato che su computer Windows il csv_writer python si aspetta l'output del file binario, altrimenti vengono emessi i ritorni a capo extra. Il seguente script gestisce questo caso e rimuove anche i newline nel mezzo dei messaggi di commit (sostituiti con front-slash) per garantire un output su una sola riga.

#!/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','/'), 
     ]) 

(Ora, chi altro vuole svn log preso le stesse opzioni come log git ?? ;-)

0

Ho trovato questo piccolo script a portata di mano

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 

che esporta svn log da date 1 maggio 2015 al 31 maggio 2015 list.csv .. qui sto usando i due punti come separatori .. perché i miei sviluppatori usano le virgole nei loro appunti ..

Problemi correlati