tests/svnxml.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Fri, 05 Feb 2016 22:32:05 +0900
changeset 27991 5daf1a8c5f1d
parent 16512 c58bdecdb800
child 28947 812eb3b7dc43
permissions -rw-r--r--
tests: avoid nested quoting on command line for portability Before this patch, test-revset.t fails on Solaris using ksh as default "sh", because nested quoting below isn't acceptable for it. +-----------------------------+ inner quoting "`python -c "print '|'.join(['0:1'] * 500)"`" +-------------------------------------------+ outer quoting This patch does below for portability. - omit outer quoting This should be safe, because generated string contains no white space character. - use '+' instead of '|' (for safety) '|' has special meaning for many shell, but '+' isn't (at least, for ordinary ones).

# 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)