Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # | 2 # |
| 3 # Copyright 2011 the V8 project authors. All rights reserved. | 3 # Copyright 2012 the V8 project authors. All rights reserved. |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
| 6 # met: | 6 # met: |
| 7 # | 7 # |
| 8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
| 11 # copyright notice, this list of conditions and the following | 11 # copyright notice, this list of conditions and the following |
| 12 # disclaimer in the documentation and/or other materials provided | 12 # disclaimer in the documentation and/or other materials provided |
| 13 # with the distribution. | 13 # with the distribution. |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 35 md5er = md5.new | 35 md5er = md5.new |
| 36 | 36 |
| 37 | 37 |
| 38 import optparse | 38 import optparse |
| 39 import os | 39 import os |
| 40 from os.path import abspath, join, dirname, basename, exists | 40 from os.path import abspath, join, dirname, basename, exists |
| 41 import pickle | 41 import pickle |
| 42 import re | 42 import re |
| 43 import sys | 43 import sys |
| 44 import subprocess | 44 import subprocess |
| 45 import multiprocessing | |
| 45 from subprocess import PIPE | 46 from subprocess import PIPE |
| 46 | 47 |
| 47 # Disabled LINT rules and reason. | 48 # Disabled LINT rules and reason. |
| 48 # build/include_what_you_use: Started giving false positives for variables | 49 # build/include_what_you_use: Started giving false positives for variables |
| 49 # named "string" and "map" assuming that you needed to include STL headers. | 50 # named "string" and "map" assuming that you needed to include STL headers. |
| 50 | 51 |
| 51 ENABLED_LINT_RULES = """ | 52 ENABLED_LINT_RULES = """ |
| 52 build/class | 53 build/class |
| 53 build/deprecated | 54 build/deprecated |
| 54 build/endif_comment | 55 build/endif_comment |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 whitespace/labels | 95 whitespace/labels |
| 95 whitespace/line_length | 96 whitespace/line_length |
| 96 whitespace/newline | 97 whitespace/newline |
| 97 whitespace/operators | 98 whitespace/operators |
| 98 whitespace/parens | 99 whitespace/parens |
| 99 whitespace/tab | 100 whitespace/tab |
| 100 whitespace/todo | 101 whitespace/todo |
| 101 """.split() | 102 """.split() |
| 102 | 103 |
| 103 | 104 |
| 105 LINT_OUTPUT_PATTERN = re.compile(r'^.+[:(]\d+[:)]|^Done processing') | |
| 106 | |
| 107 | |
| 108 def CppLintWorker(command): | |
| 109 try: | |
| 110 process = subprocess.Popen(command, stderr=subprocess.PIPE) | |
| 111 process.wait() | |
| 112 out_lines = "" | |
| 113 error_count = -1 | |
| 114 while True: | |
| 115 out_line = process.stderr.readline() | |
| 116 if out_line == '' and process.poll() != None: | |
| 117 break | |
| 118 m = LINT_OUTPUT_PATTERN.match(out_line) | |
| 119 if m: | |
| 120 out_lines += out_line | |
| 121 error_count += 1 | |
| 122 sys.stderr.write(out_lines) | |
| 123 return error_count | |
| 124 except KeyboardInterrupt: | |
| 125 child.kill() | |
|
Jakob Kummerow
2012/01/20 14:56:22
I think you meant s/child/process/
Yang
2012/01/20 16:18:31
This is actually interesting. Previously the scrip
| |
| 126 except: | |
| 127 print('Error running cpplint.py. Please make sure you have depot_tools' + | |
| 128 ' in your $PATH. Lint check skipped.') | |
| 129 child.kill() | |
|
Jakob Kummerow
2012/01/20 14:56:22
same here.
Yang
2012/01/20 16:18:31
Done.
| |
| 130 | |
| 131 | |
| 104 class FileContentsCache(object): | 132 class FileContentsCache(object): |
| 105 | 133 |
| 106 def __init__(self, sums_file_name): | 134 def __init__(self, sums_file_name): |
| 107 self.sums = {} | 135 self.sums = {} |
| 108 self.sums_file_name = sums_file_name | 136 self.sums_file_name = sums_file_name |
| 109 | 137 |
| 110 def Load(self): | 138 def Load(self): |
| 111 try: | 139 try: |
| 112 sums_file = None | 140 sums_file = None |
| 113 try: | 141 try: |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 199 | 227 |
| 200 def ProcessFiles(self, files, path): | 228 def ProcessFiles(self, files, path): |
| 201 good_files_cache = FileContentsCache('.cpplint-cache') | 229 good_files_cache = FileContentsCache('.cpplint-cache') |
| 202 good_files_cache.Load() | 230 good_files_cache.Load() |
| 203 files = good_files_cache.FilterUnchangedFiles(files) | 231 files = good_files_cache.FilterUnchangedFiles(files) |
| 204 if len(files) == 0: | 232 if len(files) == 0: |
| 205 print 'No changes in files detected. Skipping cpplint check.' | 233 print 'No changes in files detected. Skipping cpplint check.' |
| 206 return True | 234 return True |
| 207 | 235 |
| 208 filt = '-,' + ",".join(['+' + n for n in ENABLED_LINT_RULES]) | 236 filt = '-,' + ",".join(['+' + n for n in ENABLED_LINT_RULES]) |
| 209 command = ['cpplint.py', '--filter', filt] + join(files) | 237 command = ['cpplint.py', '--filter', filt] |
| 210 local_cpplint = join(path, "tools", "cpplint.py") | 238 local_cpplint = join(path, "tools", "cpplint.py") |
| 211 if exists(local_cpplint): | 239 if exists(local_cpplint): |
| 212 command = ['python', local_cpplint, '--filter', filt] + join(files) | 240 command = ['python', local_cpplint, '--filter', filt] |
| 213 | 241 |
| 242 commands = join([command + [file] for file in files]) | |
| 243 count = multiprocessing.cpu_count() | |
| 244 pool = multiprocessing.Pool(count) | |
| 214 try: | 245 try: |
| 215 process = subprocess.Popen(command, stderr=subprocess.PIPE) | 246 results = pool.map(CppLintWorker, commands) |
|
Jakob Kummerow
2012/01/20 14:56:22
I need the following patch to make this react prop
Yang
2012/01/20 16:18:31
Done.
| |
| 216 except: | 247 except KeyboardInterrupt: |
| 217 print('Error running cpplint.py. Please make sure you have depot_tools' + | 248 print "\nCaught KeyboardInterrupt, terminating workers." |
| 218 ' in your $PATH. Lint check skipped.') | 249 sys.exit(1) |
| 219 return True | |
| 220 LINT_ERROR_PATTERN = re.compile(r'^(.+)[:(]\d+[:)]') | |
| 221 while True: | |
| 222 out_line = process.stderr.readline() | |
| 223 if out_line == '' and process.poll() != None: | |
| 224 break | |
| 225 sys.stderr.write(out_line) | |
| 226 m = LINT_ERROR_PATTERN.match(out_line) | |
| 227 if m: | |
| 228 good_files_cache.RemoveFile(m.group(1)) | |
| 229 | 250 |
| 251 for i in range(len(files)): | |
| 252 if results[i] > 0: | |
| 253 good_files_cache.RemoveFile(files[i]) | |
| 254 | |
| 255 print "Total errors found: %d" % sum(results) | |
| 230 good_files_cache.Save() | 256 good_files_cache.Save() |
| 231 return process.returncode == 0 | |
|
Jakob Kummerow
2012/01/20 14:56:22
I think we still want a return value here. IIUC, i
Yang
2012/01/20 16:18:31
Done.
| |
| 232 | 257 |
| 233 | 258 |
| 234 COPYRIGHT_HEADER_PATTERN = re.compile( | 259 COPYRIGHT_HEADER_PATTERN = re.compile( |
| 235 r'Copyright [\d-]*20[0-1][0-9] the V8 project authors. All rights reserved.' ) | 260 r'Copyright [\d-]*20[0-1][0-9] the V8 project authors. All rights reserved.' ) |
| 236 | 261 |
| 237 class SourceProcessor(SourceFileProcessor): | 262 class SourceProcessor(SourceFileProcessor): |
| 238 """ | 263 """ |
| 239 Check that all files include a copyright notice and no trailing whitespaces. | 264 Check that all files include a copyright notice and no trailing whitespaces. |
| 240 """ | 265 """ |
| 241 | 266 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 print "Running copyright header and trailing whitespaces check..." | 373 print "Running copyright header and trailing whitespaces check..." |
| 349 success = SourceProcessor().Run(workspace) and success | 374 success = SourceProcessor().Run(workspace) and success |
| 350 if success: | 375 if success: |
| 351 return 0 | 376 return 0 |
| 352 else: | 377 else: |
| 353 return 1 | 378 return 1 |
| 354 | 379 |
| 355 | 380 |
| 356 if __name__ == '__main__': | 381 if __name__ == '__main__': |
| 357 sys.exit(Main()) | 382 sys.exit(Main()) |
| OLD | NEW |