#!/usr/bin/env python3

import sys
import re
import xml.etree.ElementTree as ET

from datetime import datetime
from subprocess import check_output


NEW_LINE_RE = re.compile("\n+")


def single_line(string):
    return NEW_LINE_RE.sub(" ", string).encode('utf-8')


def format_date(string):
    dt = datetime.strptime(string, "%Y-%m-%dT%H:%M:%S.%fZ")
    return dt.strftime("%Y-%m-%d")


def svn_log(rev_from, rev_to):
    rev_param = "%d:%s" % (int(rev_from) + 1, rev_to)
    return check_output(["svn", "log", "--xml", "-r", rev_param])


def log_iter(string):
    root = ET.fromstring(string)

    for logentry in root:
        revision = logentry.get("revision")
        date = logentry.find("date").text
        author = logentry.find("author").text
        msg = logentry.find("msg").text
        yield revision, date, author, msg


def main(argv):
    if len(argv) != 3:
        print >>sys.stderr, "Usage:", argv[0], "<revision_from> <revision_to>"
        sys.exit(1)

    log_str = svn_log(argv[1], argv[2])
    for revision, date, author, msg in log_iter(log_str):
        print revision, " ", format_date(date), " ", author.ljust(12), single_line(msg)


if __name__ == "__main__":
    main(sys.argv)

