aboutsummaryrefslogtreecommitdiff
path: root/llvm_tools/stabilize_all_llvm_packages.py
diff options
context:
space:
mode:
Diffstat (limited to 'llvm_tools/stabilize_all_llvm_packages.py')
-rwxr-xr-xllvm_tools/stabilize_all_llvm_packages.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/llvm_tools/stabilize_all_llvm_packages.py b/llvm_tools/stabilize_all_llvm_packages.py
new file mode 100755
index 00000000..40ca29f5
--- /dev/null
+++ b/llvm_tools/stabilize_all_llvm_packages.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python3
+# Copyright 2024 The ChromiumOS Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Marks all LLVM packages as stable.
+
+This essentially performs the job of annealing: take whatever's in the 9999
+ebuilds, and put it in non-9999 ebuilds. The result is committed to
+chromiumos-overlay, unless there are no changes to make. If the stabilization
+does nothing, no new ebuilds will be created, and nothing will be committed.
+
+The results of this script should _not_ be uploaded. Annealing should be
+responsible for actually stabilizing our ebuilds upstream.
+
+Run this from inside of the chroot.
+"""
+
+import argparse
+import contextlib
+import logging
+from pathlib import Path
+import subprocess
+import sys
+from typing import List
+
+import chroot
+import get_upstream_patch
+import manifest_utils
+import patch_utils
+
+
+CROS_SOURCE_ROOT = Path("/mnt/host/source")
+
+
+@contextlib.contextmanager
+def llvm_checked_out_to(checkout_sha: str):
+ """Checks out LLVM to `checkout_sha`, if necessary.
+
+ Restores LLVM to the prior SHA when exited.
+ """
+ llvm_dir = CROS_SOURCE_ROOT / manifest_utils.LLVM_PROJECT_PATH
+ original_sha = subprocess.run(
+ ["git", "rev-parse", "HEAD"],
+ check=True,
+ cwd=llvm_dir,
+ stdout=subprocess.PIPE,
+ encoding="utf-8",
+ ).stdout.strip()
+ if checkout_sha == original_sha:
+ logging.info(
+ "LLVM is already checked out to %s; not checking out", checkout_sha
+ )
+ yield
+ return
+
+ return_code = subprocess.run(
+ ["git", "status", "--porcelain"],
+ check=False,
+ cwd=llvm_dir,
+ ).returncode
+ if return_code:
+ raise ValueError(
+ f"LLVM checkout at {llvm_dir} is unclean; refusing to modify"
+ )
+
+ logging.info("Checking %s out to SHA %s...", llvm_dir, checkout_sha)
+
+ subprocess.run(
+ ["git", "checkout", checkout_sha],
+ check=True,
+ cwd=llvm_dir,
+ )
+ try:
+ yield
+ finally:
+ logging.info("Restoring %s to original checkout...", llvm_dir)
+ return_code = subprocess.run(
+ ["git", "checkout", original_sha],
+ check=False,
+ cwd=llvm_dir,
+ ).returncode
+ if return_code:
+ logging.error(
+ "Failed checking llvm-project back out to %s :(",
+ original_sha,
+ )
+
+
+def resolve_llvm_sha(llvm_next: bool) -> str:
+ sys_devel_llvm = (
+ CROS_SOURCE_ROOT / "src/third_party/chromiumos-overlay/sys-devel/llvm"
+ )
+ sha = "llvm-next" if llvm_next else "llvm"
+ return get_upstream_patch.resolve_symbolic_sha(sha, str(sys_devel_llvm))
+
+
+def main(argv: List[str]) -> None:
+ chroot.VerifyInsideChroot()
+
+ logging.basicConfig(
+ format=">> %(asctime)s: %(levelname)s: %(filename)s:%(lineno)d: "
+ "%(message)s",
+ level=logging.INFO,
+ )
+
+ parser = argparse.ArgumentParser(
+ description=__doc__,
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
+ parser.add_argument(
+ "--llvm-next",
+ action="store_true",
+ help="""
+ If passed, the ebuilds will be stabilized using the current llvm-next
+ hash.
+ """,
+ )
+ opts = parser.parse_args(argv)
+ desired_sha = resolve_llvm_sha(opts.llvm_next)
+
+ with llvm_checked_out_to(desired_sha):
+ packages_to_stabilize = patch_utils.CHROMEOS_PATCHES_JSON_PACKAGES
+ logging.info("Stabilizing %s...", ", ".join(packages_to_stabilize))
+
+ cros_overlay = CROS_SOURCE_ROOT / "src/third_party/chromiumos-overlay"
+ return_code = subprocess.run(
+ [
+ "cros_mark_as_stable",
+ f"--overlays={cros_overlay}",
+ "--packages=" + ":".join(packages_to_stabilize),
+ "commit",
+ ],
+ check=False,
+ stdin=subprocess.DEVNULL,
+ ).returncode
+ sys.exit(return_code)
+
+
+if __name__ == "__main__":
+ main(sys.argv[1:])