#!/usr/bin/env python
# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""Used to run pub before the SDK has been built"""

import argparse
import os
import platform
import subprocess
import sys

SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
PUB_PATH = os.path.join(DART_ROOT, 'sdk/lib/_internal/pub/bin/pub.dart')
CANARY_PATH = os.path.join(DART_ROOT, 'tools', 'canary.dart')

usage = """run_pub.py --package-root=<package root>"""

def BuildArguments():
  result = argparse.ArgumentParser(usage=usage)
  result.add_argument("--package-root", help="package root", default=None)
  result.add_argument("--dart-executable", help="dart binary", default=None)
  return result

def ProcessOptions(options, args):
  return ((options.package_root != None) and
          (options.dart_executable != None))

def GetPrebuiltDartExecutablePath(suffix):
  osdict = {'Darwin':'macos', 'Linux':'linux', 'Windows':'windows'}
  system = platform.system()
  executable_name = 'dart'
  if system == 'Windows':
    executable_name = 'dart.exe'
  try:
    osname = osdict[system]
  except KeyError:
    print >>sys.stderr, ('WARNING: platform "%s" not supported') % (system)
    return None;
  return os.path.join(DART_ROOT,
                      'tools',
                      'testing',
                      'bin',
                      osname,
                      executable_name + suffix)

def RunPub(dart, pkg_root, args):
  return subprocess.call([dart, '--package-root=' + pkg_root, PUB_PATH] + args)

def TryRunningExecutable(dart_executable, pkg_root):
  try:
    return subprocess.call([dart_executable,
                            '--package-root=' + pkg_root,
                            CANARY_PATH]) == 42
  except:
    return False;

def DisplayBootstrapWarning():
  print """\


WARNING: Your system cannot run the prebuilt Dart executable. Using the
bootstrap Dart executable will make Debug builds long.
Please see Wiki for instructions on replacing prebuilt Dart executable.

https://code.google.com/p/dart/wiki/ReplacingPrebuiltDartExecutable

"""

def FindDartExecutable(fallback_executable, package_root):
  # If requested, use the bootstrap binary instead of the prebuilt
  # executable.
  if os.getenv('DART_USE_BOOTSTRAP_BIN') != None:
    return fallback_executable
  # Try to find a working prebuilt dart executable.
  dart_executable = GetPrebuiltDartExecutablePath('')
  if TryRunningExecutable(dart_executable, package_root):
    return dart_executable
  dart_executable = GetPrebuiltDartExecutablePath('-arm')
  if TryRunningExecutable(dart_executable, package_root):
    return dart_executable
  dart_executable = GetPrebuiltDartExecutablePath('-mips')
  if TryRunningExecutable(dart_executable, package_root):
    return dart_executable
  # If the system cannot execute a prebuilt dart executable, use the bootstrap
  # executable instead.
  DisplayBootstrapWarning()
  return fallback_executable

def main():
  # Parse the options.
  parser = BuildArguments()
  (options, args) = parser.parse_known_args()
  if not ProcessOptions(options, args):
    parser.print_help()
    return 1
  dart_executable = FindDartExecutable(options.dart_executable,
                                       options.package_root)
  return RunPub(dart_executable, options.package_root, args)


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