158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar#!/usr/bin/env python
258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
358194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbarimport plistlib
458194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
558194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbardef main():
658194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    from optparse import OptionParser, OptionGroup
758194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    parser = OptionParser("""\
858194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbarusage: %prog [options] <path>
958194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
1058194307c1a45f6a20f5ed421c97309a9e007e46Daniel DunbarUtility for dumping Clang-style logged diagnostics.\
1158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar""")
1258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    (opts, args) = parser.parse_args()
1358194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
1458194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    if len(args) != 1:
1558194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        parser.error("invalid number of arguments")
1658194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
1758194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    path, = args
1858194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
1958194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    # Read the diagnostics log.
2058194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    f = open(path)
2158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    try:
2258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        data = f.read()
2358194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    finally:
2458194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        f.close()
2558194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
2658194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    # Complete the plist (the log itself is just the chunks).
2758194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    data = """\
2858194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar<?xml version="1.0" encoding="UTF-8"?>
2958194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
3058194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar                       "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar<plist version="1.0">
3258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar<array>
3358194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar%s
3458194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar</array>
3558194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar</plist>""" % data
3658194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
3758194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    # Load the diagnostics.
3858194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    diags = plistlib.readPlistFromString(data)
3958194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
4058194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    # Print out the diagnostics.
4158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    print
4258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    print "**** BUILD DIAGNOSTICS ****"
4358194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    for i, file_diags in enumerate(diags):
4458194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        file = file_diags.get('main-file')
4558194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        print "*** %s ***" % file
4658194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar        for d in file_diags.get('diagnostics', ()):
4758194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar            print "%s:%s:%s: %s: %s" % (
4858194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar                d.get('filename'), d.get('line'), d.get('column'),
4958194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar                d.get('level'), d.get('message'))
5058194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar
5158194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbarif __name__ == "__main__":
5258194307c1a45f6a20f5ed421c97309a9e007e46Daniel Dunbar    main()
53