Mike Frysinger | f1ba7ad | 2022-09-12 05:42:57 -0400 | [diff] [blame] | 1 | # Copyright 2012 The ChromiumOS Authors |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """Sync the Chrome source code used by Chrome OS to the specified directory.""" |
| 6 | |
Mike Frysinger | 49c6e1f | 2022-04-14 15:41:40 -0400 | [diff] [blame] | 7 | import argparse |
Chris McDonald | 59650c3 | 2021-07-20 15:29:28 -0600 | [diff] [blame] | 8 | import logging |
Ryan Cui | 21aa0be | 2013-05-02 10:34:21 -0700 | [diff] [blame] | 9 | |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 10 | from chromite.lib import commandline |
Chris McDonald | 59650c3 | 2021-07-20 15:29:28 -0600 | [diff] [blame] | 11 | from chromite.lib import constants |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 12 | from chromite.lib import cros_build_lib |
| 13 | from chromite.lib import gclient |
| 14 | from chromite.lib import osutils |
| 15 | |
| 16 | |
| 17 | def GetParser(): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 18 | """Creates the argparse parser.""" |
| 19 | parser = commandline.ArgumentParser(description=__doc__) |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 20 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 21 | version = parser.add_mutually_exclusive_group() |
| 22 | version.add_argument( |
| 23 | "--tag", help="Sync to specified Chrome release", dest="version" |
| 24 | ) |
| 25 | version.add_argument( |
| 26 | "--revision", help="Sync to specified git revision", dest="version" |
| 27 | ) |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 28 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 29 | parser.add_argument( |
| 30 | "--internal", |
| 31 | help="Sync internal version of Chrome", |
| 32 | action="store_true", |
| 33 | default=False, |
| 34 | ) |
| 35 | parser.add_argument( |
| 36 | "--reset", |
| 37 | help="Revert local changes", |
| 38 | action="store_true", |
| 39 | default=False, |
| 40 | ) |
| 41 | parser.add_argument("--gclient", help=argparse.SUPPRESS, default=None) |
| 42 | parser.add_argument( |
| 43 | "--gclient_template", help="Template gclient input file" |
| 44 | ) |
| 45 | parser.add_argument( |
| 46 | "--skip_cache", |
| 47 | help="Skip using git cache", |
| 48 | dest="use_cache", |
| 49 | action="store_false", |
| 50 | ) |
| 51 | parser.add_argument( |
| 52 | "--git_cache_dir", type="path", help="Define explicit git cache." |
| 53 | ) |
| 54 | parser.add_argument("chrome_root", help="Directory to sync chrome in") |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 55 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 56 | return parser |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 57 | |
| 58 | |
Don Garrett | b5b33d0 | 2016-06-01 09:37:58 -0700 | [diff] [blame] | 59 | def SyncChrome(gclient_path, options): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 60 | """Sync new Chrome.""" |
| 61 | gclient.WriteConfigFile( |
| 62 | gclient_path, |
| 63 | options.chrome_root, |
| 64 | options.internal, |
| 65 | options.version, |
| 66 | options.gclient_template, |
| 67 | options.use_cache, |
| 68 | git_cache_dir=options.git_cache_dir, |
| 69 | ) |
| 70 | try: |
| 71 | gclient.Sync(gclient_path, options.chrome_root, reset=options.reset) |
| 72 | except cros_build_lib.RunCommandError as e: |
| 73 | cros_build_lib.Die(f"gclient sync exited {e.returncode}") |
Don Garrett | b5b33d0 | 2016-06-01 09:37:58 -0700 | [diff] [blame] | 74 | |
| 75 | |
Mike Frysinger | 9ad5fab | 2013-05-30 13:37:26 -0400 | [diff] [blame] | 76 | def main(argv): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 77 | parser = GetParser() |
| 78 | options = parser.parse_args(argv) |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 79 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 80 | if options.gclient == "": |
| 81 | parser.error("--gclient can not be an empty string!") |
| 82 | gclient_path = options.gclient or osutils.Which("gclient") |
| 83 | if not gclient_path: |
Mike Frysinger | a95870e | 2023-03-27 15:45:34 -0400 | [diff] [blame^] | 84 | gclient_path = constants.DEPOT_TOOLS_DIR / "gclient" |
Simran Basi | 7d7dbd8 | 2015-01-14 14:01:55 -0800 | [diff] [blame] | 85 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 86 | try: |
| 87 | if options.reset: |
| 88 | # Revert any lingering local changes. |
| 89 | gclient.Revert(gclient_path, options.chrome_root) |
David James | ef74b1c | 2012-11-12 07:47:47 -0800 | [diff] [blame] | 90 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 91 | SyncChrome(gclient_path, options) |
| 92 | except cros_build_lib.RunCommandError: |
| 93 | # If we have an error resetting, or syncing, we clobber, and fresh sync. |
| 94 | logging.warning("Chrome checkout appears corrupt. Clobbering.") |
| 95 | osutils.RmDir(options.chrome_root, ignore_missing=True, sudo=True) |
| 96 | osutils.SafeMakedirsNonRoot(options.chrome_root) |
| 97 | SyncChrome(gclient_path, options) |
Ryan Cui | 21aa0be | 2013-05-02 10:34:21 -0700 | [diff] [blame] | 98 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 99 | return 0 |