svnxml.py
58 lines
| 1.8 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. | ||||
|
r28947 | from __future__ import absolute_import | ||
import sys | ||||
import xml.dom.minidom | ||||
|
r16512 | |||
|
r43346 | |||
|
r16512 | def xmltext(e): | ||
|
r43346 | return ''.join(c.data for c in e.childNodes if c.nodeType == c.TEXT_NODE) | ||
|
r16512 | |||
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'): | ||||
|
r41357 | action = p.getAttribute('action').encode('utf-8') | ||
path = xmltext(p).encode('utf-8') | ||||
frompath = p.getAttribute('copyfrom-path').encode('utf-8') | ||||
fromrev = p.getAttribute('copyfrom-rev').encode('utf-8') | ||||
|
r16512 | e['paths'].append((path, action, frompath, fromrev)) | ||
return e | ||||
|
r43346 | |||
|
r16512 | def parselog(data): | ||
entries = [] | ||||
doc = xml.dom.minidom.parseString(data) | ||||
for e in doc.getElementsByTagName('logentry'): | ||||
entries.append(parseentry(e)) | ||||
return entries | ||||
|
r43346 | |||
|
r16512 | def printentries(entries): | ||
|
r40252 | try: | ||
fp = sys.stdout.buffer | ||||
except AttributeError: | ||||
fp = sys.stdout | ||||
|
r16512 | 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']): | ||||
|
r41357 | frominfo = b'' | ||
|
r16512 | if frev: | ||
|
r41357 | frominfo = b' (from %s@%s)' % (fpath, frev) | ||
p = b' %s %s%s\n' % (action, path, frominfo) | ||||
fp.write(p) | ||||
|
r16512 | |||
|
r43346 | |||
|
r16512 | if __name__ == '__main__': | ||
data = sys.stdin.read() | ||||
entries = parselog(data) | ||||
printentries(entries) | ||||