tests/svnxml.py
branchstable
changeset 16512 c58bdecdb800
child 28947 812eb3b7dc43
equal deleted inserted replaced
16511:ecd2fbe68b25 16512:c58bdecdb800
       
     1 # Read the output of a "svn log --xml" command on stdin, parse it and
       
     2 # print a subset of attributes common to all svn versions tested by
       
     3 # hg.
       
     4 import xml.dom.minidom, sys
       
     5 
       
     6 def xmltext(e):
       
     7     return ''.join(c.data for c
       
     8                    in e.childNodes
       
     9                    if c.nodeType == c.TEXT_NODE)
       
    10 
       
    11 def parseentry(entry):
       
    12     e = {}
       
    13     e['revision'] = entry.getAttribute('revision')
       
    14     e['author'] = xmltext(entry.getElementsByTagName('author')[0])
       
    15     e['msg'] = xmltext(entry.getElementsByTagName('msg')[0])
       
    16     e['paths'] = []
       
    17     paths = entry.getElementsByTagName('paths')
       
    18     if paths:
       
    19         paths = paths[0]
       
    20         for p in paths.getElementsByTagName('path'):
       
    21             action = p.getAttribute('action')
       
    22             path = xmltext(p)
       
    23             frompath = p.getAttribute('copyfrom-path')
       
    24             fromrev = p.getAttribute('copyfrom-rev')
       
    25             e['paths'].append((path, action, frompath, fromrev))
       
    26     return e
       
    27 
       
    28 def parselog(data):
       
    29     entries = []
       
    30     doc = xml.dom.minidom.parseString(data)
       
    31     for e in doc.getElementsByTagName('logentry'):
       
    32         entries.append(parseentry(e))
       
    33     return entries
       
    34 
       
    35 def printentries(entries):
       
    36     fp = sys.stdout
       
    37     for e in entries:
       
    38         for k in ('revision', 'author', 'msg'):
       
    39             fp.write(('%s: %s\n' % (k, e[k])).encode('utf-8'))
       
    40         for path, action, fpath, frev in sorted(e['paths']):
       
    41             frominfo = ''
       
    42             if frev:
       
    43                 frominfo = ' (from %s@%s)' % (fpath, frev)
       
    44             p = ' %s %s%s\n' % (action, path, frominfo)
       
    45             fp.write(p.encode('utf-8'))
       
    46 
       
    47 if __name__ == '__main__':
       
    48     data = sys.stdin.read()
       
    49     entries = parselog(data)
       
    50     printentries(entries)
       
    51