xref: /aosp_15_r20/external/toolchain-utils/llvm_tools/bb_add.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# Copyright 2024 The ChromiumOS Authors
3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
4*760c253cSXin Li# found in the LICENSE file.
5*760c253cSXin Li
6*760c253cSXin Li"""Runs `bb add`, with additional convenience features."""
7*760c253cSXin Li
8*760c253cSXin Liimport argparse
9*760c253cSXin Liimport logging
10*760c253cSXin Liimport os
11*760c253cSXin Liimport shlex
12*760c253cSXin Liimport sys
13*760c253cSXin Lifrom typing import Iterable, List
14*760c253cSXin Li
15*760c253cSXin Liimport cros_cls
16*760c253cSXin Liimport llvm_next
17*760c253cSXin Li
18*760c253cSXin Li
19*760c253cSXin Lidef generate_bb_add_command(
20*760c253cSXin Li    use_llvm_next: bool,
21*760c253cSXin Li    disable_werror: bool,
22*760c253cSXin Li    extra_cls: Iterable[cros_cls.ChangeListURL],
23*760c253cSXin Li    bots: Iterable[str],
24*760c253cSXin Li) -> List[str]:
25*760c253cSXin Li    cls: List[cros_cls.ChangeListURL] = []
26*760c253cSXin Li    if use_llvm_next:
27*760c253cSXin Li        if not llvm_next.LLVM_NEXT_TESTING_CLS:
28*760c253cSXin Li            raise ValueError(
29*760c253cSXin Li                "llvm-next testing requested, but no llvm-next CLs exist."
30*760c253cSXin Li            )
31*760c253cSXin Li        cls += llvm_next.LLVM_NEXT_TESTING_CLS
32*760c253cSXin Li
33*760c253cSXin Li    if disable_werror:
34*760c253cSXin Li        cls.append(llvm_next.DISABLE_WERROR_CL)
35*760c253cSXin Li
36*760c253cSXin Li    if extra_cls:
37*760c253cSXin Li        cls += extra_cls
38*760c253cSXin Li
39*760c253cSXin Li    cmd = ["bb", "add"]
40*760c253cSXin Li    for cl in cls:
41*760c253cSXin Li        cmd += ("-cl", cl.crrev_url_without_http())
42*760c253cSXin Li    cmd += bots
43*760c253cSXin Li    return cmd
44*760c253cSXin Li
45*760c253cSXin Li
46*760c253cSXin Lidef main(argv: List[str]) -> None:
47*760c253cSXin Li    logging.basicConfig(
48*760c253cSXin Li        format=">> %(asctime)s: %(levelname)s: %(filename)s:%(lineno)d: "
49*760c253cSXin Li        "%(message)s",
50*760c253cSXin Li        level=logging.INFO,
51*760c253cSXin Li    )
52*760c253cSXin Li
53*760c253cSXin Li    parser = argparse.ArgumentParser(
54*760c253cSXin Li        description=__doc__,
55*760c253cSXin Li        formatter_class=argparse.RawDescriptionHelpFormatter,
56*760c253cSXin Li    )
57*760c253cSXin Li    parser.add_argument(
58*760c253cSXin Li        "--llvm-next",
59*760c253cSXin Li        action="store_true",
60*760c253cSXin Li        help="Add the current llvm-next patch set.",
61*760c253cSXin Li    )
62*760c253cSXin Li    parser.add_argument(
63*760c253cSXin Li        "--disable-werror",
64*760c253cSXin Li        action="store_true",
65*760c253cSXin Li        help="Add the 'disable -Werror' patch sets",
66*760c253cSXin Li    )
67*760c253cSXin Li    parser.add_argument(
68*760c253cSXin Li        "--cl",
69*760c253cSXin Li        action="append",
70*760c253cSXin Li        type=cros_cls.ChangeListURL.parse,
71*760c253cSXin Li        help="""
72*760c253cSXin Li        CL to add to the `bb add` run. May be specified multiple times. In the
73*760c253cSXin Li        form crrev.com/c/123456.
74*760c253cSXin Li        """,
75*760c253cSXin Li    )
76*760c253cSXin Li    parser.add_argument("bot", nargs="+", help="Bot(s) to run `bb add` with.")
77*760c253cSXin Li    opts = parser.parse_args(argv)
78*760c253cSXin Li
79*760c253cSXin Li    cmd = generate_bb_add_command(
80*760c253cSXin Li        use_llvm_next=opts.llvm_next,
81*760c253cSXin Li        disable_werror=opts.disable_werror,
82*760c253cSXin Li        extra_cls=opts.cl,
83*760c253cSXin Li        bots=opts.bot,
84*760c253cSXin Li    )
85*760c253cSXin Li    logging.info("Running `bb add` command: %s...", shlex.join(cmd))
86*760c253cSXin Li    # execvp raises if it fails, so no need to check.
87*760c253cSXin Li    os.execvp(cmd[0], cmd)
88*760c253cSXin Li
89*760c253cSXin Li
90*760c253cSXin Liif __name__ == "__main__":
91*760c253cSXin Li    main(sys.argv[1:])
92