# 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.
from __future__ import absolute_import

import sys
import xml.dom.minidom


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)
