#!/usr/bin/env python

import os
import plistlib

def main():
    from optparse import OptionParser, OptionGroup
    parser = OptionParser("""\
Usage: %prog [options] <path>

Utility for dumping Clang-style logged diagnostics.\
""")
    parser.add_option("-a", "--all", action="store_true", dest="all", 
                      default=False, help="dump all messages.")
    parser.add_option("-e", "--error", action="store_true", dest="error", 
                      default=False, help="dump 'error' messages.")
    parser.add_option("-f", "--fatal", action="store_true", dest="fatal", 
                      default=False, help="dump 'fatal error' messages.")
    parser.add_option("-i", "--ignored", action="store_true", dest="ignored", 
                      default=False, help="dump 'ignored' messages.")
    parser.add_option("-n", "--note", action="store_true", dest="note", 
                      default=False, help="dump 'note' messages.")
    parser.add_option("-w", "--warning", action="store_true", dest="warning", 
                      default=False, help="dump 'warning' messages.")
    (opts, args) = parser.parse_args()

    if len(args) != 1:
        parser.error("invalid number of arguments")

    levels = {'error': False, 'fatal error': False, 'ignored': False,
              'note': False, 'warning': False}
    if opts.error:
        levels['error'] = True
    if opts.fatal:
        levels['fatal error'] = True
    if opts.ignored:
        levels['ignored'] = True
    if opts.note:
        levels['note'] = True
    if opts.warning:
        levels['warning'] = True

    path, = args

    # Read the diagnostics log.
    f = open(path)
    try:
        data = f.read()
    finally:
        f.close()

    # Complete the plist (the log itself is just the chunks).
    data = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
                       "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
%s
</array>
</plist>""" % data

    # Get the list of files and diagnostics to report.
    to_report = []
    diags = plistlib.readPlistFromString(data)
    for file_diags in diags:
        file = file_diags.get('main-file')

        # Diagnostics from modules don't have a main-file listed.
        if not file:
            file = '<module-includes>'

        # Ignore diagnostics for 'conftest.c', which is the file autoconf uses
        # for its tests (which frequently will have warnings).
        if os.path.basename(file) == 'conftest.c':
            continue

        # Get the diagnostics for the selected levels.
        selected_diags = [d
                          for d in file_diags.get('diagnostics', ())
                          if levels[d.get('level')] or opts.all]
        if selected_diags:
            to_report.append((file, selected_diags))

    # If there are no diagnostics to report, show nothing.
    if not to_report:
        return

    # Otherwise, print out the diagnostics.
    print
    print "**** BUILD DIAGNOSTICS ****"
    for file,selected_diags in to_report:
        print "*** %s ***" % file
        for d in selected_diags:
            print " %s:%s:%s: %s: %s" % (
                d.get('filename'), d.get('line'), d.get('column'),
                d.get('level'), d.get('message'))

if __name__ == "__main__":
    main()
