svnxml.py
51 lines
| 1.6 KiB
| text/x-python
|
PythonLexer
/ tests / svnxml.py
|
r16512 | # Read the output of a "svn log --xml" command on stdin, parse it and | ||
# print a subset of attributes common to all svn versions tested by | ||||
# hg. | ||||
import xml.dom.minidom, sys | ||||
def xmltext(e): | ||||
return ''.join(c.data for c | ||||
in e.childNodes | ||||
if c.nodeType == c.TEXT_NODE) | ||||
def parseentry(entry): | ||||
e = {} | ||||
e['revision'] = entry.getAttribute('revision') | ||||
e['author'] = xmltext(entry.getElementsByTagName('author')[0]) | ||||
e['msg'] = xmltext(entry.getElementsByTagName('msg')[0]) | ||||
e['paths'] = [] | ||||
paths = entry.getElementsByTagName('paths') | ||||
if paths: | ||||
paths = paths[0] | ||||
for p in paths.getElementsByTagName('path'): | ||||
action = p.getAttribute('action') | ||||
path = xmltext(p) | ||||
frompath = p.getAttribute('copyfrom-path') | ||||
fromrev = p.getAttribute('copyfrom-rev') | ||||
e['paths'].append((path, action, frompath, fromrev)) | ||||
return e | ||||
def parselog(data): | ||||
entries = [] | ||||
doc = xml.dom.minidom.parseString(data) | ||||
for e in doc.getElementsByTagName('logentry'): | ||||
entries.append(parseentry(e)) | ||||
return entries | ||||
def printentries(entries): | ||||
fp = sys.stdout | ||||
for e in entries: | ||||
for k in ('revision', 'author', 'msg'): | ||||
fp.write(('%s: %s\n' % (k, e[k])).encode('utf-8')) | ||||
for path, action, fpath, frev in sorted(e['paths']): | ||||
frominfo = '' | ||||
if frev: | ||||
frominfo = ' (from %s@%s)' % (fpath, frev) | ||||
p = ' %s %s%s\n' % (action, path, frominfo) | ||||
fp.write(p.encode('utf-8')) | ||||
if __name__ == '__main__': | ||||
data = sys.stdin.read() | ||||
entries = parselog(data) | ||||
printentries(entries) | ||||