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