blob: d2ab65f02608c63ae4e26d68aa4eec4460413ca7 [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.
41BLACKLIST_LINT_FILTERS = [
42 '-build/c++11',
43]
44
kjellanderfd595232015-12-04 02:44:09 -080045# List of directories of "supported" native APIs. That means changes to headers
46# will be done in a compatible way following this scheme:
47# 1. Non-breaking changes are made.
48# 2. The old APIs as marked as deprecated (with comments).
49# 3. Deprecation is announced to discuss-webrtc@googlegroups.com and
50# webrtc-users@google.com (internal list).
51# 4. (later) The deprecated APIs are removed.
52# Directories marked as DEPRECATED should not be used. They're only present in
53# the list to support legacy downstream code.
kjellander53047c92015-12-02 23:56:14 -080054NATIVE_API_DIRS = (
55 'talk/app/webrtc',
56 'webrtc',
kjellanderfd595232015-12-04 02:44:09 -080057 'webrtc/base', # DEPRECATED.
58 'webrtc/common_audio/include', # DEPRECATED.
kjellander53047c92015-12-02 23:56:14 -080059 'webrtc/modules/audio_coding/include',
kjellanderfd595232015-12-04 02:44:09 -080060 'webrtc/modules/audio_conference_mixer/include', # DEPRECATED.
kjellander53047c92015-12-02 23:56:14 -080061 'webrtc/modules/audio_device/include',
62 'webrtc/modules/audio_processing/include',
63 'webrtc/modules/bitrate_controller/include',
Stefan Holmer80e12072016-02-23 13:30:42 +010064 'webrtc/modules/congestion_controller/include',
kjellander53047c92015-12-02 23:56:14 -080065 'webrtc/modules/include',
66 'webrtc/modules/remote_bitrate_estimator/include',
67 'webrtc/modules/rtp_rtcp/include',
kjellanderfd595232015-12-04 02:44:09 -080068 'webrtc/modules/rtp_rtcp/source', # DEPRECATED.
kjellander53047c92015-12-02 23:56:14 -080069 'webrtc/modules/utility/include',
70 'webrtc/modules/video_coding/codecs/h264/include',
71 'webrtc/modules/video_coding/codecs/i420/include',
72 'webrtc/modules/video_coding/codecs/vp8/include',
73 'webrtc/modules/video_coding/codecs/vp9/include',
74 'webrtc/modules/video_coding/include',
kjellanderfd595232015-12-04 02:44:09 -080075 'webrtc/system_wrappers/include', # DEPRECATED.
kjellander53047c92015-12-02 23:56:14 -080076 'webrtc/voice_engine/include',
77)
78
79
80def _VerifyNativeApiHeadersListIsValid(input_api, output_api):
81 """Ensures the list of native API header directories is up to date."""
82 non_existing_paths = []
83 native_api_full_paths = [
84 input_api.os_path.join(input_api.PresubmitLocalPath(),
85 *path.split('/')) for path in NATIVE_API_DIRS]
86 for path in native_api_full_paths:
87 if not os.path.isdir(path):
88 non_existing_paths.append(path)
89 if non_existing_paths:
90 return [output_api.PresubmitError(
91 'Directories to native API headers have changed which has made the '
92 'list in PRESUBMIT.py outdated.\nPlease update it to the current '
93 'location of our native APIs.',
94 non_existing_paths)]
95 return []
96
kwibergeb133022016-04-07 07:41:48 -070097api_change_msg = """
98You seem to be changing native API header files. Please make sure that you:
99 1. Make compatible changes that don't break existing clients.
100 2. Mark the old stuff as deprecated.
101 3. Create a timeline and plan for when the deprecated stuff will be
102 removed. (The amount of time we give users to change their code
103 should be informed by how much work it is for them. If they just
104 need to replace one name with another or something equally
105 simple, 1-2 weeks might be good; if they need to do serious work,
106 up to 3 months may be called for.)
107 4. Update/inform existing downstream code owners to stop using the
108 deprecated stuff. (Send announcements to
109 discuss-webrtc@googlegroups.com and webrtc-users@google.com.)
110 5. Remove the deprecated stuff, once the agreed-upon amount of time
111 has passed.
112Related files:
113"""
kjellander53047c92015-12-02 23:56:14 -0800114
115def _CheckNativeApiHeaderChanges(input_api, output_api):
116 """Checks to remind proper changing of native APIs."""
117 files = []
118 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
119 if f.LocalPath().endswith('.h'):
120 for path in NATIVE_API_DIRS:
121 if os.path.dirname(f.LocalPath()) == path:
122 files.append(f)
123
124 if files:
kwibergeb133022016-04-07 07:41:48 -0700125 return [output_api.PresubmitNotifyResult(api_change_msg, files)]
kjellander53047c92015-12-02 23:56:14 -0800126 return []
127
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100128
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000129def _CheckNoIOStreamInHeaders(input_api, output_api):
130 """Checks to make sure no .h files include <iostream>."""
131 files = []
132 pattern = input_api.re.compile(r'^#include\s*<iostream>',
133 input_api.re.MULTILINE)
134 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
135 if not f.LocalPath().endswith('.h'):
136 continue
137 contents = input_api.ReadFile(f)
138 if pattern.search(contents):
139 files.append(f)
140
141 if len(files):
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200142 return [output_api.PresubmitError(
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000143 'Do not #include <iostream> in header files, since it inserts static ' +
144 'initialization into every file including the header. Instead, ' +
145 '#include <ostream>. See http://crbug.com/94794',
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200146 files)]
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000147 return []
148
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000149
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000150def _CheckNoFRIEND_TEST(input_api, output_api):
151 """Make sure that gtest's FRIEND_TEST() macro is not used, the
152 FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be
153 used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
154 problems = []
155
156 file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
157 for f in input_api.AffectedFiles(file_filter=file_filter):
158 for line_num, line in f.ChangedContents():
159 if 'FRIEND_TEST(' in line:
160 problems.append(' %s:%d' % (f.LocalPath(), line_num))
161
162 if not problems:
163 return []
164 return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use '
165 'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and '
166 'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
167
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000168
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100169def _IsLintWhitelisted(whitelist_dirs, file_path):
170 """ Checks if a file is whitelisted for lint check."""
171 for path in whitelist_dirs:
172 if os.path.dirname(file_path).startswith(path):
173 return True
174 return False
175
176
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000177def _CheckApprovedFilesLintClean(input_api, output_api,
178 source_file_filter=None):
179 """Checks that all new or whitelisted .cc and .h files pass cpplint.py.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000180 This check is based on _CheckChangeLintsClean in
181 depot_tools/presubmit_canned_checks.py but has less filters and only checks
182 added files."""
183 result = []
184
185 # Initialize cpplint.
186 import cpplint
187 # Access to a protected member _XX of a client class
188 # pylint: disable=W0212
189 cpplint._cpplint_state.ResetErrorCounts()
190
jbauchc4e3ead2016-02-19 00:25:55 -0800191 lint_filters = cpplint._Filters()
192 lint_filters.extend(BLACKLIST_LINT_FILTERS)
193 cpplint._SetFilters(','.join(lint_filters))
194
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100195 # Create a platform independent whitelist for the CPPLINT_DIRS.
196 whitelist_dirs = [input_api.os_path.join(*path.split('/'))
197 for path in CPPLINT_DIRS]
198
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000199 # Use the strictest verbosity level for cpplint.py (level 1) which is the
200 # default when running cpplint.py from command line.
201 # To make it possible to work with not-yet-converted code, we're only applying
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000202 # it to new (or moved/renamed) files and files listed in LINT_FOLDERS.
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000203 verbosity_level = 1
204 files = []
205 for f in input_api.AffectedSourceFiles(source_file_filter):
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200206 # Note that moved/renamed files also count as added.
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100207 if f.Action() == 'A' or _IsLintWhitelisted(whitelist_dirs, f.LocalPath()):
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000208 files.append(f.AbsoluteLocalPath())
mflodman@webrtc.org2a452092012-07-01 05:55:23 +0000209
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000210 for file_name in files:
211 cpplint.ProcessFile(file_name, verbosity_level)
212
213 if cpplint._cpplint_state.error_count > 0:
214 if input_api.is_committing:
215 # TODO(kjellander): Change back to PresubmitError below when we're
216 # confident with the lint settings.
217 res_type = output_api.PresubmitPromptWarning
218 else:
219 res_type = output_api.PresubmitPromptWarning
220 result = [res_type('Changelist failed cpplint.py check.')]
221
222 return result
223
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000224def _CheckNoRtcBaseDeps(input_api, gyp_files, output_api):
225 pattern = input_api.re.compile(r"base.gyp:rtc_base\s*'")
226 violating_files = []
227 for f in gyp_files:
henrike@webrtc.org36b0c1a2014-10-01 14:40:58 +0000228 gyp_exceptions = (
229 'base_tests.gyp',
230 'desktop_capture.gypi',
kjellander@webrtc.orge7237282015-02-26 11:12:17 +0000231 'p2p.gyp',
henrike@webrtc.org36b0c1a2014-10-01 14:40:58 +0000232 'webrtc_test_common.gyp',
233 'webrtc_tests.gypi',
234 )
235 if f.LocalPath().endswith(gyp_exceptions):
236 continue
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000237 contents = input_api.ReadFile(f)
238 if pattern.search(contents):
239 violating_files.append(f)
240 if violating_files:
241 return [output_api.PresubmitError(
242 'Depending on rtc_base is not allowed. Change your dependency to '
243 'rtc_base_approved and possibly sanitize and move the desired source '
244 'file(s) to rtc_base_approved.\nChanged GYP files:',
245 items=violating_files)]
246 return []
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000247
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000248def _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api):
249 # Disallow referencing source files with paths above the GYP file location.
250 source_pattern = input_api.re.compile(r'sources.*?\[(.*?)\]',
251 re.MULTILINE | re.DOTALL)
kjellander@webrtc.orga33f05e2015-01-29 14:29:45 +0000252 file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'")
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000253 violating_gyp_files = set()
254 violating_source_entries = []
255 for gyp_file in gyp_files:
kjellanderc61635c2016-02-02 02:30:07 -0800256 if 'supplement.gypi' in gyp_file.LocalPath():
257 # Exclude supplement.gypi from this check, as the LSan and TSan
258 # suppression files are located in a different location.
259 continue
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000260 contents = input_api.ReadFile(gyp_file)
261 for source_block_match in source_pattern.finditer(contents):
kjellander@webrtc.orgc98f6f32015-03-04 07:08:11 +0000262 # Find all source list entries starting with ../ in the source block
263 # (exclude overrides entries).
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000264 for file_list_match in file_pattern.finditer(source_block_match.group(0)):
kjellander@webrtc.orgc98f6f32015-03-04 07:08:11 +0000265 source_file = file_list_match.group(0)
266 if 'overrides/' not in source_file:
267 violating_source_entries.append(source_file)
268 violating_gyp_files.add(gyp_file)
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000269 if violating_gyp_files:
270 return [output_api.PresubmitError(
271 'Referencing source files above the directory of the GYP file is not '
272 'allowed. Please introduce new GYP targets and/or GYP files in the '
273 'proper location instead.\n'
274 'Invalid source entries:\n'
275 '%s\n'
276 'Violating GYP files:' % '\n'.join(violating_source_entries),
277 items=violating_gyp_files)]
278 return []
279
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000280def _CheckGypChanges(input_api, output_api):
281 source_file_filter = lambda x: input_api.FilterSourceFile(
282 x, white_list=(r'.+\.(gyp|gypi)$',))
283
284 gyp_files = []
285 for f in input_api.AffectedSourceFiles(source_file_filter):
kjellander@webrtc.org3398a4a2014-11-24 10:05:37 +0000286 if f.LocalPath().startswith('webrtc'):
287 gyp_files.append(f)
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000288
289 result = []
290 if gyp_files:
291 result.append(output_api.PresubmitNotifyResult(
292 'As you\'re changing GYP files: please make sure corresponding '
293 'BUILD.gn files are also updated.\nChanged GYP files:',
294 items=gyp_files))
henrike@webrtc.org83fe69d2014-09-30 21:54:26 +0000295 result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api))
kjellander@webrtc.orgf68ffca2015-01-27 13:13:24 +0000296 result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api))
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000297 return result
298
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000299def _CheckUnwantedDependencies(input_api, output_api):
300 """Runs checkdeps on #include statements added in this
301 change. Breaking - rules is an error, breaking ! rules is a
302 warning.
303 """
304 # Copied from Chromium's src/PRESUBMIT.py.
305
306 # We need to wait until we have an input_api object and use this
307 # roundabout construct to import checkdeps because this file is
308 # eval-ed and thus doesn't have __file__.
309 original_sys_path = sys.path
310 try:
kjellander@webrtc.orgaefe61a2014-12-08 13:00:30 +0000311 checkdeps_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
312 'buildtools', 'checkdeps')
313 if not os.path.exists(checkdeps_path):
314 return [output_api.PresubmitError(
315 'Cannot find checkdeps at %s\nHave you run "gclient sync" to '
316 'download Chromium and setup the symlinks?' % checkdeps_path)]
317 sys.path.append(checkdeps_path)
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000318 import checkdeps
319 from cpp_checker import CppChecker
320 from rules import Rule
321 finally:
322 # Restore sys.path to what it was before.
323 sys.path = original_sys_path
324
325 added_includes = []
326 for f in input_api.AffectedFiles():
327 if not CppChecker.IsCppFile(f.LocalPath()):
328 continue
329
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200330 changed_lines = [line for _, line in f.ChangedContents()]
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000331 added_includes.append([f.LocalPath(), changed_lines])
332
333 deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath())
334
335 error_descriptions = []
336 warning_descriptions = []
337 for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes(
338 added_includes):
339 description_with_path = '%s\n %s' % (path, rule_description)
340 if rule_type == Rule.DISALLOW:
341 error_descriptions.append(description_with_path)
342 else:
343 warning_descriptions.append(description_with_path)
344
345 results = []
346 if error_descriptions:
347 results.append(output_api.PresubmitError(
348 'You added one or more #includes that violate checkdeps rules.',
349 error_descriptions))
350 if warning_descriptions:
351 results.append(output_api.PresubmitPromptOrNotify(
352 'You added one or more #includes of files that are temporarily\n'
353 'allowed but being removed. Can you avoid introducing the\n'
354 '#include? See relevant DEPS file(s) for details and contacts.',
355 warning_descriptions))
356 return results
357
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000358
kjellander569cf942016-02-11 05:02:59 -0800359def _CheckJSONParseErrors(input_api, output_api):
360 """Check that JSON files do not contain syntax errors."""
361
362 def FilterFile(affected_file):
363 return input_api.os_path.splitext(affected_file.LocalPath())[1] == '.json'
364
365 def GetJSONParseError(input_api, filename):
366 try:
367 contents = input_api.ReadFile(filename)
368 input_api.json.loads(contents)
369 except ValueError as e:
370 return e
371 return None
372
373 results = []
374 for affected_file in input_api.AffectedFiles(
375 file_filter=FilterFile, include_deletes=False):
376 parse_error = GetJSONParseError(input_api,
377 affected_file.AbsoluteLocalPath())
378 if parse_error:
379 results.append(output_api.PresubmitError('%s could not be parsed: %s' %
380 (affected_file.LocalPath(), parse_error)))
381 return results
382
383
Henrik Kjellander8d3ad822015-05-26 19:52:05 +0200384def _RunPythonTests(input_api, output_api):
385 def join(*args):
386 return input_api.os_path.join(input_api.PresubmitLocalPath(), *args)
387
388 test_directories = [
389 join('tools', 'autoroller', 'unittests'),
390 ]
391
392 tests = []
393 for directory in test_directories:
394 tests.extend(
395 input_api.canned_checks.GetUnitTestsInDirectory(
396 input_api,
397 output_api,
398 directory,
399 whitelist=[r'.+_test\.py$']))
400 return input_api.RunTests(tests, parallel=True)
401
402
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000403def _CommonChecks(input_api, output_api):
404 """Checks common to both upload and commit."""
niklase@google.comda159d62011-05-30 11:51:34 +0000405 results = []
tkchin42f580e2015-11-26 23:18:23 -0800406 # Filter out files that are in objc or ios dirs from being cpplint-ed since
407 # they do not follow C++ lint rules.
408 black_list = input_api.DEFAULT_BLACK_LIST + (
409 r".*\bobjc[\\\/].*",
410 )
411 source_file_filter = lambda x: input_api.FilterSourceFile(x, None, black_list)
412 results.extend(_CheckApprovedFilesLintClean(
413 input_api, output_api, source_file_filter))
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000414 results.extend(input_api.canned_checks.RunPylint(input_api, output_api,
415 black_list=(r'^.*gviz_api\.py$',
416 r'^.*gaeunit\.py$',
fischman@webrtc.org33584f92013-07-25 16:43:30 +0000417 # Embedded shell-script fakes out pylint.
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200418 r'^build[\\\/].*\.py$',
419 r'^buildtools[\\\/].*\.py$',
420 r'^chromium[\\\/].*\.py$',
kjellanderd620f822016-04-04 06:07:08 -0700421 r'^mojo.*[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200422 r'^out.*[\\\/].*\.py$',
423 r'^testing[\\\/].*\.py$',
424 r'^third_party[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200425 r'^tools[\\\/]clang[\\\/].*\.py$',
426 r'^tools[\\\/]generate_library_loader[\\\/].*\.py$',
kjellanderd620f822016-04-04 06:07:08 -0700427 r'^tools[\\\/]generate_stubs[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200428 r'^tools[\\\/]gn[\\\/].*\.py$',
429 r'^tools[\\\/]gyp[\\\/].*\.py$',
Henrik Kjellanderd6d27e72015-09-25 22:19:11 +0200430 r'^tools[\\\/]isolate_driver.py$',
kjellanderd620f822016-04-04 06:07:08 -0700431 r'^tools[\\\/]mb[\\\/].*\.py$',
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200432 r'^tools[\\\/]protoc_wrapper[\\\/].*\.py$',
433 r'^tools[\\\/]python[\\\/].*\.py$',
434 r'^tools[\\\/]python_charts[\\\/]data[\\\/].*\.py$',
435 r'^tools[\\\/]refactoring[\\\/].*\.py$',
436 r'^tools[\\\/]swarming_client[\\\/].*\.py$',
437 r'^tools[\\\/]vim[\\\/].*\.py$',
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000438 # TODO(phoglund): should arguably be checked.
Henrik Kjellander14771ac2015-06-02 13:10:04 +0200439 r'^tools[\\\/]valgrind-webrtc[\\\/].*\.py$',
440 r'^tools[\\\/]valgrind[\\\/].*\.py$',
441 r'^tools[\\\/]win[\\\/].*\.py$',
442 r'^xcodebuild.*[\\\/].*\.py$',),
phoglund@webrtc.org5d3713932013-03-07 09:59:43 +0000443 disabled_warnings=['F0401', # Failed to import x
444 'E0611', # No package y in x
445 'W0232', # Class has no __init__ method
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200446 ],
447 pylintrc='pylintrc'))
kjellander569cf942016-02-11 05:02:59 -0800448
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200449 # WebRTC can't use the presubmit_canned_checks.PanProjectChecks function since
450 # we need to have different license checks in talk/ and webrtc/ directories.
451 # Instead, hand-picked checks are included below.
Henrik Kjellander63224672015-09-08 08:03:56 +0200452
453 # Skip long-lines check for DEPS, GN and GYP files.
454 long_lines_sources = lambda x: input_api.FilterSourceFile(x,
455 black_list=(r'.+\.gyp$', r'.+\.gypi$', r'.+\.gn$', r'.+\.gni$', 'DEPS'))
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000456 results.extend(input_api.canned_checks.CheckLongLines(
Henrik Kjellander63224672015-09-08 08:03:56 +0200457 input_api, output_api, maxlen=80, source_file_filter=long_lines_sources))
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000458 results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
459 input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000460 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
461 input_api, output_api))
462 results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
463 input_api, output_api))
kjellander53047c92015-12-02 23:56:14 -0800464 results.extend(_CheckNativeApiHeaderChanges(input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000465 results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
466 results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000467 results.extend(_CheckGypChanges(input_api, output_api))
kjellander@webrtc.org3bd41562014-09-01 11:06:37 +0000468 results.extend(_CheckUnwantedDependencies(input_api, output_api))
kjellander569cf942016-02-11 05:02:59 -0800469 results.extend(_CheckJSONParseErrors(input_api, output_api))
Henrik Kjellander8d3ad822015-05-26 19:52:05 +0200470 results.extend(_RunPythonTests(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000471 return results
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000472
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000473
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000474def CheckChangeOnUpload(input_api, output_api):
475 results = []
476 results.extend(_CommonChecks(input_api, output_api))
Henrik Kjellander57e5fd22015-05-25 12:55:39 +0200477 results.extend(
478 input_api.canned_checks.CheckGNFormatted(input_api, output_api))
niklase@google.comda159d62011-05-30 11:51:34 +0000479 return results
480
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000481
andrew@webrtc.org2442de12012-01-23 17:45:41 +0000482def CheckChangeOnCommit(input_api, output_api):
niklase@google.com1198db92011-06-09 07:07:24 +0000483 results = []
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000484 results.extend(_CommonChecks(input_api, output_api))
kjellander53047c92015-12-02 23:56:14 -0800485 results.extend(_VerifyNativeApiHeadersListIsValid(input_api, output_api))
niklase@google.com1198db92011-06-09 07:07:24 +0000486 results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
andrew@webrtc.org53df1362012-01-26 21:24:23 +0000487 results.extend(input_api.canned_checks.CheckChangeWasUploaded(
488 input_api, output_api))
489 results.extend(input_api.canned_checks.CheckChangeHasDescription(
490 input_api, output_api))
kjellander@webrtc.org51198f12012-02-21 17:53:46 +0000491 results.extend(input_api.canned_checks.CheckChangeHasBugField(
492 input_api, output_api))
493 results.extend(input_api.canned_checks.CheckChangeHasTestField(
494 input_api, output_api))
kjellander@webrtc.org12cb88c2014-02-13 11:53:43 +0000495 results.extend(input_api.canned_checks.CheckTreeIsOpen(
496 input_api, output_api,
497 json_url='http://webrtc-status.appspot.com/current?format=json'))
niklase@google.com1198db92011-06-09 07:07:24 +0000498 return results
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000499
kjellander@webrtc.orge4158642014-08-06 09:11:18 +0000500
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000501# pylint: disable=W0613
kjellander@webrtc.orgc7b8b2f2014-04-03 20:19:36 +0000502def GetPreferredTryMasters(project, change):
kjellander986ee082015-06-16 04:32:13 -0700503 cq_config_path = os.path.join(
tandrii04465d22015-06-20 04:00:49 -0700504 change.RepositoryRoot(), 'infra', 'config', 'cq.cfg')
kjellander986ee082015-06-16 04:32:13 -0700505 # commit_queue.py below is a script in depot_tools directory, which has a
506 # 'builders' command to retrieve a list of CQ builders from the CQ config.
507 is_win = platform.system() == 'Windows'
508 masters = json.loads(subprocess.check_output(
509 ['commit_queue', 'builders', cq_config_path], shell=is_win))
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000510
kjellander986ee082015-06-16 04:32:13 -0700511 try_config = {}
512 for master in masters:
513 try_config.setdefault(master, {})
514 for builder in masters[master]:
515 if 'presubmit' in builder:
516 # Do not trigger presubmit builders, since they're likely to fail
517 # (e.g. OWNERS checks before finished code review), and we're running
518 # local presubmit anyway.
519 pass
520 else:
521 try_config[master][builder] = ['defaulttests']
kjellander@webrtc.org85759802013-10-22 16:47:40 +0000522
kjellander986ee082015-06-16 04:32:13 -0700523 return try_config