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

# This script creates a qemu image manifest for Fuchsia that contains the
# Dart tree. In particular in contains Dart's test suite, and test harness.

import argparse
import json
import os
import sys
import utils

SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
FUCHSIA_ROOT = os.path.realpath(os.path.join(DART_ROOT, '..', '..'))

FUCHSIA_TEST_MANIFEST_PREFIX = os.path.join('test', 'dart')

EXCLUDE_DIRS = ['.git', 'out', '.jiri']

BINARY_FILES = ['dart', 'run_vm_tests', 'process_test']


def parse_args(args):
    args = args[1:]
    parser = argparse.ArgumentParser(
        description='A script that generates Dart/Fuchsia test commands.')

    parser.add_argument(
        '--arch',
        '-a',
        type=str,
        help='Target architectures (comma-separated).',
        metavar='[x64]',
        default='x64')
    parser.add_argument(
        '--mode',
        '-m',
        type=str,
        help='Build variant',
        metavar='[debug,release]',
        default='debug')
    parser.add_argument(
        '--output', '-o', type=str, help='Path to output file prefix.')
    parser.add_argument(
        "-v",
        "--verbose",
        help='Verbose output.',
        default=False,
        action="store_true")

    return parser.parse_args(args)


def fuchsia_arch(arch):
    if arch is 'x64':
        return 'x86-64'
    return None


def main(argv):
    args = parse_args(argv)

    manifest_output = args.output + '.manifest'
    with open(manifest_output, 'w') as manifest:
        # Write the Dart tree.
        for root, dirs, files in os.walk(DART_ROOT):
            dirs[:] = [d for d in dirs if d not in EXCLUDE_DIRS]
            for file in files:
                filepath = os.path.join(root, file)
                relpath = filepath[len(DART_ROOT) + 1:]
                fuchsiapath = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX,
                                           relpath)
                manifest.write(
                    '%s=%s\n' % (fuchsiapath, os.path.join(root, file)))

        dart_conf = utils.GetBuildConf(args.mode, args.arch)
        dart_out = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX, 'out', dart_conf)
        fuchsia_conf = '%s-%s' % (args.mode, fuchsia_arch(args.arch))
        fuchsia_out = os.path.join(FUCHSIA_ROOT, 'out', fuchsia_conf)
        for file in BINARY_FILES:
            manifest.write('%s=%s\n' % (os.path.join(dart_out, file),
                                        os.path.join(fuchsia_out, file)))

    return 0


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