| #!/usr/bin/env vpython3 | 
 | # Copyright 2023 The ChromiumOS Authors | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | # [VPYTHON:BEGIN] | 
 | # python_version: "3.8" | 
 | # [VPYTHON:END] | 
 | """Bazel launcher wrapper. | 
 |  | 
 | This script starts Bazel appropriate for the project you're working in.  It's | 
 | currently used by ChromiumOS, but is intended for use and to be updated by any | 
 | depot_tools users who are using Bazel. | 
 |  | 
 | In the case this script is not able to detect which project you're working in, | 
 | it will fall back to using the next "bazel" executable in your PATH. | 
 | """ | 
 |  | 
 | import itertools | 
 | import os | 
 | from pathlib import Path | 
 | import shutil | 
 | import sys | 
 | from typing import List, Optional | 
 |  | 
 |  | 
 | def _find_bazel_cros() -> Optional[Path]: | 
 |     """Find the bazel launcher for ChromiumOS.""" | 
 |     cwd = Path.cwd() | 
 |     for parent in itertools.chain([cwd], cwd.parents): | 
 |         bazel_launcher = parent / "chromite" / "bin" / "bazel" | 
 |         if bazel_launcher.exists(): | 
 |             return bazel_launcher | 
 |     return None | 
 |  | 
 |  | 
 | def _find_next_bazel_in_path() -> Optional[Path]: | 
 |     """The fallback method: search the remainder of PATH for bazel.""" | 
 |     # Remove depot_tools from PATH if present. | 
 |     depot_tools = Path(__file__).resolve().parent | 
 |     path_env = os.environ.get("PATH", os.defpath) | 
 |     search_paths = [] | 
 |     for path in path_env.split(os.pathsep): | 
 |         if Path(path).resolve() != depot_tools: | 
 |             search_paths.append(path) | 
 |     new_path_env = os.pathsep.join(search_paths) | 
 |     bazel = shutil.which("bazel", path=new_path_env) | 
 |     if bazel: | 
 |         return Path(bazel) | 
 |     return None | 
 |  | 
 |  | 
 | # All functions used to search for Bazel (in order of search). | 
 | _SEARCH_FUNCTIONS = ( | 
 |     _find_bazel_cros, | 
 |     _find_next_bazel_in_path, | 
 | ) | 
 |  | 
 | _FIND_FAILURE_MSG = """\ | 
 | ERROR: The depot_tools bazel launcher was unable to find an appropriate bazel | 
 | executable to use. | 
 |  | 
 | For ChromiumOS developers: | 
 |   Make sure your current directory is inside a ChromiumOS checkout (e.g., | 
 |   ~/chromiumos).  If you're already in a ChromiumOS checkout, it may be because | 
 |   you're working on a branch that's too old (i.e., prior to Bazel). | 
 |  | 
 | If you're not working on any of the above listed projects, this launcher assumes | 
 | that you have Bazel installed on your system somewhere else in PATH.  Check that | 
 | it's actually installed.""" | 
 |  | 
 |  | 
 | def main(argv: List[str]) -> int: | 
 |     """Main.""" | 
 |     for search_func in _SEARCH_FUNCTIONS: | 
 |         bazel = search_func() | 
 |         if bazel: | 
 |             os.execv(bazel, [str(bazel), *argv]) | 
 |  | 
 |     print(_FIND_FAILURE_MSG, file=sys.stderr) | 
 |     return 1 | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |     sys.exit(main(sys.argv[1:])) |