#!/usr/bin/env python3
# Copyright 2016 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.

# Usage: create_pkg_manifest.py --deps <DEPS file> --output <jiri manifest>
#
# This script parses the DEPS file, extracts dependencies that live under
# third_party/pkg, and writes them to a file suitable for consumption as a
# jiri manifest for Fuchsia. It is assumed that the Dart tree is under
# //dart in the Fuchsia world, and so the dependencies extracted by this script
# will go under //dart/third_party/pkg.

import argparse
import os
import sys
import utils

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


# Used in parsing the DEPS file.
class VarImpl(object):
    _env_vars = {
        "host_cpu": "x64",
        "host_os": "linux",
    }

    def __init__(self, local_scope):
        self._local_scope = local_scope

    def Lookup(self, var_name):
        """Implements the Var syntax."""
        if var_name in self._local_scope.get("vars", {}):
            return self._local_scope["vars"][var_name]
        # Inject default values for env variables
        if var_name in self._env_vars:
            return self._env_vars[var_name]
        raise Exception("Var is not defined: %s" % var_name)


def ParseDepsFile(deps_file):
    local_scope = {}
    var = VarImpl(local_scope)
    global_scope = {
        'Var': var.Lookup,
        'deps_os': {},
    }
    # Read the content.
    with open(deps_file, 'r') as fp:
        deps_content = fp.read()

    # Eval the content.
    exec (deps_content, global_scope, local_scope)

    # Extract the deps and filter.
    deps = local_scope.get('deps', {})
    filtered_deps = {}
    for k, v in deps.iteritems():
        if 'sdk/third_party/pkg' in k:
            new_key = k.replace('sdk', 'third_party/dart', 1)
            filtered_deps[new_key] = v

    return filtered_deps


def WriteManifest(deps, manifest_file):
    project_template = """
    <project name="%s"
             path="%s"
             remote="%s"
             revision="%s"/>
"""
    warning = (
        '<!-- This file is generated by '
        '//third_party/dart/tools/create_pkg_manifest.py. DO NOT EDIT -->\n')
    with open(manifest_file, 'w') as manifest:
        manifest.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        manifest.write(warning)
        manifest.write('<manifest>\n')
        manifest.write('  <projects>\n')
        for path, remote in sorted(deps.iteritems()):
            remote_components = remote.split('@')
            remote_url = remote_components[0]
            remote_version = remote_components[1]
            manifest.write(
                project_template % (path, path, remote_url, remote_version))
        manifest.write('  </projects>\n')
        manifest.write('</manifest>\n')


def ParseArgs(args):
    args = args[1:]
    parser = argparse.ArgumentParser(
        description='A script to generate a jiri manifest for third_party/pkg.')

    parser.add_argument(
        '--deps',
        '-d',
        type=str,
        help='Input DEPS file.',
        default=os.path.join(DART_ROOT, 'DEPS'))
    parser.add_argument(
        '--output',
        '-o',
        type=str,
        help='Output jiri manifest.',
        default=os.path.join(DART_ROOT, 'dart_third_party_pkg.manifest'))

    return parser.parse_args(args)


def Main(argv):
    args = ParseArgs(argv)
    deps = ParseDepsFile(args.deps)
    WriteManifest(deps, args.output)
    return 0


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