#!/usr/bin/env python
# Copyright 2016 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 os
import paths
import subprocess
import sys

# These are the locations of pubspec files that are roots of the dependency
# graph.  If they contain conflicting requirements for a package 'pub get' will
# error out and the conflicts will have to be resolved before the packages can
# be updated.
ROOT_PUBSPECS = [
    'dart/pkg/analysis_server',
    'dart/pkg/analyzer',
    'dart/pkg/analyzer_cli',
    'dart/pkg/kernel',
    'dart/pkg/typed_mock',
    'lib/flutter/packages/flutter',
    'lib/flutter/packages/flutter_test',
    'lib/flutter/packages/flutter_tools',
]

# These are the locations of yaml files listing the Dart dependencies of a git
# project.
PROJECT_DEPENDENCIES = [
    'apps/modules/common',
    'apps/modules/dashboard',
    'apps/mondrian',
]


def main():
    flutter_path = os.path.join(paths.FUCHSIA_ROOT, 'lib/flutter')
    flutter_bin_path = os.path.join(flutter_path, 'bin')
    # First, run flutter precache to seed its dart SDK and packages
    # TODO: Stop relying on flutter's copy of the 'pub' binary. Instead, we
    # should build the 'dart' binary and use it to run pub.dart
    subprocess.check_call(
        [os.path.join(flutter_bin_path, 'flutter'), 'precache'])
    # Then run importer.py, placing the flutter bin cache on the PATH to pick
    # up the 'pub' binary
    importer_path = os.path.join(paths.FUCHSIA_ROOT, 'third_party', 'dart-pkg',
                                 'importer', 'importer.py')
    args = [importer_path]
    env = os.environ
    env['PATH'] = flutter_bin_path + ":" + os.path.join(
        flutter_bin_path, 'cache', 'dart-sdk', 'bin') + ":" + env['PATH']
    env['FLUTTER_ROOT'] = flutter_path
    args.append('--pubspecs')
    for root in ROOT_PUBSPECS:
        args.append(os.path.join(paths.FUCHSIA_ROOT, root))
    args.append('--projects')
    for project in PROJECT_DEPENDENCIES:
        args.append(os.path.join(paths.FUCHSIA_ROOT, project))

    subprocess.check_call(args, env=env)


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