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