#!/usr/bin/env python3.8
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import subprocess
import sys
import json
import yaml


def main():
    parser = argparse.ArgumentParser('Runs analysis on a given package')
    parser.add_argument(
        '--source-file', help='Path to the list of sources', required=True)
    parser.add_argument(
        '--dot-packages', help='Path to the .packages file', required=True)
    parser.add_argument(
        '--dart', help='Path to the Dart executable', required=True)
    parser.add_argument(
        '--stamp',
        type=argparse.FileType('w'),
        help='File to touch when analysis succeeds',
        required=True)
    parser.add_argument(
        '--depname', help='Name of the depfile target', required=True)
    parser.add_argument(
        '--depfile',
        type=argparse.FileType('w'),
        help='Path to the depfile to generate',
        required=True)
    parser.add_argument(
        '--all-deps-sources-file',
        type=argparse.FileType('r'),
        help=
        'Path to a file containing sources this target and all of its direct and transitive dependencies',
        required=True)
    args = parser.parse_args()

    with open(args.source_file, 'r') as source_file:
        # Normalize path so paths like `foo/bar/../main.dart` would work even if
        # `foo/bar` doesn't exist.
        sources = [
            os.path.normpath(p) for p in source_file.read().strip().split('\n')
        ]

    args.depfile.write(
        '{}: {}'.format(
            args.depname,
            ' '.join(json.load(args.all_deps_sources_file)),
        ),
    )

    call_args = [
        args.dart,
        'analyze',
        # https://fxbug.dev//98703
        # Temporarily use absolute path for each package_config.json
        # Workaround for an issue where --packages wasn't able to find package_config.json using the relative path
        # TODO(https://github.com/dart-lang/sdk/issues/49646): Use a relative path once upstream accepts it
        '--packages={}'.format(os.path.abspath(args.dot_packages)),
        '--fatal-warnings',
        '--fatal-infos',
    ] + sources

    # Call Dart anaylzer.
    call = subprocess.Popen(
        call_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = call.communicate()

    # Convert output to strings, assuming UTF-8 output from dart.
    stdout = stdout.decode('utf-8')
    stderr = stderr.decode('utf-8')

    if call.returncode:
        print(stdout + stderr)
        return 1

    args.stamp.write('Success!')
    return 0


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