Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Jack Rosenthal | 54e8643 | 2023-07-25 19:22:55 +0000 | [diff] [blame] | 2 | # Copyright 2011 The ChromiumOS Authors |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 5 | """Wrapper for chromite tools. |
| 6 | |
| 7 | The script is intend to be symlinked to any number of chromite tools, attempts |
| 8 | to find the path for chromite, and hands off to the right tool via exec if |
| 9 | possible. |
| 10 | |
| 11 | It is intended to used strictly outside of the chroot. |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 12 | """ |
| 13 | |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 14 | import enum |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 15 | import os |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 16 | from pathlib import Path |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 17 | import subprocess |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 18 | import sys |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 19 | from typing import List, NamedTuple, Optional, Tuple |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 20 | |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 21 | # Min version of Python that we *want*. We warn for older versions. |
Mike Frysinger | 5decb17 | 2022-12-16 00:21:38 +0000 | [diff] [blame] | 22 | MIN_PYTHON_VER_SOFT = (3, 8) |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 23 | # Min version of Python that we *require*. We abort for older versions. |
Jack Rosenthal | b5eff1c | 2023-04-27 21:39:03 +0000 | [diff] [blame] | 24 | MIN_PYTHON_VER_HARD = (3, 8) |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 25 | |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 26 | DEPOT_TOOLS_DIR = Path(__file__).resolve().parent |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 27 | |
| 28 | # Directory where cros-specific CIPD packages are installed. |
| 29 | CIPD_CACHE_DIR = DEPOT_TOOLS_DIR / '.cipd_bin_cros_python2' |
| 30 | |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 31 | |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 32 | class Checkout(NamedTuple): |
| 33 | """Some details about this checkout.""" |
| 34 | |
| 35 | root: Path |
| 36 | chromite_dir: Path |
| 37 | |
| 38 | |
| 39 | def _FindChromite(path: Path) -> Optional[Checkout]: |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 40 | """Find the chromite dir in a repo, gclient, or submodule checkout.""" |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 41 | path = path.resolve() |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 42 | # Depending on the checkout type (whether repo chromeos or gclient chrome) |
| 43 | # Chromite lives in a different location. |
| 44 | roots = ( |
Mike Frysinger | ffd07cc | 2023-10-09 16:34:09 +0000 | [diff] [blame] | 45 | # CrOS checkout using normal manifest. |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 46 | ('.repo', 'chromite/.git'), |
Mike Frysinger | ffd07cc | 2023-10-09 16:34:09 +0000 | [diff] [blame] | 47 | # CrOS checkout using CitC. |
| 48 | ('../.citc', 'chromite/__init__.py'), |
| 49 | # Chromium checkout using gclient+DEPS. |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 50 | ('.gclient', 'src/third_party/chromite/.git'), |
Mike Frysinger | ffd07cc | 2023-10-09 16:34:09 +0000 | [diff] [blame] | 51 | # Chromium checkout using git submodules. |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 52 | ('src/.gitmodules', 'src/third_party/chromite/.git'), |
Mike Frysinger | ffd07cc | 2023-10-09 16:34:09 +0000 | [diff] [blame] | 53 | # Chromium checkout using CitC. |
| 54 | ('../.citc', 'third_party/chromite/__init__.py'), |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 55 | ) |
rcui@google.com | 3f4f3fb | 2013-02-08 22:29:53 +0000 | [diff] [blame] | 56 | |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 57 | while path != Path("/"): |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 58 | for root, chromite_git_dir in roots: |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 59 | if all((path / x).exists() for x in [root, chromite_git_dir]): |
| 60 | return Checkout(path, (path / chromite_git_dir).parent) |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 61 | path = path.parent |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 62 | return None |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 63 | |
| 64 | |
| 65 | def _MissingErrorOut(target): |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 66 | sys.stderr.write("""ERROR: Couldn't find the chromite tool %s. |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 67 | |
Jack Rosenthal | 54e8643 | 2023-07-25 19:22:55 +0000 | [diff] [blame] | 68 | Please change to a directory inside your ChromiumOS source tree |
| 69 | and retry. If you need to setup a ChromiumOS source tree, see |
Mike Frysinger | ea98ebb | 2019-10-23 20:24:33 +0000 | [diff] [blame] | 70 | https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 71 | """ % target) |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 72 | return 127 |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 73 | |
| 74 | |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 75 | def _CheckPythonVersion(): |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 76 | """Verify active Python is new enough.""" |
| 77 | if sys.version_info >= MIN_PYTHON_VER_SOFT: |
| 78 | return |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 79 | |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 80 | progname = os.path.basename(sys.argv[0]) |
| 81 | print('%s: ChromiumOS requires Python-%s+, but "%s" is "%s"' % |
| 82 | (progname, '.'.join(str(x) for x in MIN_PYTHON_VER_SOFT), |
| 83 | sys.executable, sys.version.replace('\n', ' ')), |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 84 | file=sys.stderr) |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 85 | if sys.version_info < MIN_PYTHON_VER_HARD: |
| 86 | print('%s: fatal: giving up since Python is too old.' % (progname, ), |
| 87 | file=sys.stderr) |
| 88 | sys.exit(1) |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 89 | |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 90 | print( |
| 91 | 'warning: temporarily continuing anyways; you must upgrade soon to ' |
| 92 | 'maintain support.', |
| 93 | file=sys.stderr) |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 94 | |
| 95 | |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 96 | def _BootstrapVpython27(): |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 97 | """Installs the vpython2.7 packages into the cipd cache directory.""" |
| 98 | subprocess.run([ |
| 99 | 'cipd', 'ensure', '-log-level', 'info', '-ensure-file', |
| 100 | DEPOT_TOOLS_DIR / 'cipd_manifest_cros_python2.txt', '-root', |
| 101 | CIPD_CACHE_DIR |
| 102 | ], |
| 103 | check=True) |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 104 | |
| 105 | |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 106 | def main(): |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 107 | _CheckPythonVersion() |
Mike Frysinger | b847c56 | 2020-02-26 16:37:13 +0000 | [diff] [blame] | 108 | |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 109 | result = _FindChromite(Path.cwd()) |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 110 | target = os.path.basename(sys.argv[0]) |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 111 | if result is None: |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 112 | return _MissingErrorOut(target) |
Mike Frysinger | cd9f6dc | 2023-10-27 18:40:02 +0000 | [diff] [blame] | 113 | root, chromite_dir = result |
| 114 | |
| 115 | is_citc = (root.parent / ".citc").is_dir() |
| 116 | if is_citc: |
| 117 | # citc workspaces don't like dirty files like pyc. |
| 118 | os.environ["PYTHONDONTWRITEBYTECODE"] = "1" |
rcui@google.com | 3f4f3fb | 2013-02-08 22:29:53 +0000 | [diff] [blame] | 119 | |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 120 | path = chromite_dir / "bin" / target |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 121 | |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 122 | # Check to see if this is a script requiring vpython2.7. |
Mike Frysinger | fa9968d | 2023-10-27 17:04:54 +0000 | [diff] [blame] | 123 | with path.open("rb") as fp: |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 124 | shebang = next(fp).strip() |
| 125 | interpreter = shebang.split()[-1] |
| 126 | if interpreter in (b'python', b'python2', b'python2.7', b'vpython'): |
| 127 | _BootstrapVpython27() |
| 128 | vpython = CIPD_CACHE_DIR / 'vpython' |
| 129 | args = [vpython] |
| 130 | if interpreter != b'vpython': |
| 131 | args.extend( |
| 132 | ['-vpython-spec', DEPOT_TOOLS_DIR / 'cros_python2.vpython']) |
| 133 | args.append(path) |
| 134 | path = vpython |
| 135 | else: |
| 136 | args = [path] |
Brian Ryner | 252b198 | 2023-01-03 22:56:22 +0000 | [diff] [blame] | 137 | |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 138 | os.execv(path, args + sys.argv[1:]) |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 139 | |
ferringb@google.com | 0230d91 | 2012-03-23 19:33:18 +0000 | [diff] [blame] | 140 | |
| 141 | if __name__ == '__main__': |
Mike Frysinger | 124bb8e | 2023-09-06 05:48:55 +0000 | [diff] [blame] | 142 | sys.exit(main()) |