#!/usr/bin/env python

# Copyright 2017 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import multiprocessing
import os
import re
import subprocess
import sys

'''
If called with arguments, this script will verify that those headers are
self-sufficient and idempotent.

Otherwise, test all checked-in headers except for those in the ignore list.
'''

ignore = re.compile('|'.join([
    r'debugger/QT/.*',
    r'example/.*',
    r'experimental/.*',
    r'include/config/.*',
    r'include/gpu/mtl/.*',
    r'include/gpu/vk/.*',
    r'include/ports/SkFontMgr_android\.h',
    r'include/ports/SkFontMgr_fontconfig\.h',
    r'include/ports/SkFontMgr_fuchsia\.h',
    r'include/ports/SkTypeface_win\.h',
    r'include/private/.*_impl\.h',
    r'include/private/.*_neon\.h',
    r'include/private/.*_sse\.h',
    r'include/third_party/vulkan/.*',
    r'include/utils/mac/SkCGUtils\.h',
    r'include/views/SkOSWindow_.*\.h',
    r'modules/.*',
    r'platform_tools/.*',
    r'src/c/sk_c_from_to\.h',
    r'src/core/.*Template\.h',
    r'src/core/SkBitmapProcState_.*\.h',
    r'src/core/SkLinearBitmapPipeline\.h',
    r'src/core/SkLinearBitmapPipeline_.*\.h',
    r'src/gpu/mtl/.*',
    r'src/gpu/vk/.*',
    r'src/opts/.*_SSE2\.h',
    r'src/opts/.*_SSSE3\.h',
    r'src/opts/.*_neon\.h',
    r'src/opts/.*_sse\.h',
    r'src/opts/Sk4px_.*\.h',
    r'src/ports/.*',
    r'src/utils/.*_win\.h',
    r'src/utils/win/.*',
    r'src/views/.*',
    r'third_party/.*',
    r'tools/fiddle/.*',
    r'tools/gpu/vk/.*',
    r'tools/mdbviz/.*',
    r'tools/sk_app/.*',
    r'tools/viewer/.*',
    ]))


# test header for self-sufficiency and idempotency.
# Returns a string containing errors, or None iff there are no errors.
def compile_header(header):
    cmd = ['c++', '--std=c++14', '-I.', '-o', '/dev/null', '-c', '-x', 'c++', '-']
    proc = subprocess.Popen(cmd, stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    proc.stdin.write('#include "%s"\n#include "%s"\n' % (header, header))
    proc.stdin.close()
    errors = proc.stdout.read().strip()
    if proc.wait() != 0 or len(errors) > 0:
        return '\n\033[7m ERROR: %s \033[0m\n%s\n\n' % (header, errors)
    return None


#     for h in headers:
#         compile_header(h)
# ...Except use a multiprocessing pool.
# Exit at first error.
def compile_headers(headers):
    class N: good = True
    # N.good is a global scoped to this function to make a print_and_exit_if() a closure
    pool = multiprocessing.Pool()
    def print_and_exit_if(r):
        if r is not None:
            sys.stdout.write(r)
            N.good = False
            pool.terminate()
    for path in headers:
        assert os.path.exists(path)
        pool.apply_async(compile_header, args=(path, ), callback=print_and_exit_if)
    pool.close()
    pool.join()
    if N.good:
        sys.stdout.write('all good :)\n')
    else:
        exit(1)


def main(argv):
    skia_dir = os.path.join(os.path.dirname(__file__), os.pardir)
    if len(argv) > 1:
        paths = [os.path.relpath(os.path.abspath(arg), skia_dir) for arg in argv[1:]]
        os.chdir(skia_dir)
    else:
        os.chdir(skia_dir)
        paths = [path for path in subprocess.check_output(['git', 'ls-files']).splitlines()
                 if path.endswith('.h') and not ignore.match(path)]
    compile_headers(paths)


if __name__ == '__main__':
    main(sys.argv)

