Home | History | Annotate | Download | only in utils
      1 #!/usr/bin/env python
      2 
      3 import plistlib
      4 
      5 def main():
      6     from optparse import OptionParser, OptionGroup
      7     parser = OptionParser("""\
      8 Usage: %prog [options] <path>
      9 
     10 Utility for dumping Clang-style logged diagnostics.\
     11 """)
     12     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.")
     24     (opts, args) = parser.parse_args()
     25 
     26     if len(args) != 1:
     27         parser.error("invalid number of arguments")
     28 
     29     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 
     42     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', ()):
     72             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'))
     76 
     77 if __name__ == "__main__":
     78     main()
     79