# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


def _CompileDevtoolsFrontend(input_api, output_api):
    # Need to get all affected files from change (not just within this subtree)
    local_paths = [f.AbsoluteLocalPath() for f in input_api.change.AffectedFiles()]
    devtools = input_api.os_path.realpath(
        input_api.os_path.join(input_api.PresubmitLocalPath(), '..', '..', 'devtools'))

    # If a devtools file is changed, the PRESUBMIT hook in Source/devtools
    # will run closure compiler
    if (any("browser_protocol.json" in path for path in local_paths) and
            all(devtools not in path for path in local_paths)):
        compile_path = input_api.os_path.join(
            input_api.PresubmitLocalPath(), "..", "..", "devtools", "scripts", "compile_frontend.py")
        out, _ = input_api.subprocess.Popen(
            [input_api.python_executable, compile_path], stdout=input_api.subprocess.PIPE,
            stderr=input_api.subprocess.STDOUT).communicate()
        if "ERROR" in out or "WARNING" in out:
            return [output_api.PresubmitError(out)]
        if "NOTE" in out:
            return [output_api.PresubmitPromptWarning(out)]
    return []


def CheckChangeOnUpload(input_api, output_api):
    results = []
    results.extend(_CompileDevtoolsFrontend(input_api, output_api))
    return results


def CheckChangeOnCommit(input_api, output_api):
    return []
