Mike Frysinger | f1ba7ad | 2022-09-12 05:42:57 -0400 | [diff] [blame] | 1 | # Copyright 2012 The ChromiumOS Authors |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """Generates a clang-tidy tarball for the clang-tidy builder.""" |
| 6 | |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 7 | import os |
Caroline Tice | d2c34b3 | 2018-04-04 15:08:55 -0700 | [diff] [blame] | 8 | import shutil |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 9 | |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 10 | from chromite.lib import commandline |
Mike Frysinger | 807d828 | 2022-04-28 22:45:17 -0400 | [diff] [blame] | 11 | from chromite.lib import cros_build_lib |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 12 | from chromite.lib import osutils |
| 13 | from chromite.lib import sudo |
| 14 | |
Mike Frysinger | 6a2b0f2 | 2020-02-20 13:34:07 -0500 | [diff] [blame] | 15 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 16 | DEFAULT_NAME = "clang_tidy_warnings.tar.xz" |
| 17 | TIDY_WARNINGS = "clang_tidy_warnings" |
| 18 | PARSING_SCRIPT = ( |
| 19 | "/mnt/host/source/src/third_party/toolchain-utils/" |
| 20 | "clang_tidy/clang_tidy_parse_build_log.py" |
| 21 | ) |
| 22 | WORKING_DIR = "/usr/bin" |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 23 | |
| 24 | |
| 25 | def ParseCommandLine(argv): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 26 | """Parse args, and run environment-independent checks.""" |
| 27 | parser = commandline.ArgumentParser(description=__doc__) |
| 28 | parser.add_argument( |
| 29 | "--board", |
| 30 | required=True, |
| 31 | help=("The board to generate the sysroot for."), |
| 32 | ) |
| 33 | parser.add_argument( |
| 34 | "--logs-dir", |
| 35 | required=True, |
| 36 | help=("The directory containg the logs files to " "be parsed."), |
| 37 | ) |
| 38 | parser.add_argument( |
| 39 | "--out-dir", |
| 40 | type="path", |
| 41 | required=True, |
| 42 | help="Directory to place the generated tarball.", |
| 43 | ) |
| 44 | parser.add_argument( |
| 45 | "--out-file", |
| 46 | default=DEFAULT_NAME, |
| 47 | help="The name to give to the tarball. " "Defaults to %(default)s.", |
| 48 | ) |
| 49 | options = parser.parse_args(argv) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 50 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 51 | return options |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 52 | |
| 53 | |
| 54 | class GenerateTidyWarnings(object): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 55 | """Wrapper for generation functionality.""" |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 56 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 57 | def __init__(self, warnings_dir, options): |
| 58 | """Initialize |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 59 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 60 | Args: |
Alex Klein | 345222d | 2023-01-20 17:33:41 -0700 | [diff] [blame^] | 61 | warnings_dir: Path to warnings directory. |
| 62 | options: Parsed options. |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 63 | """ |
| 64 | self.warnings_dir = warnings_dir |
| 65 | self.options = options |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 66 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 67 | def _FindLogFiles(self, logs_dir): |
| 68 | files = [] |
| 69 | filelist = os.listdir(logs_dir) |
| 70 | for f in filelist: |
| 71 | logfile = os.path.join(logs_dir, f) |
| 72 | files.append(logfile) |
| 73 | return files |
Caroline Tice | d2c34b3 | 2018-04-04 15:08:55 -0700 | [diff] [blame] | 74 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 75 | def _ParseLogFiles(self): |
| 76 | log_files = self._FindLogFiles(self.options.logs_dir) |
| 77 | for f in log_files: |
| 78 | # Copy log file to output directory because this is what we want to |
| 79 | # upload to gs |
| 80 | shutil.copy2(f, self.warnings_dir) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 81 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 82 | def _CreateTarball(self): |
| 83 | tarball_path = os.path.join(self.options.out_dir, self.options.out_file) |
| 84 | cros_build_lib.CreateTarball(tarball_path, self.warnings_dir, sudo=True) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 85 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 86 | def Perform(self): |
| 87 | """Generate the warnings files.""" |
| 88 | self._ParseLogFiles() |
| 89 | self._CreateTarball() |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 90 | |
| 91 | |
| 92 | def FinishParsing(options): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 93 | """Run environment dependent checks on parsed args.""" |
| 94 | target = os.path.join(options.out_dir, options.out_file) |
| 95 | if os.path.exists(target): |
Alex Klein | df8ee50 | 2022-10-18 09:48:15 -0600 | [diff] [blame] | 96 | cros_build_lib.Die("Output file %r already exists.", target) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 97 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 98 | if not os.path.isdir(options.out_dir): |
| 99 | cros_build_lib.Die( |
| 100 | "Non-existent directory %r specified for --out-dir" |
| 101 | % options.out_dir |
| 102 | ) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 103 | |
| 104 | |
| 105 | def main(argv): |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 106 | options = ParseCommandLine(argv) |
| 107 | FinishParsing(options) |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 108 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 109 | cros_build_lib.AssertInsideChroot() |
Caroline Tice | 9072391 | 2018-03-28 11:26:59 -0700 | [diff] [blame] | 110 | |
Alex Klein | 1699fab | 2022-09-08 08:46:06 -0600 | [diff] [blame] | 111 | with sudo.SudoKeepAlive(ttyless_sudo=False): |
| 112 | with osutils.TempDir(set_global=True, sudo_rm=True) as tempdir: |
| 113 | warnings_dir = os.path.join(tempdir, TIDY_WARNINGS) |
| 114 | os.mkdir(warnings_dir) |
| 115 | GenerateTidyWarnings(warnings_dir, options).Perform() |