summaryrefslogtreecommitdiff
path: root/tests/svnxml.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/svnxml.py')
-rw-r--r--tests/svnxml.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/tests/svnxml.py b/tests/svnxml.py
new file mode 100644
index 0000000..b3b2b63
--- /dev/null
+++ b/tests/svnxml.py
@@ -0,0 +1,51 @@
+# 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)
+