blob: 4d64eee18ad238100a417165dcc14870d5a519c7 [file] [log] [blame]
Caroline Tice90723912018-03-28 11:26:59 -07001# -*- coding: utf-8 -*-
2# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Generates a clang-tidy tarball for the clang-tidy builder."""
7
8from __future__ import print_function
9
10import os
11
12from chromite.lib import cros_build_lib
13from chromite.lib import commandline
14from chromite.lib import osutils
15from chromite.lib import sudo
16
17DEFAULT_NAME = 'clang_tidy_warnings.tar.xz'
18TIDY_WARNINGS = 'clang_tidy_warnings'
19PARSING_SCRIPT = '/usr/bin/clang-tidy-parse-build-log.py'
20WORKING_DIR = '/usr/bin'
21
22
23def ParseCommandLine(argv):
24 """Parse args, and run environment-independent checks."""
25 parser = commandline.ArgumentParser(description=__doc__)
26 parser.add_argument('--board', required=True,
27 help=('The board to generate the sysroot for.'))
28 parser.add_argument('--files', required=True,
29 help=('The files to generate warnings files for.'))
30 parser.add_argument('--out-dir', type='path', required=True,
31 help='Directory to place the generated tarball.')
32 parser.add_argument('--out-file', default=DEFAULT_NAME,
33 help='The name to give to the tarball. '
34 'Defaults to %(default)s.')
35 options = parser.parse_args(argv)
36
37 return options
38
39
40class GenerateTidyWarnings(object):
41 """Wrapper for generation functionality."""
42
43 def __init__(self, warnings_dir, options):
44 """Initialize
45
46 Args:
47 warnings_dir: Path to warnings directory.
48 options: Parsed options.
49 """
50 self.warnings_dir = warnings_dir
51 self.options = options
52
53 def _ParseLogFiles(self):
54 log_files = self.options.files
55 for f in log_files:
56 cmd = [PARSING_SCRIPT, '--log_file', f, '--output_dir', self.warnings_dir]
57 cros_build_lib.RunCommand(cmd, cwd=WORKING_DIR, enter_chroot=True)
58
59 def _CreateTarball(self):
60 target = os.path.join(self.options.out_dir, self.options.out_file)
61 cros_build_lib.CreateTarball(target, self.warnings_dir, sudo=True)
62
63 def Perform(self):
64 """Generate the warnings files."""
65 self._ParseLogFiles()
66 self._CreateTarball()
67
68
69def FinishParsing(options):
70 """Run environment dependent checks on parsed args."""
71 target = os.path.join(options.out_dir, options.out_file)
72 if os.path.exists(target):
73 cros_build_lib.Die('Output file %r already exists.' % target)
74
75 if not os.path.isdir(options.out_dir):
76 cros_build_lib.Die(
77 'Non-existent directory %r specified for --out-dir' % options.out_dir)
78
79
80def main(argv):
81 options = ParseCommandLine(argv)
82 FinishParsing(options)
83
84 cros_build_lib.AssertInsideChroot()
85
86 with sudo.SudoKeepAlive(ttyless_sudo=False):
87 with osutils.TempDir(set_global=True, sudo_rm=True) as tempdir:
88 warnings_dir = os.path.join(tempdir, TIDY_WARNINGS)
89 os.mkdir(warnings_dir)
90 GenerateTidyWarnings(warnings_dir, options).Perform()