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