# Copyright 2012 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Sync the Chrome source code used by Chrome OS to the specified directory."""

import argparse
import logging

from chromite.lib import commandline
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import gclient
from chromite.lib import osutils


def GetParser():
    """Creates the argparse parser."""
    parser = commandline.ArgumentParser(description=__doc__)

    version = parser.add_mutually_exclusive_group()
    version.add_argument(
        "--tag", help="Sync to specified Chrome release", dest="version"
    )
    version.add_argument(
        "--revision", help="Sync to specified git revision", dest="version"
    )

    parser.add_argument(
        "--internal",
        help="Sync internal version of Chrome",
        action="store_true",
        default=False,
    )
    parser.add_argument(
        "--reset",
        help="Revert local changes",
        action="store_true",
        default=False,
    )
    parser.add_argument("--gclient", help=argparse.SUPPRESS, default=None)
    parser.add_argument(
        "--gclient_template", help="Template gclient input file"
    )
    parser.add_argument(
        "--skip_cache",
        help="Skip using git cache",
        dest="use_cache",
        action="store_false",
    )
    parser.add_argument(
        "--git_cache_dir", type="str_path", help="Define explicit git cache."
    )
    parser.add_argument("chrome_root", help="Directory to sync chrome in")

    return parser


def SyncChrome(gclient_path, options) -> None:
    """Sync new Chrome."""
    gclient.WriteConfigFile(
        gclient_path,
        options.chrome_root,
        options.internal,
        options.version,
        options.gclient_template,
        options.use_cache,
        git_cache_dir=options.git_cache_dir,
    )
    try:
        gclient.Sync(gclient_path, options.chrome_root, reset=options.reset)
    except cros_build_lib.RunCommandError as e:
        cros_build_lib.Die(f"gclient sync exited {e.returncode}")


def main(argv):
    parser = GetParser()
    options = parser.parse_args(argv)

    if options.gclient == "":
        parser.error("--gclient can not be an empty string!")
    gclient_path = options.gclient or osutils.Which("gclient")
    if not gclient_path:
        gclient_path = constants.DEPOT_TOOLS_DIR / "gclient"

    try:
        if options.reset:
            # Revert any lingering local changes.
            gclient.Revert(gclient_path, options.chrome_root)

        SyncChrome(gclient_path, options)
    except cros_build_lib.RunCommandError:
        # If we have an error resetting, or syncing, we clobber, and fresh sync.
        logging.warning("Chrome checkout appears corrupt. Clobbering.")
        osutils.RmDir(options.chrome_root, ignore_missing=True, sudo=True)
        osutils.SafeMakedirsNonRoot(options.chrome_root)
        SyncChrome(gclient_path, options)

    return 0
