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