OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Top-level presubmit script for cc. | 5 """Top-level presubmit script for cc. |
6 | 6 |
7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for | 7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for |
8 details on the presubmit API built into gcl. | 8 details on the presubmit API built into gcl. |
9 """ | 9 """ |
10 | 10 |
11 import re | 11 import re |
| 12 import string |
12 | 13 |
13 CC_SOURCE_FILES=(r'^cc/.*\.(cc|h)$',) | 14 CC_SOURCE_FILES=(r'^cc/.*\.(cc|h)$',) |
14 CC_PERF_TEST =(r'^.*_perftest.*\.(cc|h)$',) | 15 CC_PERF_TEST =(r'^.*_perftest.*\.(cc|h)$',) |
15 | 16 |
16 def CheckChangeLintsClean(input_api, output_api): | 17 def CheckChangeLintsClean(input_api, output_api): |
17 input_api.cpplint._cpplint_state.ResetErrorCounts() # reset global state | 18 input_api.cpplint._cpplint_state.ResetErrorCounts() # reset global state |
18 source_filter = lambda x: input_api.FilterSourceFile( | 19 source_filter = lambda x: input_api.FilterSourceFile( |
19 x, white_list=CC_SOURCE_FILES, black_list=None) | 20 x, white_list=CC_SOURCE_FILES, black_list=None) |
20 files = [f.AbsoluteLocalPath() for f in | 21 files = [f.AbsoluteLocalPath() for f in |
21 input_api.AffectedSourceFiles(source_filter)] | 22 input_api.AffectedSourceFiles(source_filter)] |
(...skipping 27 matching lines...) Expand all Loading... |
49 if assert_files: | 50 if assert_files: |
50 return [output_api.PresubmitError( | 51 return [output_api.PresubmitError( |
51 'These files use ASSERT instead of using DCHECK:', | 52 'These files use ASSERT instead of using DCHECK:', |
52 items=assert_files)] | 53 items=assert_files)] |
53 if notreached_files: | 54 if notreached_files: |
54 return [output_api.PresubmitError( | 55 return [output_api.PresubmitError( |
55 'These files use ASSERT_NOT_REACHED instead of using NOTREACHED:', | 56 'These files use ASSERT_NOT_REACHED instead of using NOTREACHED:', |
56 items=notreached_files)] | 57 items=notreached_files)] |
57 return [] | 58 return [] |
58 | 59 |
59 def CheckSpamLogging(input_api, output_api, white_list=CC_SOURCE_FILES, black_li
st=None): | 60 def CheckSpamLogging(input_api, |
| 61 output_api, |
| 62 white_list=CC_SOURCE_FILES, |
| 63 black_list=None): |
60 black_list = tuple(black_list or input_api.DEFAULT_BLACK_LIST) | 64 black_list = tuple(black_list or input_api.DEFAULT_BLACK_LIST) |
61 source_file_filter = lambda x: input_api.FilterSourceFile(x, white_list, black
_list) | 65 source_file_filter = lambda x: input_api.FilterSourceFile(x, |
| 66 white_list, |
| 67 black_list) |
62 | 68 |
63 log_info = [] | 69 log_info = [] |
64 printf = [] | 70 printf = [] |
65 | 71 |
66 for f in input_api.AffectedSourceFiles(source_file_filter): | 72 for f in input_api.AffectedSourceFiles(source_file_filter): |
67 contents = input_api.ReadFile(f, 'rb') | 73 contents = input_api.ReadFile(f, 'rb') |
68 if re.search(r"\bD?LOG\s*\(\s*INFO\s*\)", contents): | 74 if re.search(r"\bD?LOG\s*\(\s*INFO\s*\)", contents): |
69 log_info.append(f.LocalPath()) | 75 log_info.append(f.LocalPath()) |
70 if re.search(r"\bf?printf\(", contents): | 76 if re.search(r"\bf?printf\(", contents): |
71 printf.append(f.LocalPath()) | 77 printf.append(f.LocalPath()) |
72 | 78 |
73 if log_info: | 79 if log_info: |
74 return [output_api.PresubmitError( | 80 return [output_api.PresubmitError( |
75 'These files spam the console log with LOG(INFO):', | 81 'These files spam the console log with LOG(INFO):', |
76 items=log_info)] | 82 items=log_info)] |
77 if printf: | 83 if printf: |
78 return [output_api.PresubmitError( | 84 return [output_api.PresubmitError( |
79 'These files spam the console log with printf/fprintf:', | 85 'These files spam the console log with printf/fprintf:', |
80 items=printf)] | 86 items=printf)] |
81 return [] | 87 return [] |
82 | 88 |
| 89 def CheckPassByValue(input_api, |
| 90 output_api, |
| 91 white_list=CC_SOURCE_FILES, |
| 92 black_list=None): |
| 93 black_list = tuple(black_list or input_api.DEFAULT_BLACK_LIST) |
| 94 source_file_filter = lambda x: input_api.FilterSourceFile(x, |
| 95 white_list, |
| 96 black_list) |
| 97 |
| 98 local_errors = [] |
| 99 |
| 100 # Well-defined simple classes containing only <= 4 ints, or <= 2 floats. |
| 101 pass_by_value_types = ['base::Time', |
| 102 'base::TimeTicks', |
| 103 'gfx::Point', |
| 104 'gfx::PointF', |
| 105 'gfx::Rect', |
| 106 'gfx::Size', |
| 107 'gfx::SizeF', |
| 108 'gfx::Vector2d', |
| 109 'gfx::Vector2dF', |
| 110 ] |
| 111 |
| 112 for f in input_api.AffectedSourceFiles(source_file_filter): |
| 113 contents = input_api.ReadFile(f, 'rb') |
| 114 match = re.search( |
| 115 r'\bconst +' + '(?P<type>(%s))&' % |
| 116 string.join(pass_by_value_types, '|'), |
| 117 contents) |
| 118 if match: |
| 119 local_errors.append(output_api.PresubmitError( |
| 120 '%s passes %s by const ref instead of by value.' % |
| 121 (f.LocalPath(), match.group('type')))) |
| 122 return local_errors |
83 | 123 |
84 def CheckChangeOnUpload(input_api, output_api): | 124 def CheckChangeOnUpload(input_api, output_api): |
85 results = [] | 125 results = [] |
86 results += CheckAsserts(input_api, output_api) | 126 results += CheckAsserts(input_api, output_api) |
87 results += CheckSpamLogging(input_api, output_api, black_list=CC_PERF_TEST) | 127 results += CheckSpamLogging(input_api, output_api, black_list=CC_PERF_TEST) |
| 128 results += CheckPassByValue(input_api, output_api) |
88 results += CheckChangeLintsClean(input_api, output_api) | 129 results += CheckChangeLintsClean(input_api, output_api) |
89 return results | 130 return results |
90 | 131 |
91 def GetPreferredTrySlaves(project, change): | 132 def GetPreferredTrySlaves(project, change): |
92 return [ | 133 return [ |
93 'linux_layout_rel', | 134 'linux_layout_rel', |
94 ] | 135 ] |
OLD | NEW |