| # 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="path", help="Define explicit git cache." | |
| ) | |
| parser.add_argument("chrome_root", help="Directory to sync chrome in") | |
| return parser | |
| def SyncChrome(gclient_path, options): | |
| """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 |