blob: b7df908ecf1a3e2ba10a53fb807150bce759d36f [file] [log] [blame]
andrew@webrtc.org2442de12012-01-23 17:45:41 +00001# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
2#
3# Use of this source code is governed by a BSD-style license
4# that can be found in the LICENSE file in the root of the source
5# tree. An additional intellectual property rights grant can be found
6# in the file PATENTS. All contributing project authors may
7# be found in the AUTHORS file in the root of the source tree.
niklase@google.comda159d62011-05-30 11:51:34 +00008
kjellander@webrtc.org85759802013-10-22 16:47:40 +00009import re
10
11
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000012def _CheckNoIOStreamInHeaders(input_api, output_api):
13 """Checks to make sure no .h files include <iostream>."""
14 files = []
15 pattern = input_api.re.compile(r'^#include\s*<iostream>',
16 input_api.re.MULTILINE)
17 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
18 if not f.LocalPath().endswith('.h'):
19 continue
20 contents = input_api.ReadFile(f)
21 if pattern.search(contents):
22 files.append(f)
23
24 if len(files):
25 return [ output_api.PresubmitError(
26 'Do not #include <iostream> in header files, since it inserts static ' +
27 'initialization into every file including the header. Instead, ' +
28 '#include <ostream>. See http://crbug.com/94794',
29 files) ]
30 return []
31
32def _CheckNoFRIEND_TEST(input_api, output_api):
33 """Make sure that gtest's FRIEND_TEST() macro is not used, the
34 FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be
35 used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
36 problems = []
37
38 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
39 for f in input_api.AffectedFiles(file_filter=file_filter):
40 for line_num, line in f.ChangedContents():
41 if 'FRIEND_TEST(' in line:
42 problems.append(' %s:%d' % (f.LocalPath(), line_num))
43
44 if not problems:
45 return []
46 return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use '
47 'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and '
48 'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
49
mflodman@webrtc.org2a452092012-07-01 05:55:23 +000050def _CheckApprovedFilesLintClean(input_api, output_api,
51 source_file_filter=None):
52 """Checks that all new or whitelisted .cc and .h files pass cpplint.py.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000053 This check is based on _CheckChangeLintsClean in
54 depot_tools/presubmit_canned_checks.py but has less filters and only checks
55 added files."""
56 result = []
57
58 # Initialize cpplint.
59 import cpplint
60 # Access to a protected member _XX of a client class
61 # pylint: disable=W0212
62 cpplint._cpplint_state.ResetErrorCounts()
63
64 # Justifications for each filter:
65 #
66 # - build/header_guard : WebRTC coding style says they should be prefixed
67 # with WEBRTC_, which is not possible to configure in
68 # cpplint.py.
69 cpplint._SetFilters('-build/header_guard')
70
71 # Use the strictest verbosity level for cpplint.py (level 1) which is the
72 # default when running cpplint.py from command line.
73 # To make it possible to work with not-yet-converted code, we're only applying
mflodman@webrtc.org2a452092012-07-01 05:55:23 +000074 # it to new (or moved/renamed) files and files listed in LINT_FOLDERS.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000075 verbosity_level = 1
76 files = []
77 for f in input_api.AffectedSourceFiles(source_file_filter):
78 # Note that moved/renamed files also count as added for svn.
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +000079 if (f.Action() == 'A'):
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000080 files.append(f.AbsoluteLocalPath())
mflodman@webrtc.org2a452092012-07-01 05:55:23 +000081
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000082 for file_name in files:
83 cpplint.ProcessFile(file_name, verbosity_level)
84
85 if cpplint._cpplint_state.error_count > 0:
86 if input_api.is_committing:
87 # TODO(kjellander): Change back to PresubmitError below when we're
88 # confident with the lint settings.
89 res_type = output_api.PresubmitPromptWarning
90 else:
91 res_type = output_api.PresubmitPromptWarning
92 result = [res_type('Changelist failed cpplint.py check.')]
93
94 return result
95
andrew@webrtc.org53df1362012-01-26 21:24:23 +000096def _CommonChecks(input_api, output_api):
97 """Checks common to both upload and commit."""
kjellander@webrtc.org51198f12012-02-21 17:53:46 +000098 # TODO(kjellander): Use presubmit_canned_checks.PanProjectChecks too.
niklase@google.comda159d62011-05-30 11:51:34 +000099 results = []
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000100 results.extend(input_api.canned_checks.RunPylint(input_api, output_api,
101 black_list=(r'^.*gviz_api\.py$',
102 r'^.*gaeunit\.py$',
fischman@webrtc.org33584f92013-07-25 16:43:30 +0000103 # Embedded shell-script fakes out pylint.
104 r'^talk/site_scons/site_tools/talk_linux.py$',
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000105 r'^third_party/.*\.py$',
106 r'^testing/.*\.py$',
107 r'^tools/gyp/.*\.py$',
108 r'^tools/perf_expectations/.*\.py$',
phoglund@webrtc.org6d07ad92013-05-14 09:42:39 +0000109 r'^tools/protoc_wrapper/.*\.py$',
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000110 r'^tools/python/.*\.py$',
111 r'^tools/python_charts/data/.*\.py$',
kjellander@webrtc.org33654222013-08-22 07:57:00 +0000112 r'^tools/refactoring/.*\.py$',
kjellander@webrtc.orgf9bdbe32013-12-11 13:37:12 +0000113 r'^tools/swarming_client/.*\.py$',
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000114 # TODO(phoglund): should arguably be checked.
115 r'^tools/valgrind-webrtc/.*\.py$',
116 r'^tools/valgrind/.*\.py$',
117 # TODO(phoglund): should arguably be checked.
118 r'^webrtc/build/.*\.py$',
119 r'^build/.*\.py$',
120 r'^out/.*\.py$',),
121 disabled_warnings=['F0401', # Failed to import x
122 'E0611', # No package y in x
123 'W0232', # Class has no __init__ method
124 ]))
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000125 results.extend(input_api.canned_checks.CheckLongLines(
pbos@webrtc.orgf2e7bc62013-04-08 15:46:07 +0000126 input_api, output_api, maxlen=80))
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000127 results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
128 input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000129 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
130 input_api, output_api))
131 results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
132 input_api, output_api))
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000133 results.extend(_CheckApprovedFilesLintClean(input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000134 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
135 results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000136 return results
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000137
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000138def CheckChangeOnUpload(input_api, output_api):
139 results = []
140 results.extend(_CommonChecks(input_api, output_api))
niklase@google.comda159d62011-05-30 11:51:34 +0000141 return results
142
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000143def CheckChangeOnCommit(input_api, output_api):
niklase@google.com1198db92011-06-09 07:07:24 +0000144 results = []
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000145 results.extend(_CommonChecks(input_api, output_api))
niklase@google.com1198db92011-06-09 07:07:24 +0000146 results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000147 results.extend(input_api.canned_checks.CheckChangeWasUploaded(
148 input_api, output_api))
149 results.extend(input_api.canned_checks.CheckChangeHasDescription(
150 input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000151 results.extend(input_api.canned_checks.CheckChangeHasBugField(
152 input_api, output_api))
153 results.extend(input_api.canned_checks.CheckChangeHasTestField(
154 input_api, output_api))
niklase@google.com1198db92011-06-09 07:07:24 +0000155 return results
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000156
157# pylint: disable=W0613
158def GetPreferredTrySlaves(project, change):
159 files = change.LocalPaths()
160
161 ios_bots = [
162 'ios',
163 'ios_rel',
164 ]
165 linux_bots = [
166 'linux',
167 'linux_asan',
168 'linux_memcheck',
169 'linux_rel',
170 'linux_tsan',
171 ]
172 mac_bots = [
173 'mac',
174 'mac_asan',
175 'mac_rel',
176 'mac_x64_rel',
177 ]
178 win_bots = [
179 'win',
180 'win_rel',
181 'win_x64_rel',
182 ]
183
184 if not files or all(re.search(r'[\\/]OWNERS$', f) for f in files):
185 return []
186
187 if all(re.search('[/_]ios[/_.]', f) for f in files):
188 return ios_bots
189 if all(re.search('\.(m|mm)$|(^|[/_])mac[/_.]', f) for f in files):
190 return mac_bots
191 if all(re.search('(^|[/_])win[/_.]', f) for f in files):
192 return win_bots
193
194 return ['android_ndk'] + ios_bots + linux_bots + mac_bots + win_bots