#!/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/libxml', # via //base/test
    'third_party/modp_b64',
    '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',
]

_chromium_libs = [
    'url',
]

_third_party_deps = [
    'third_party/android_platform',
    'third_party/apple_apsl',
    'third_party/brotli',
    '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/khronos',
    'third_party/libjpeg',
    'third_party/libpng',
    'third_party/libXNVCtrl',
    'third_party/markupsafe',
    'third_party/mesa',
    'third_party/mockito',
    'third_party/ots',
    'third_party/ply',
    'third_party/qcms',
    'third_party/re2',
    'third_party/robolectric',
    'third_party/zlib',
]

dirs_from_chromium = _base_deps + _build_deps + _chromium_libs + _third_party_deps

dirs_from_mojo = [
    'gpu',
    'mojo/android',
    'mojo/application',
    'mojo/common',
    'mojo/converters',
    'mojo/dart',
    'mojo/data_pipe_utils',
    'mojo/edk',
    'mojo/environment',
    'mojo/gles2',
    'mojo/gpu',
    'mojo/icu',
    'mojo/java',
    'mojo/message_pump',
    'mojo/services',
    'mojo/skia',
    'services/asset_bundle',
    'services/keyboard',
    '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',
    'gpu/BUILD.gn',
    '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):
    for d in dirs_to_rev:
      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
      files = system(["git", "ls-files", d], cwd=source_dir)
      for f in files.splitlines():
          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)

    system(["git", "add", "."], cwd=dest_dir)
    src_commit = system(["git", "rev-parse", "HEAD"], cwd=source_dir).strip()
    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()

  if args.mojo_dir:
      rev(args.mojo_dir, args.dest_dir, dirs_from_mojo, 'mojo')

      try:
          patch.patch_and_filter(args.dest_dir,
                                 os.path.join('patches', 'mojo'))
      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

  if args.chromium_dir:
      rev(args.chromium_dir, args.dest_dir, dirs_from_chromium, 'chromium')

      try:
          patch.patch_and_filter(args.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())
