#!/usr/bin/env python
# Copyright 2018 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

# Uses the Dart snapshotter to identify the source files of a library based on
# the list of its public files.

def get_dependencies(args):
    result = []
    for source in args.sources:
        command = [
            args.gen_snapshot,
            '--print_dependencies',
            '--dependencies_only',
            '--packages=' + args.packages,
            '--vm_snapshot_data=/dev/null',
            '--isolate_snapshot_data=/dev/null',
        ]
        for mapping in args.url_mapping:
          command.append('--url_mapping=%s' % mapping)
        command.append(source)
        try:
            output = subprocess.check_output(command, stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as e:
            raise Exception('Failed to run gen_snapshot: %s' % e.output)
        result += output.strip().split('\n')
    return result


def main():
    parser = argparse.ArgumentParser(
            description='Identifies the sources of a Dart package')
    parser.add_argument('--gen-snapshot',
                        help='Path to the Dart snapshotter',
                        required=True)
    parser.add_argument('--sources',
                        help='List of public sources for the library',
                        nargs="*")
    parser.add_argument('--packages',
                        help='Path to the .packages file',
                        required=True)
    parser.add_argument('--source-dir',
                        help='Path to the library\'s source directory',
                        required=True)
    parser.add_argument('--output',
                        help='Path to the output file listing the sources',
                        required=True)
    parser.add_argument('--depfile',
                        help='Path to the depfile to generate',
                        required=True)
    parser.add_argument('--depname',
                        help='Name of the target in the depfile',
                        required=True)
    parser.add_argument('--url-mapping',
                        help='Additional mappings for built-in libraries',
                        nargs='*')
    args = parser.parse_args()

    all_deps = get_dependencies(args)
    def is_within_package(dep):
        return os.path.commonprefix([dep, args.source_dir]) == args.source_dir
    local_deps = filter(is_within_package, all_deps)
    # Add the original sources in case they were not under the source directory.
    local_deps = list(set(local_deps) | set(args.sources))
    local_deps.sort()

    with open(args.output, 'w') as output_file:
        for dep in local_deps:
            output_file.write('%s\n' % dep)

    with open(args.depfile, 'w') as dep_file:
        dep_file.write('%s: %s' % (args.depname, ' '.join(local_deps)))


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