#!/usr/bin/env python
#
# Utility script to run pyflakes with the modules we care about and
# exclude errors we know to be fine.

# Taken from Review Board, MIT license

import os
import re
import subprocess
import sys


module_exclusions = [
    'build',
    'debian',
    'djblets',
    'django_evolution',
    'dist',
    'ez_setup.py',
    'htdocs',
    'settings_local.py',
    'ReviewBoard.egg-info',
]

whitelist = [
    'bin/oem-config-remove-gtk',
    'bin/ubiquity',
    'bin/ubiquity-bluetooth-agent',
    'bin/ubiquity-dm',
    'bin/ubiquity-wrapper',
    'tests/run',
    'tests/run-frontend',
    'tests/run-pyflakes',
]


def scan_for_modules():
    return [entry
            for entry in os.listdir(os.getcwd())
            if ((os.path.isdir(entry) or entry.endswith(".py")) and
                entry not in module_exclusions)] + whitelist


def main():
    cur_dir = os.path.dirname(__file__)
    os.chdir(os.path.join(cur_dir, ".."))
    modules = sys.argv[1:]

    if not modules:
        # The user didn't specify anything specific. Scan for modules.
        modules = scan_for_modules()

    os.environ['PYFLAKES_NODOCTEST'] = '1'
    p = subprocess.Popen(['pyflakes3'] + modules,
                         stderr=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         close_fds=True, universal_newlines=True)

    contents = p.communicate()[0].splitlines()

    # Read in the exclusions file
    exclusions = {}
    with open(os.path.join(cur_dir, "pyflakes.exclude"), "r") as fp:
        for line in fp.readlines():
            if not line.startswith("#"):
                exclusions[line.rstrip()] = 1

    # Now filter thin
    error = False
    for line in contents:
        if line.startswith('#'):
            continue

        line = line.rstrip()
        test_line = re.sub(r':[0-9]+:', r':*:', line, 1)
        test_line = re.sub(r'line [0-9]+', r'line *', test_line)

        if test_line not in exclusions:
            print line
            error = True
    if error:
        sys.exit(1)


if __name__ == "__main__":
    main()
