Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: build/android/gyp/lint.py

Issue 1730143003: md5check'ify lint.py (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Only lint changed files. Brings time down to 7s Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 3 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 """Runs Android's lint tool.""" 7 """Runs Android's lint tool."""
8 8
9 9
10 import optparse 10 import optparse
11 import os 11 import os
12 import sys 12 import sys
13 from xml.dom import minidom 13 from xml.dom import minidom
14 14
15 from util import build_utils 15 from util import build_utils
16 16
17 17
18 _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), 18 _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
19 '..', '..', '..')) 19 '..', '..', '..'))
20 20
21 21
22 def _RunLint(lint_path, config_path, processed_config_path, manifest_path, 22 def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
23 result_path, product_dir, sources, jar_path, resource_dir=None): 23 manifest_path, result_path, product_dir, sources, jar_path,
24 resource_dir=None, can_fail_build=False):
24 25
25 def _RelativizePath(path): 26 def _RelativizePath(path):
26 """Returns relative path to top-level src dir. 27 """Returns relative path to top-level src dir.
27 28
28 Args: 29 Args:
29 path: A path relative to cwd. 30 path: A path relative to cwd.
30 """ 31 """
31 return os.path.relpath(os.path.abspath(path), _SRC_ROOT) 32 return os.path.relpath(os.path.abspath(path), _SRC_ROOT)
32 33
33 def _ProcessConfigFile(): 34 def _ProcessConfigFile():
(...skipping 30 matching lines...) Expand all
64 else: 65 else:
65 # Issues in class files don't have a line number. 66 # Issues in class files don't have a line number.
66 error = '%s %s: %s [warning]' % (path, message, issue_id) 67 error = '%s %s: %s [warning]' % (path, message, issue_id)
67 print >> sys.stderr, error.encode('utf-8') 68 print >> sys.stderr, error.encode('utf-8')
68 for attr in ['errorLine1', 'errorLine2']: 69 for attr in ['errorLine1', 'errorLine2']:
69 error_line = issue.getAttribute(attr) 70 error_line = issue.getAttribute(attr)
70 if error_line: 71 if error_line:
71 print >> sys.stderr, error_line.encode('utf-8') 72 print >> sys.stderr, error_line.encode('utf-8')
72 return len(issues) 73 return len(issues)
73 74
75 if changes.AddedOrModifiedOnly():
76 changed_paths = set(changes.IterChangedPaths())
77 sources = [s for s in sources if s in changed_paths]
78
74 with build_utils.TempDir() as temp_dir: 79 with build_utils.TempDir() as temp_dir:
75 _ProcessConfigFile() 80 _ProcessConfigFile()
76 81
77 cmd = [ 82 cmd = [
78 _RelativizePath(lint_path), '-Werror', '--exitcode', '--showall', 83 _RelativizePath(lint_path), '-Werror', '--exitcode', '--showall',
79 '--config', _RelativizePath(processed_config_path), 84 '--config', _RelativizePath(processed_config_path),
80 '--classpath', _RelativizePath(jar_path), 85 '--classpath', _RelativizePath(jar_path),
81 '--xml', _RelativizePath(result_path), 86 '--xml', _RelativizePath(result_path),
82 ] 87 ]
83 if resource_dir: 88 if resource_dir:
(...skipping 30 matching lines...) Expand all
114 if os.path.exists(result_path): 119 if os.path.exists(result_path):
115 os.remove(result_path) 120 os.remove(result_path)
116 121
117 try: 122 try:
118 build_utils.CheckOutput(cmd, cwd=_SRC_ROOT) 123 build_utils.CheckOutput(cmd, cwd=_SRC_ROOT)
119 except build_utils.CalledProcessError as e: 124 except build_utils.CalledProcessError as e:
120 # There is a problem with lint usage 125 # There is a problem with lint usage
121 if not os.path.exists(result_path): 126 if not os.path.exists(result_path):
122 print 'Something is wrong:' 127 print 'Something is wrong:'
123 print e 128 print e
124 return 1 129 raise
125 130
126 # There are actual lint issues 131 # There are actual lint issues
127 else: 132 else:
128 try: 133 try:
129 num_issues = _ParseAndShowResultFile() 134 num_issues = _ParseAndShowResultFile()
130 except Exception: # pylint: disable=broad-except 135 except Exception: # pylint: disable=broad-except
131 print 'Lint created unparseable xml file...' 136 print 'Lint created unparseable xml file...'
132 print 'File contents:' 137 print 'File contents:'
133 with open(result_path) as f: 138 with open(result_path) as f:
134 print f.read() 139 print f.read()
135 return 1 140 raise
136 141
137 _ProcessResultFile() 142 _ProcessResultFile()
138 msg = ('\nLint found %d new issues.\n' 143 msg = ('\nLint found %d new issues.\n'
139 ' - For full explanation refer to %s\n' 144 ' - For full explanation refer to %s\n'
140 ' - Wanna suppress these issues?\n' 145 ' - Wanna suppress these issues?\n'
141 ' 1. Read comment in %s\n' 146 ' 1. Read comment in %s\n'
142 ' 2. Run "python %s %s"\n' % 147 ' 2. Run "python %s %s"\n' %
143 (num_issues, 148 (num_issues,
144 _RelativizePath(result_path), 149 _RelativizePath(result_path),
145 _RelativizePath(config_path), 150 _RelativizePath(config_path),
146 _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android', 151 _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android',
147 'lint', 'suppress.py')), 152 'lint', 'suppress.py')),
148 _RelativizePath(result_path))) 153 _RelativizePath(result_path)))
149 print >> sys.stderr, msg 154 print >> sys.stderr, msg
150 return 1 155 if can_fail_build:
151 156 raise Exception('Lint failed.')
152 return 0
153 157
154 158
155 def main(): 159 def main():
156 parser = optparse.OptionParser() 160 parser = optparse.OptionParser()
157 build_utils.AddDepfileOption(parser) 161 build_utils.AddDepfileOption(parser)
158 parser.add_option('--lint-path', help='Path to lint executable.') 162 parser.add_option('--lint-path', help='Path to lint executable.')
159 parser.add_option('--config-path', help='Path to lint suppressions file.') 163 parser.add_option('--config-path', help='Path to lint suppressions file.')
160 parser.add_option('--processed-config-path', 164 parser.add_option('--processed-config-path',
161 help='Path to processed lint suppressions file.') 165 help='Path to processed lint suppressions file.')
162 parser.add_option('--manifest-path', help='Path to AndroidManifest.xml') 166 parser.add_option('--manifest-path', help='Path to AndroidManifest.xml')
(...skipping 11 matching lines...) Expand all
174 help='Run lint instead of just touching stamp.') 178 help='Run lint instead of just touching stamp.')
175 179
176 options, _ = parser.parse_args() 180 options, _ = parser.parse_args()
177 181
178 build_utils.CheckOptions( 182 build_utils.CheckOptions(
179 options, parser, required=['lint_path', 'config_path', 183 options, parser, required=['lint_path', 'config_path',
180 'processed_config_path', 'manifest_path', 184 'processed_config_path', 'manifest_path',
181 'result_path', 'product_dir', 185 'result_path', 'product_dir',
182 'jar_path']) 186 'jar_path'])
183 187
184 rc = 0
185
186 if options.enable: 188 if options.enable:
187 sources = [] 189 sources = []
188 if options.src_dirs: 190 if options.src_dirs:
189 src_dirs = build_utils.ParseGypList(options.src_dirs) 191 src_dirs = build_utils.ParseGypList(options.src_dirs)
190 sources = build_utils.FindInDirectories(src_dirs, '*.java') 192 sources = build_utils.FindInDirectories(src_dirs, '*.java')
191 elif options.java_files: 193 elif options.java_files:
192 sources = build_utils.ParseGypList(options.java_files) 194 sources = build_utils.ParseGypList(options.java_files)
193 else: 195 else:
194 print 'One of --src-dirs or --java-files must be specified.' 196 print 'One of --src-dirs or --java-files must be specified.'
195 return 1 197 return 1
196 rc = _RunLint(options.lint_path, options.config_path,
197 options.processed_config_path,
198 options.manifest_path, options.result_path,
199 options.product_dir, sources, options.jar_path,
200 options.resource_dir)
201 198
202 if options.depfile: 199 input_paths = [
203 build_utils.WriteDepfile( 200 options.lint_path,
204 options.depfile, 201 options.config_path,
205 build_utils.GetPythonDependencies()) 202 options.manifest_path,
203 options.jar_path,
204 ]
205 input_paths.extend(sources)
206 if options.resource_dir:
207 input_paths.extend(build_utils.FindInDirectory(options.resource_dir, '*'))
206 208
207 if options.stamp and not rc: 209 input_strings = [ options.processed_config_path ]
208 build_utils.Touch(options.stamp) 210 output_paths = [ options.result_path ]
209 211
210 return rc if options.can_fail_build else 0 212 build_utils.CallAndWriteDepfileIfStale(
213 lambda changes: _OnStaleMd5(changes, options.lint_path,
214 options.config_path,
215 options.processed_config_path,
216 options.manifest_path, options.result_path,
217 options.product_dir, sources,
218 options.jar_path,
219 resource_dir=options.resource_dir,
220 can_fail_build=options.can_fail_build),
221 options,
222 input_paths=input_paths,
223 input_strings=input_strings,
224 output_paths=output_paths,
225 pass_changes=True)
211 226
212 227
213 if __name__ == '__main__': 228 if __name__ == '__main__':
214 sys.exit(main()) 229 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698