| Index: tools/observatory_tool.py | 
| diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py | 
| index adf103fde62b31c32ee4ab930f40256ae9c9de62..90c2aa272f81eae443184164dbfefa871ea37938 100755 | 
| --- a/tools/observatory_tool.py | 
| +++ b/tools/observatory_tool.py | 
| @@ -14,7 +14,8 @@ import utils | 
|  | 
| SCRIPT_DIR = os.path.dirname(sys.argv[0]) | 
| DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) | 
| -RUN_PUB = os.path.join(DART_ROOT, 'tools/run_pub.py') | 
| +PUB_PATH = os.path.join(DART_ROOT, 'third_party', 'pkg', | 
| +                        'pub', 'bin', 'pub.dart') | 
| IGNORE_PATTERNS = shutil.ignore_patterns( | 
| '*.map', | 
| '*.concat.js', | 
| @@ -26,7 +27,7 @@ IGNORE_PATTERNS = shutil.ignore_patterns( | 
| '*.log', | 
| '*~') | 
|  | 
| -usage = """obs_tool.py [options]""" | 
| +usage = """observatory_tool.py [options]""" | 
|  | 
| def BuildArguments(): | 
| result = argparse.ArgumentParser(usage=usage) | 
| @@ -41,64 +42,69 @@ def BuildArguments(): | 
|  | 
| def ProcessOptions(options, args): | 
| # Required options. | 
| -  if (options.command == None) or (options.directory == None): | 
| +  if options.command is None or options.directory is None: | 
| return False | 
| -  # If we have a pub executable, we are running from the dart-sdk. | 
| -  if (options.pub_executable != None): | 
| -    return True | 
| -  if (options.sdk != None): | 
| -    # Use the checked in pub executable by default. | 
| -    options.pub_executable = utils.CheckedInPubPath() | 
| -    return True | 
| -  # Otherwise, we need a dart executable and a package root. | 
| -  return ((options.package_root != None) and | 
| -          (options.dart_executable != None)) | 
| +  # If we have a working pub executable, try and use that. | 
| +  # TODO(whesse): Drop the pub-executable option if it isn't used. | 
| +  if options.pub_executable is not None: | 
| +    try: | 
| +      if 0 == subprocess.call([options.pub_executable, '--version']): | 
| +        return True | 
| +    except OSError as e: | 
| +      pass | 
| +  options.pub_executable = None | 
| + | 
| +  if options.sdk is not None and utils.CheckedInSdkCheckExecutable(): | 
| +    # Use the checked in pub executable. | 
| +    options.pub_snapshot = os.path.join(utils.CheckedInSdkPath(), | 
| +                                        'bin', | 
| +                                        'snapshots', | 
| +                                        'pub.dart.snapshot'); | 
| +    try: | 
| +      if 0 == subprocess.call([utils.CheckedInSdkExecutable(), | 
| +                               options.pub_snapshot, | 
| +                               '--version']): | 
| +        return True | 
| +    except OSError as e: | 
| +      pass | 
| +  options.pub_snapshot = None | 
| + | 
| +  # We need a dart executable and a package root. | 
| +  return (options.package_root is not None and | 
| +          options.dart_executable is not None) | 
|  | 
| def ChangeDirectory(directory): | 
| os.chdir(directory); | 
|  | 
| -def PubGet(dart_executable, pub_executable, pkg_root, silent): | 
| -  # Always remove pubspec.lock before running 'pub get'. | 
| -  try: | 
| -    os.remove('pubspec.lock'); | 
| -  except OSError as e: | 
| -    pass | 
| -  with open(os.devnull, 'wb') as silent_sink: | 
| -    if (pub_executable != None): | 
| -      return subprocess.call([pub_executable, | 
| -                              'get', | 
| -                              '--offline'], | 
| -                              stdout=silent_sink if silent else None, | 
| -                              stderr=silent_sink if silent else None) | 
| -    else: | 
| -      return subprocess.call(['python', | 
| -                              RUN_PUB, | 
| -                              '--package-root=' + pkg_root, | 
| -                              '--dart-executable=' + dart_executable, | 
| -                              'get', | 
| -                              '--offline'], | 
| -                              stdout=silent_sink if silent else None, | 
| -                              stderr=silent_sink if silent else None,) | 
| - | 
| -def PubBuild(dart_executable, pub_executable, pkg_root, silent, output_dir): | 
| +def DisplayBootstrapWarning(): | 
| +  print """\ | 
| + | 
| + | 
| +WARNING: Your system cannot run the checked-in Dart SDK. Using the | 
| +bootstrap Dart executable will make debug builds slow. | 
| +Please see the Wiki for instructions on replacing the checked-in Dart SDK. | 
| + | 
| +https://github.com/dart-lang/sdk/wiki/The-checked-in-SDK-in--tools | 
| + | 
| +""" | 
| + | 
| +def PubCommand(dart_executable, | 
| +               pub_executable, | 
| +               pub_snapshot, | 
| +               pkg_root, | 
| +               command, | 
| +               silent): | 
| with open(os.devnull, 'wb') as silent_sink: | 
| -    if (pub_executable != None): | 
| -      return subprocess.call([pub_executable, | 
| -                              'build', | 
| -                              '--output', | 
| -                              output_dir], | 
| -                              stdout=silent_sink if silent else None, | 
| -                              stderr=silent_sink if silent else None,) | 
| +    if pub_executable is not None: | 
| +      executable = [pub_executable] | 
| +    elif pub_snapshot is not None: | 
| +      executable = [utils.CheckedInSdkExecutable(), pub_snapshot] | 
| else: | 
| -      return subprocess.call(['python', | 
| -                              RUN_PUB, | 
| -                              '--package-root=' + pkg_root, | 
| -                              '--dart-executable=' + dart_executable, | 
| -                              'build', | 
| -                              '--output', | 
| -                              output_dir], | 
| -                              stdout=silent_sink if silent else None, | 
| -                              stderr=silent_sink if silent else None,) | 
| +      DisplayBootstrapWarning() | 
| +      executable = [dart_executable, '--package-root=' + pkg_root, PUB_PATH] | 
| +    return subprocess.call(executable + command, | 
| +                           stdout=silent_sink if silent else None, | 
| +                           stderr=silent_sink if silent else None) | 
|  | 
| def Deploy(input_dir, output_dir): | 
| shutil.rmtree(output_dir) | 
| @@ -117,16 +123,24 @@ def RewritePubSpec(input_path, output_path, search, replace): | 
| def ExecuteCommand(options, args): | 
| cmd = options.command | 
| if (cmd == 'get'): | 
| -    return PubGet(options.dart_executable, | 
| -                  options.pub_executable, | 
| -                  options.package_root, | 
| -                  options.silent) | 
| +    # Always remove pubspec.lock before running 'pub get'. | 
| +    try: | 
| +      os.remove('pubspec.lock'); | 
| +    except OSError as e: | 
| +      pass | 
| +    return PubCommand(options.dart_executable, | 
| +                      options.pub_executable, | 
| +                      options.pub_snapshot, | 
| +                      options.package_root, | 
| +                      ['get', '--offline'], | 
| +                      options.silent) | 
| elif (cmd == 'build'): | 
| -    return PubBuild(options.dart_executable, | 
| -                    options.pub_executable, | 
| -                    options.package_root, | 
| -                    options.silent, | 
| -                    args[0]) | 
| +    return PubCommand(options.dart_executable, | 
| +                      options.pub_executable, | 
| +                      options.pub_snapshot, | 
| +                      options.package_root, | 
| +                      ['build', '--output', args[0]], | 
| +                      options.silent) | 
| elif (cmd == 'deploy'): | 
| Deploy('build', 'deployed') | 
| elif (cmd == 'rewrite'): | 
| @@ -142,8 +156,6 @@ def main(): | 
| if not ProcessOptions(options, args): | 
| parser.print_help() | 
| return 1 | 
| -  if os.getenv('DART_USE_BOOTSTRAP_BIN') != None: | 
| -    dart_executable = options.dart_executable | 
| # Calculate absolute paths before changing directory. | 
| if (options.package_root != None): | 
| options.package_root = os.path.abspath(options.package_root) | 
| @@ -151,6 +163,8 @@ def main(): | 
| options.dart_executable = os.path.abspath(options.dart_executable) | 
| if (options.pub_executable != None): | 
| options.pub_executable = os.path.abspath(options.pub_executable) | 
| +  if (options.pub_snapshot != None): | 
| +    options.pub_snapshot = os.path.abspath(options.pub_snapshot) | 
| if len(args) == 1: | 
| args[0] = os.path.abspath(args[0]) | 
| # Pub must be run from the project's root directory. | 
| @@ -158,4 +172,4 @@ def main(): | 
| return ExecuteCommand(options, args) | 
|  | 
| if __name__ == '__main__': | 
| -  sys.exit(main()); | 
| +  sys.exit(main()); | 
|  |