text: #!/usr/bin/env python
  # Copyright 2015 The Chromium 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 argparse
  import json
  import os
  import subprocess
  import sys
  import urllib2
  from utils import commit
  from utils import system
  import patch
  
  # //base and its dependencies
  _base_deps = [
      'base',
      'testing',
      'third_party/ashmem',
      'third_party/libevent',
      'third_party/tcmalloc',
  ]
  
  # //build and its dependencies
  _build_deps = [
      'build',
      'third_party/android_testrunner',
      'third_party/binutils',
      'third_party/instrumented_libraries',
      'third_party/pymock',
      'tools/android',
      'tools/clang',
      'tools/generate_library_loader',
      'tools/gritsettings',
      'tools/valgrind',
  ]
  
  _third_party_deps = [
      'third_party/android_platform',
      'third_party/apple_apsl',
      'third_party/expat',
      'third_party/freetype-android',
      'third_party/harfbuzz-ng',
      'third_party/iccjpeg',
      'third_party/jinja2',
      'third_party/jsr-305',
      'third_party/junit',
      'third_party/libjpeg',
      'third_party/libpng',
      'third_party/markupsafe',
      'third_party/mesa',
      'third_party/mockito',
      'third_party/ply',
      'third_party/qcms',
      'third_party/robolectric',
      'third_party/zlib',
  ]
  
  dirs_from_chromium = _base_deps + _build_deps + _third_party_deps
  
  dirs_from_mojo = [
      'mojo/android',
      'mojo/application',
      'mojo/common',
      ('mojo/dart/embedder', ['embedder.gni']),
      'mojo/dart/packages/mojo',
      'mojo/data_pipe_utils',
      'mojo/edk',
      'mojo/environment',
      'mojo/java',
      'mojo/message_pump',
      'mojo/services',
      'mojo/skia',
      'services/sensors',
  ]
  
  # The contents of these files before the roll will be preserved after the roll,
  # even though they live in directories rolled in from Chromium.
  files_not_to_roll = [
      'build/config/ui.gni',
      'build/ls.py',
      'build/module_args/mojo.gni',
      'tools/android/download_android_tools.py',
      'tools/android/VERSION_LINUX_NDK',
      'tools/android/VERSION_LINUX_SDK',
      'tools/android/VERSION_MACOSX_NDK',
      'tools/android/VERSION_MACOSX_SDK',
  ]
  
  
  def rev(source_dir, dest_dir, dirs_to_rev, name, revision_file=None):
      for dir_to_rev in dirs_to_rev:
        if type(dir_to_rev) is tuple:
            d, file_subset = dir_to_rev
        else:
            d = dir_to_rev
            file_subset = None
        print "removing directory %s" % d
        try:
            system(["git", "rm", "-r", d], cwd=dest_dir)
        except subprocess.CalledProcessError:
            print "Could not remove %s" % d
        print "cloning directory %s" % d
  
        if file_subset is None:
            files = system(["git", "ls-files", d], cwd=source_dir).splitlines()
        else:
            files = [os.path.join(d, f) for f in file_subset]
  
        for f in files:
            source_path = os.path.join(source_dir, f)
            if not os.path.isfile(source_path):
                continue
            dest_path = os.path.join(dest_dir, f)
            system(["mkdir", "-p", os.path.dirname(dest_path)], cwd=source_dir)
            system(["cp", source_path, dest_path], cwd=source_dir)
        system(["git", "add", d], cwd=dest_dir)
  
      for f in files_not_to_roll:
          system(["git", "checkout", "HEAD", f], cwd=dest_dir)
  
      src_commit = system(["git", "rev-parse", "HEAD"], cwd=source_dir).strip()
  
      if revision_file:
        with open(revision_file, 'w') as f:
          f.write(src_commit)
  
      system(["git", "add", "."], cwd=dest_dir)
      commit("Update to %s %s" % (name, src_commit), cwd=dest_dir)
  
  
  def main():
    parser = argparse.ArgumentParser(description="Update the mojo repo's " +
        "snapshot of things imported from chromium.")
    parser.add_argument("--mojo-dir", type=str)
    parser.add_argument("--chromium-dir", type=str)
    parser.add_argument("--dest-dir", type=str)
  
    args = parser.parse_args()
  
    dest_dir = os.path.abspath(args.dest_dir)
  
    if args.mojo_dir:
        rev(os.path.abspath(args.mojo_dir), dest_dir, dirs_from_mojo, 'mojo',
            revision_file='mojo/VERSION')
  
    if args.chromium_dir:
        rev(os.path.abspath(args.chromium_dir), dest_dir, dirs_from_chromium, 'chromium')
  
        try:
            patch.patch_and_filter(dest_dir, os.path.join('patches', 'chromium'))
        except subprocess.CalledProcessError:
            print "ERROR: Roll failed due to a patch not applying"
            print "Fix the patch to apply, commit the result, and re-run this script"
            return 1
  
    return 0
  
  
  if __name__ == "__main__":
    sys.exit(main())
  