#!/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('--user-manifest', '-u',
      type=str,
      help='Path to base userspace manifest.')
  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:
    # First copy the main user manifest.
    with open(args.user_manifest, 'r') as user_manifest:
      for line in user_manifest:
        if '=' in line:
          manifest.write(line)

    # Now, 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))
