blob: b8ea8eae310f1be08d16a71b982a8043921d768e [file] [log] [blame]
Daniel Dunbar58194302011-04-11 22:37:39 +00001#!/usr/bin/env python
2
3import plistlib
4
5def main():
6 from optparse import OptionParser, OptionGroup
7 parser = OptionParser("""\
Chad Rosier7f53d592011-10-24 21:56:50 +00008Usage: %prog [options] <path>
Daniel Dunbar58194302011-04-11 22:37:39 +00009
10Utility for dumping Clang-style logged diagnostics.\
11""")
Chad Rosier7f53d592011-10-24 21:56:50 +000012 parser.add_option("-a", "--all", action="store_true", dest="all",
13 default=False, help="dump all messages.")
14 parser.add_option("-e", "--error", action="store_true", dest="error",
15 default=False, help="dump 'error' messages.")
16 parser.add_option("-f", "--fatal", action="store_true", dest="fatal",
17 default=False, help="dump 'fatal error' messages.")
18 parser.add_option("-i", "--ignored", action="store_true", dest="ignored",
19 default=False, help="dump 'ignored' messages.")
20 parser.add_option("-n", "--note", action="store_true", dest="note",
21 default=False, help="dump 'note' messages.")
22 parser.add_option("-w", "--warning", action="store_true", dest="warning",
23 default=False, help="dump 'warning' messages.")
Daniel Dunbar58194302011-04-11 22:37:39 +000024 (opts, args) = parser.parse_args()
25
26 if len(args) != 1:
27 parser.error("invalid number of arguments")
28
Chad Rosier7f53d592011-10-24 21:56:50 +000029 levels = {'error': False, 'fatal error': False, 'ignored': False,
30 'note': False, 'warning': False}
31 if opts.error:
32 levels['error'] = True
33 if opts.fatal:
34 levels['fatal error'] = True
35 if opts.ignored:
36 levels['ignored'] = True
37 if opts.note:
38 levels['note'] = True
39 if opts.warning:
40 levels['warning'] = True
41
Daniel Dunbar58194302011-04-11 22:37:39 +000042 path, = args
43
44 # Read the diagnostics log.
45 f = open(path)
46 try:
47 data = f.read()
48 finally:
49 f.close()
50
51 # Complete the plist (the log itself is just the chunks).
52 data = """\
53<?xml version="1.0" encoding="UTF-8"?>
54<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
55 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
56<plist version="1.0">
57<array>
58%s
59</array>
60</plist>""" % data
61
62 # Load the diagnostics.
63 diags = plistlib.readPlistFromString(data)
64
65 # Print out the diagnostics.
66 print
67 print "**** BUILD DIAGNOSTICS ****"
68 for i, file_diags in enumerate(diags):
69 file = file_diags.get('main-file')
70 print "*** %s ***" % file
71 for d in file_diags.get('diagnostics', ()):
Chad Rosier7f53d592011-10-24 21:56:50 +000072 if levels[d.get('level')] or opts.all:
73 print " %s:%s:%s: %s: %s" % (
74 d.get('filename'), d.get('line'), d.get('column'),
75 d.get('level'), d.get('message'))
Daniel Dunbar58194302011-04-11 22:37:39 +000076
77if __name__ == "__main__":
78 main()