#!/usr/bin/env python3
# Copyright (c) 2017, the R8 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.

from os.path import basename, join
from shutil import copy2
from subprocess import check_call
import argparse
import multiprocessing
import os
import sys

import utils
import utils_aosp

AOSP_MANIFEST_XML = join(utils.REPO_ROOT, 'third_party',
  'aosp_manifest.xml')
AOSP_MANIFEST_URL = 'https://android.googlesource.com/platform/manifest'
J_DEFAULT = multiprocessing.cpu_count() - 2

# Checkout AOSP source to the specified direcotry using the speficied manifest.
def checkout_aosp(aosp_root, url, branch, manifest_xml, concurrency, shallow):
  utils.makedirs_if_needed(aosp_root)
  command = ['repo', 'init', '-u', url]
  if (shallow):
    command.extend(['--depth=1'])
  if (branch):
    command.extend(['-b', branch])
  else:
    manifests_dir = join(aosp_root, '.repo', 'manifests')
    utils.makedirs_if_needed(manifests_dir)
    copy2(manifest_xml, manifests_dir)
    command.extend(['-m', basename(manifest_xml)])
  check_call(command, cwd = aosp_root)

  check_call(['repo', 'sync', '-dq', '-j' + concurrency], cwd = aosp_root)

def parse_arguments():
  parser = argparse.ArgumentParser(
      description = 'Checkout the AOSP source tree.')
  utils_aosp.add_root_argument(parser)
  parser.add_argument('--url',
                      help='URL the repo. ' +
                           'Defaults to ' + AOSP_MANIFEST_URL + '.',
                      default=AOSP_MANIFEST_URL)
  parser.add_argument('--manifest',
                      help='Manifest to use for the checkout. ' +
                           'Defaults to ' + AOSP_MANIFEST_XML + '.',
                      default=AOSP_MANIFEST_XML)
  parser.add_argument('--branch',
                      help='Branch to checkout. This overrides ' +
                           'passing --manifest')
  parser.add_argument('--shallow',
                      action = 'store_true',
                      help='Shallow checkout.')
  parser.add_argument('-j',
                      help='Projects to fetch simultaneously. ' +
                           'Defaults to ' + str(J_DEFAULT) + '.',
                      default=str(J_DEFAULT))
  return parser.parse_args()

def Main():
  args = parse_arguments()
  checkout_aosp(args.aosp_root, args.url, args.branch, args.manifest,
                args.j, args.shallow)

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