#!/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_generated/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());