blob: 9d813b1881aa3b66e859d617be73adbc5838f6c4 [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
kjellander986ee082015-06-16 04:32:13 -07009import json
kjellander@webrtc.orgaefe61a2014-12-08 13:00:30 +000010import os
kjellander986ee082015-06-16 04:32:13 -070011import platform
kjellander@webrtc.org85759802013-10-22 16:47:40 +000012import re
kjellander986ee082015-06-16 04:32:13 -070013import subprocess
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +000014import sys
kjellander@webrtc.org85759802013-10-22 16:47:40 +000015
16
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +010017# Directories that will be scanned by cpplint by the presubmit script.
18CPPLINT_DIRS = [
Fredrik Solenbergea073732015-12-01 11:26:34 +010019 'webrtc/audio',
20 'webrtc/call',
jbauch0f2e9392015-12-10 03:11:42 -080021 'webrtc/common_video',
jbauch70625e52015-12-09 14:18:14 -080022 'webrtc/examples',
jbauchf91e6d02016-01-24 23:05:21 -080023 'webrtc/modules/bitrate_controller',
Stefan Holmer80e12072016-02-23 13:30:42 +010024 'webrtc/modules/congestion_controller',
jbauchd2a22962016-02-08 23:18:25 -080025 'webrtc/modules/pacing',
terelius8f09f172015-12-15 00:51:54 -080026 'webrtc/modules/remote_bitrate_estimator',
danilchap377b5e62015-12-15 04:33:44 -080027 'webrtc/modules/rtp_rtcp',
philipel5908c712015-12-21 08:23:20 -080028 'webrtc/modules/video_coding',
mflodman88eeac42015-12-08 09:21:28 +010029 'webrtc/modules/video_processing',
jbauch0f2e9392015-12-10 03:11:42 -080030 'webrtc/tools',
mflodmand1590b22015-12-09 07:07:59 -080031 'webrtc/video',
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +010032]
33
jbauchc4e3ead2016-02-19 00:25:55 -080034# These filters will always be removed, even if the caller specifies a filter
35# set, as they are problematic or broken in some way.
36#
37# Justifications for each filter:
38# - build/c++11 : Rvalue ref checks are unreliable (false positives),
39# include file and feature blacklists are
40# google3-specific.
kjellandere5a87a52016-04-27 02:32:12 -070041# - whitespace/operators: Same as above (doesn't seem sufficient to eliminate
42# all move-related errors).
jbauchc4e3ead2016-02-19 00:25:55 -080043BLACKLIST_LINT_FILTERS = [
44 '-build/c++11',
kjellandere5a87a52016-04-27 02:32:12 -070045 '-whitespace/operators',
jbauchc4e3ead2016-02-19 00:25:55 -080046]
47
kjellanderfd595232015-12-04 02:44:09 -080048# List of directories of "supported" native APIs. That means changes to headers
49# will be done in a compatible way following this scheme:
50# 1. Non-breaking changes are made.
51# 2. The old APIs as marked as deprecated (with comments).
52# 3. Deprecation is announced to discuss-webrtc@googlegroups.com and
53# webrtc-users@google.com (internal list).
54# 4. (later) The deprecated APIs are removed.
kjellander53047c92015-12-02 23:56:14 -080055NATIVE_API_DIRS = (
kjellander53047c92015-12-02 23:56:14 -080056 'webrtc',
kjellanderdd705472016-06-09 11:17:27 -070057 'webrtc/api',
58 'webrtc/media',
kjellander53047c92015-12-02 23:56:14 -080059 'webrtc/modules/audio_device/include',
kjellanderdd705472016-06-09 11:17:27 -070060 'webrtc/pc',
61)
62# These directories should not be used but are maintained only to avoid breaking
63# some legacy downstream code.
64LEGACY_API_DIRS = (
65 'talk/app/webrtc',
66 'webrtc/base',
67 'webrtc/common_audio/include',
68 'webrtc/modules/audio_coding/include',
69 'webrtc/modules/audio_conference_mixer/include',
kjellander53047c92015-12-02 23:56:14 -080070 'webrtc/modules/audio_processing/include',
71 'webrtc/modules/bitrate_controller/include',
Stefan Holmer80e12072016-02-23 13:30:42 +010072 'webrtc/modules/congestion_controller/include',
kjellander53047c92015-12-02 23:56:14 -080073 'webrtc/modules/include',
74 'webrtc/modules/remote_bitrate_estimator/include',
75 'webrtc/modules/rtp_rtcp/include',
kjellanderdd705472016-06-09 11:17:27 -070076 'webrtc/modules/rtp_rtcp/source',
kjellander53047c92015-12-02 23:56:14 -080077 'webrtc/modules/utility/include',
78 'webrtc/modules/video_coding/codecs/h264/include',
79 'webrtc/modules/video_coding/codecs/i420/include',
80 'webrtc/modules/video_coding/codecs/vp8/include',
81 'webrtc/modules/video_coding/codecs/vp9/include',
82 'webrtc/modules/video_coding/include',
kjellanderdd705472016-06-09 11:17:27 -070083 'webrtc/system_wrappers/include',
kjellander53047c92015-12-02 23:56:14 -080084 'webrtc/voice_engine/include',
85)
kjellanderdd705472016-06-09 11:17:27 -070086API_DIRS = NATIVE_API_DIRS[:] + LEGACY_API_DIRS[:]
kjellander53047c92015-12-02 23:56:14 -080087
88
89def _VerifyNativeApiHeadersListIsValid(input_api, output_api):
90 """Ensures the list of native API header directories is up to date."""
91 non_existing_paths = []
92 native_api_full_paths = [
93 input_api.os_path.join(input_api.PresubmitLocalPath(),
kjellanderdd705472016-06-09 11:17:27 -070094 *path.split('/')) for path in API_DIRS]
kjellander53047c92015-12-02 23:56:14 -080095 for path in native_api_full_paths:
96 if not os.path.isdir(path):
97 non_existing_paths.append(path)
98 if non_existing_paths:
99 return [output_api.PresubmitError(
100 'Directories to native API headers have changed which has made the '
101 'list in PRESUBMIT.py outdated.\nPlease update it to the current '
102 'location of our native APIs.',
103 non_existing_paths)]
104 return []
105
kwibergeb133022016-04-07 07:41:48 -0700106api_change_msg = """
107You seem to be changing native API header files. Please make sure that you:
108 1. Make compatible changes that don't break existing clients.
109 2. Mark the old stuff as deprecated.
110 3. Create a timeline and plan for when the deprecated stuff will be
111 removed. (The amount of time we give users to change their code
112 should be informed by how much work it is for them. If they just
113 need to replace one name with another or something equally
114 simple, 1-2 weeks might be good; if they need to do serious work,
115 up to 3 months may be called for.)
116 4. Update/inform existing downstream code owners to stop using the
117 deprecated stuff. (Send announcements to
118 discuss-webrtc@googlegroups.com and webrtc-users@google.com.)
119 5. Remove the deprecated stuff, once the agreed-upon amount of time
120 has passed.
121Related files:
122"""
kjellander53047c92015-12-02 23:56:14 -0800123
124def _CheckNativeApiHeaderChanges(input_api, output_api):
125 """Checks to remind proper changing of native APIs."""
126 files = []
127 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
128 if f.LocalPath().endswith('.h'):
kjellanderdd705472016-06-09 11:17:27 -0700129 for path in API_DIRS:
kjellander53047c92015-12-02 23:56:14 -0800130 if os.path.dirname(f.LocalPath()) == path:
131 files.append(f)
132
133 if files:
kwibergeb133022016-04-07 07:41:48 -0700134 return [output_api.PresubmitNotifyResult(api_change_msg, files)]
kjellander53047c92015-12-02 23:56:14 -0800135 return []
136
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100137
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000138def _CheckNoIOStreamInHeaders(input_api, output_api):
139 """Checks to make sure no .h files include <iostream>."""
140 files = []
141 pattern = input_api.re.compile(r'^#include\s*<iostream>',
142 input_api.re.MULTILINE)
143 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
144 if not f.LocalPath().endswith('.h'):
145 continue
146 contents = input_api.ReadFile(f)
147 if pattern.search(contents):
148 files.append(f)
149
150 if len(files):
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200151 return [output_api.PresubmitError(
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000152 'Do not #include <iostream> in header files, since it inserts static ' +
153 'initialization into every file including the header. Instead, ' +
154 '#include <ostream>. See http://crbug.com/94794',
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200155 files)]
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000156 return []
157
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000158
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000159def _CheckNoFRIEND_TEST(input_api, output_api):
160 """Make sure that gtest's FRIEND_TEST() macro is not used, the
161 FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be
162 used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
163 problems = []
164
165 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
166 for f in input_api.AffectedFiles(file_filter=file_filter):
167 for line_num, line in f.ChangedContents():
168 if 'FRIEND_TEST(' in line:
169 problems.append(' %s:%d' % (f.LocalPath(), line_num))
170
171 if not problems:
172 return []
173 return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use '
174 'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and '
175 'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
176
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000177
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100178def _IsLintWhitelisted(whitelist_dirs, file_path):
179 """ Checks if a file is whitelisted for lint check."""
180 for path in whitelist_dirs:
181 if os.path.dirname(file_path).startswith(path):
182 return True
183 return False
184
185
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000186def _CheckApprovedFilesLintClean(input_api, output_api,
187 source_file_filter=None):
188 """Checks that all new or whitelisted .cc and .h files pass cpplint.py.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000189 This check is based on _CheckChangeLintsClean in
190 depot_tools/presubmit_canned_checks.py but has less filters and only checks
191 added files."""
192 result = []
193
194 # Initialize cpplint.
195 import cpplint
196 # Access to a protected member _XX of a client class
197 # pylint: disable=W0212
198 cpplint._cpplint_state.ResetErrorCounts()
199
jbauchc4e3ead2016-02-19 00:25:55 -0800200 lint_filters = cpplint._Filters()
201 lint_filters.extend(BLACKLIST_LINT_FILTERS)
202 cpplint._SetFilters(','.join(lint_filters))
203
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100204 # Create a platform independent whitelist for the CPPLINT_DIRS.
205 whitelist_dirs = [input_api.os_path.join(*path.split('/'))
206 for path in CPPLINT_DIRS]
207
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000208 # Use the strictest verbosity level for cpplint.py (level 1) which is the
209 # default when running cpplint.py from command line.
210 # To make it possible to work with not-yet-converted code, we're only applying
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000211 # it to new (or moved/renamed) files and files listed in LINT_FOLDERS.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000212 verbosity_level = 1
213 files = []
214 for f in input_api.AffectedSourceFiles(source_file_filter):
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200215 # Note that moved/renamed files also count as added.
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100216 if f.Action() == 'A' or _IsLintWhitelisted(whitelist_dirs, f.LocalPath()):
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000217 files.append(f.AbsoluteLocalPath())
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000218
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000219 for file_name in files:
220 cpplint.ProcessFile(file_name, verbosity_level)
221
222 if cpplint._cpplint_state.error_count > 0:
223 if input_api.is_committing:
224 # TODO(kjellander): Change back to PresubmitError below when we're
225 # confident with the lint settings.
226 res_type = output_api.PresubmitPromptWarning
227 else:
228 res_type = output_api.PresubmitPromptWarning
229 result = [res_type('Changelist failed cpplint.py check.')]
230
231 return result
232
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000233def _CheckNoRtcBaseDeps(input_api, gyp_files, output_api):
234 pattern = input_api.re.compile(r"base.gyp:rtc_base\s*'")
235 violating_files = []
236 for f in gyp_files:
henrike@webrtc.org36b0c1a2014-10-01 14:40:58 +0000237 gyp_exceptions = (
238 'base_tests.gyp',
239 'desktop_capture.gypi',
kjellander@webrtc.orge7237282015-02-26 11:12:17 +0000240 'p2p.gyp',
tkchin9eeb6242016-04-27 01:54:20 -0700241 'sdk.gyp',
henrike@webrtc.org36b0c1a2014-10-01 14:40:58 +0000242 'webrtc_test_common.gyp',
243 'webrtc_tests.gypi',
244 )
245 if f.LocalPath().endswith(gyp_exceptions):
246 continue
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000247 contents = input_api.ReadFile(f)
248 if pattern.search(contents):
249 violating_files.append(f)
250 if violating_files:
251 return [output_api.PresubmitError(
252 'Depending on rtc_base is not allowed. Change your dependency to '
253 'rtc_base_approved and possibly sanitize and move the desired source '
254 'file(s) to rtc_base_approved.\nChanged GYP files:',
255 items=violating_files)]
256 return []
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000257
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000258def _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api):
259 # Disallow referencing source files with paths above the GYP file location.
kjellander@webrtc.org74290b92016-06-15 17:19:06 +0200260 source_pattern = input_api.re.compile(r'\'sources\'.*?\[(.*?)\]',
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000261 re.MULTILINE | re.DOTALL)
kjellander@webrtc.orga33f05e2015-01-29 14:29:45 +0000262 file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'")
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000263 violating_gyp_files = set()
264 violating_source_entries = []
265 for gyp_file in gyp_files:
kjellanderc61635c2016-02-02 02:30:07 -0800266 if 'supplement.gypi' in gyp_file.LocalPath():
267 # Exclude supplement.gypi from this check, as the LSan and TSan
268 # suppression files are located in a different location.
269 continue
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000270 contents = input_api.ReadFile(gyp_file)
271 for source_block_match in source_pattern.finditer(contents):
kjellander@webrtc.orgc98f6f32015-03-04 07:08:11 +0000272 # Find all source list entries starting with ../ in the source block
273 # (exclude overrides entries).
kjellander@webrtc.org74290b92016-06-15 17:19:06 +0200274 for file_list_match in file_pattern.finditer(source_block_match.group(1)):
275 source_file = file_list_match.group(1)
kjellander@webrtc.orgc98f6f32015-03-04 07:08:11 +0000276 if 'overrides/' not in source_file:
277 violating_source_entries.append(source_file)
278 violating_gyp_files.add(gyp_file)
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000279 if violating_gyp_files:
280 return [output_api.PresubmitError(
281 'Referencing source files above the directory of the GYP file is not '
282 'allowed. Please introduce new GYP targets and/or GYP files in the '
283 'proper location instead.\n'
284 'Invalid source entries:\n'
285 '%s\n'
286 'Violating GYP files:' % '\n'.join(violating_source_entries),
287 items=violating_gyp_files)]
288 return []
289
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000290def _CheckGypChanges(input_api, output_api):
291 source_file_filter = lambda x: input_api.FilterSourceFile(
292 x, white_list=(r'.+\.(gyp|gypi)$',))
293
294 gyp_files = []
295 for f in input_api.AffectedSourceFiles(source_file_filter):
kjellander@webrtc.org3398a4a2014-11-24 10:05:37 +0000296 if f.LocalPath().startswith('webrtc'):
297 gyp_files.append(f)
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000298
299 result = []
300 if gyp_files:
301 result.append(output_api.PresubmitNotifyResult(
302 'As you\'re changing GYP files: please make sure corresponding '
303 'BUILD.gn files are also updated.\nChanged GYP files:',
304 items=gyp_files))
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000305 result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api))
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000306 result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api))
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000307 return result
308
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000309def _CheckUnwantedDependencies(input_api, output_api):
310 """Runs checkdeps on #include statements added in this
311 change. Breaking - rules is an error, breaking ! rules is a
312 warning.
313 """
314 # Copied from Chromium's src/PRESUBMIT.py.
315
316 # We need to wait until we have an input_api object and use this
317 # roundabout construct to import checkdeps because this file is
318 # eval-ed and thus doesn't have __file__.
319 original_sys_path = sys.path
320 try:
kjellander@webrtc.orgaefe61a2014-12-08 13:00:30 +0000321 checkdeps_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
322 'buildtools', 'checkdeps')
323 if not os.path.exists(checkdeps_path):
324 return [output_api.PresubmitError(
325 'Cannot find checkdeps at %s\nHave you run "gclient sync" to '
326 'download Chromium and setup the symlinks?' % checkdeps_path)]
327 sys.path.append(checkdeps_path)
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000328 import checkdeps
329 from cpp_checker import CppChecker
330 from rules import Rule
331 finally:
332 # Restore sys.path to what it was before.
333 sys.path = original_sys_path
334
335 added_includes = []
336 for f in input_api.AffectedFiles():
337 if not CppChecker.IsCppFile(f.LocalPath()):
338 continue
339
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200340 changed_lines = [line for _, line in f.ChangedContents()]
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000341 added_includes.append([f.LocalPath(), changed_lines])
342
343 deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath())
344
345 error_descriptions = []
346 warning_descriptions = []
347 for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes(
348 added_includes):
349 description_with_path = '%s\n %s' % (path, rule_description)
350 if rule_type == Rule.DISALLOW:
351 error_descriptions.append(description_with_path)
352 else:
353 warning_descriptions.append(description_with_path)
354
355 results = []
356 if error_descriptions:
357 results.append(output_api.PresubmitError(
358 'You added one or more #includes that violate checkdeps rules.',
359 error_descriptions))
360 if warning_descriptions:
361 results.append(output_api.PresubmitPromptOrNotify(
362 'You added one or more #includes of files that are temporarily\n'
363 'allowed but being removed. Can you avoid introducing the\n'
364 '#include? See relevant DEPS file(s) for details and contacts.',
365 warning_descriptions))
366 return results
367
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000368
kjellander569cf942016-02-11 05:02:59 -0800369def _CheckJSONParseErrors(input_api, output_api):
370 """Check that JSON files do not contain syntax errors."""
371
372 def FilterFile(affected_file):
373 return input_api.os_path.splitext(affected_file.LocalPath())[1] == '.json'
374
375 def GetJSONParseError(input_api, filename):
376 try:
377 contents = input_api.ReadFile(filename)
378 input_api.json.loads(contents)
379 except ValueError as e:
380 return e
381 return None
382
383 results = []
384 for affected_file in input_api.AffectedFiles(
385 file_filter=FilterFile, include_deletes=False):
386 parse_error = GetJSONParseError(input_api,
387 affected_file.AbsoluteLocalPath())
388 if parse_error:
389 results.append(output_api.PresubmitError('%s could not be parsed: %s' %
390 (affected_file.LocalPath(), parse_error)))
391 return results
392
393
Henrik Kjellander8d3ad822015-05-26 19:52:05 +0200394def _RunPythonTests(input_api, output_api):
395 def join(*args):
396 return input_api.os_path.join(input_api.PresubmitLocalPath(), *args)
397
398 test_directories = [
399 join('tools', 'autoroller', 'unittests'),
aleloi7ebbf902016-06-20 07:39:15 -0700400 join('webrtc', 'tools', 'py_event_log_analyzer'),
Henrik Kjellander8d3ad822015-05-26 19:52:05 +0200401 ]
402
403 tests = []
404 for directory in test_directories:
405 tests.extend(
406 input_api.canned_checks.GetUnitTestsInDirectory(
407 input_api,
408 output_api,
409 directory,
410 whitelist=[r'.+_test\.py$']))
411 return input_api.RunTests(tests, parallel=True)
412
413
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000414def _CommonChecks(input_api, output_api):
415 """Checks common to both upload and commit."""
niklase@google.comda159d62011-05-30 11:51:34 +0000416 results = []
tkchin42f580e2015-11-26 23:18:23 -0800417 # Filter out files that are in objc or ios dirs from being cpplint-ed since
418 # they do not follow C++ lint rules.
419 black_list = input_api.DEFAULT_BLACK_LIST + (
420 r".*\bobjc[\\\/].*",
hjon65ae2d82016-08-02 23:55:44 -0700421 r"webrtc\/build\/ios\/SDK\/.*",
tkchin42f580e2015-11-26 23:18:23 -0800422 )
423 source_file_filter = lambda x: input_api.FilterSourceFile(x, None, black_list)
424 results.extend(_CheckApprovedFilesLintClean(
425 input_api, output_api, source_file_filter))
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000426 results.extend(input_api.canned_checks.RunPylint(input_api, output_api,
427 black_list=(r'^.*gviz_api\.py$',
428 r'^.*gaeunit\.py$',
fischman@webrtc.org33584f92013-07-25 16:43:30 +0000429 # Embedded shell-script fakes out pylint.
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200430 r'^build[\\\/].*\.py$',
431 r'^buildtools[\\\/].*\.py$',
432 r'^chromium[\\\/].*\.py$',
kjellanderd620f822016-04-04 06:07:08 -0700433 r'^mojo.*[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200434 r'^out.*[\\\/].*\.py$',
435 r'^testing[\\\/].*\.py$',
436 r'^third_party[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200437 r'^tools[\\\/]clang[\\\/].*\.py$',
438 r'^tools[\\\/]generate_library_loader[\\\/].*\.py$',
kjellanderd620f822016-04-04 06:07:08 -0700439 r'^tools[\\\/]generate_stubs[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200440 r'^tools[\\\/]gn[\\\/].*\.py$',
441 r'^tools[\\\/]gyp[\\\/].*\.py$',
Henrik Kjellanderd6d27e72015-09-25 22:19:11 +0200442 r'^tools[\\\/]isolate_driver.py$',
kjellanderd620f822016-04-04 06:07:08 -0700443 r'^tools[\\\/]mb[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200444 r'^tools[\\\/]protoc_wrapper[\\\/].*\.py$',
445 r'^tools[\\\/]python[\\\/].*\.py$',
446 r'^tools[\\\/]python_charts[\\\/]data[\\\/].*\.py$',
447 r'^tools[\\\/]refactoring[\\\/].*\.py$',
448 r'^tools[\\\/]swarming_client[\\\/].*\.py$',
449 r'^tools[\\\/]vim[\\\/].*\.py$',
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000450 # TODO(phoglund): should arguably be checked.
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200451 r'^tools[\\\/]valgrind-webrtc[\\\/].*\.py$',
452 r'^tools[\\\/]valgrind[\\\/].*\.py$',
453 r'^tools[\\\/]win[\\\/].*\.py$',
454 r'^xcodebuild.*[\\\/].*\.py$',),
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000455 disabled_warnings=['F0401', # Failed to import x
456 'E0611', # No package y in x
457 'W0232', # Class has no __init__ method
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200458 ],
459 pylintrc='pylintrc'))
kjellander569cf942016-02-11 05:02:59 -0800460
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200461 # WebRTC can't use the presubmit_canned_checks.PanProjectChecks function since
462 # we need to have different license checks in talk/ and webrtc/ directories.
463 # Instead, hand-picked checks are included below.
Henrik Kjellander63224672015-09-08 08:03:56 +0200464
tkchin3cd9a302016-06-08 12:40:28 -0700465 # .m and .mm files are ObjC files. For simplicity we will consider .h files in
466 # ObjC subdirectories ObjC headers.
467 objc_filter_list = (r'.+\.m$', r'.+\.mm$', r'.+objc\/.+\.h$')
Henrik Kjellander63224672015-09-08 08:03:56 +0200468 # Skip long-lines check for DEPS, GN and GYP files.
tkchin3cd9a302016-06-08 12:40:28 -0700469 build_file_filter_list = (r'.+\.gyp$', r'.+\.gypi$', r'.+\.gn$', r'.+\.gni$',
470 'DEPS')
471 eighty_char_sources = lambda x: input_api.FilterSourceFile(x,
472 black_list=build_file_filter_list + objc_filter_list)
473 hundred_char_sources = lambda x: input_api.FilterSourceFile(x,
474 white_list=objc_filter_list)
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000475 results.extend(input_api.canned_checks.CheckLongLines(
tkchin3cd9a302016-06-08 12:40:28 -0700476 input_api, output_api, maxlen=80, source_file_filter=eighty_char_sources))
477 results.extend(input_api.canned_checks.CheckLongLines(
478 input_api, output_api, maxlen=100,
479 source_file_filter=hundred_char_sources))
480
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000481 results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
482 input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000483 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
484 input_api, output_api))
485 results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
486 input_api, output_api))
kjellander53047c92015-12-02 23:56:14 -0800487 results.extend(_CheckNativeApiHeaderChanges(input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000488 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
489 results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000490 results.extend(_CheckGypChanges(input_api, output_api))
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000491 results.extend(_CheckUnwantedDependencies(input_api, output_api))
kjellander569cf942016-02-11 05:02:59 -0800492 results.extend(_CheckJSONParseErrors(input_api, output_api))
Henrik Kjellander8d3ad822015-05-26 19:52:05 +0200493 results.extend(_RunPythonTests(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000494 return results
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000495
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000496
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000497def CheckChangeOnUpload(input_api, output_api):
498 results = []
499 results.extend(_CommonChecks(input_api, output_api))
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200500 results.extend(
501 input_api.canned_checks.CheckGNFormatted(input_api, output_api))
niklase@google.comda159d62011-05-30 11:51:34 +0000502 return results
503
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000504
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000505def CheckChangeOnCommit(input_api, output_api):
niklase@google.com1198db92011-06-09 07:07:24 +0000506 results = []
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000507 results.extend(_CommonChecks(input_api, output_api))
kjellander53047c92015-12-02 23:56:14 -0800508 results.extend(_VerifyNativeApiHeadersListIsValid(input_api, output_api))
niklase@google.com1198db92011-06-09 07:07:24 +0000509 results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000510 results.extend(input_api.canned_checks.CheckChangeWasUploaded(
511 input_api, output_api))
512 results.extend(input_api.canned_checks.CheckChangeHasDescription(
513 input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000514 results.extend(input_api.canned_checks.CheckChangeHasBugField(
515 input_api, output_api))
516 results.extend(input_api.canned_checks.CheckChangeHasTestField(
517 input_api, output_api))
kjellander@webrtc.org12cb88c2014-02-13 11:53:43 +0000518 results.extend(input_api.canned_checks.CheckTreeIsOpen(
519 input_api, output_api,
520 json_url='http://webrtc-status.appspot.com/current?format=json'))
niklase@google.com1198db92011-06-09 07:07:24 +0000521 return results
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000522
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000523
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000524# pylint: disable=W0613
kjellander@webrtc.orgc7b8b2f2014-04-03 20:19:36 +0000525def GetPreferredTryMasters(project, change):
kjellander986ee082015-06-16 04:32:13 -0700526 cq_config_path = os.path.join(
tandrii04465d22015-06-20 04:00:49 -0700527 change.RepositoryRoot(), 'infra', 'config', 'cq.cfg')
kjellander986ee082015-06-16 04:32:13 -0700528 # commit_queue.py below is a script in depot_tools directory, which has a
529 # 'builders' command to retrieve a list of CQ builders from the CQ config.
530 is_win = platform.system() == 'Windows'
531 masters = json.loads(subprocess.check_output(
532 ['commit_queue', 'builders', cq_config_path], shell=is_win))
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000533
kjellander986ee082015-06-16 04:32:13 -0700534 try_config = {}
535 for master in masters:
536 try_config.setdefault(master, {})
537 for builder in masters[master]:
538 if 'presubmit' in builder:
539 # Do not trigger presubmit builders, since they're likely to fail
540 # (e.g. OWNERS checks before finished code review), and we're running
541 # local presubmit anyway.
542 pass
543 else:
544 try_config[master][builder] = ['defaulttests']
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000545
kjellander986ee082015-06-16 04:32:13 -0700546 return try_config