PRESUBMIT.py revision 57e5fd2e604ff7e60425c3f7654b40da03fc763c
12442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 22442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# 32442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# Use of this source code is governed by a BSD-style license 42442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# that can be found in the LICENSE file in the root of the source 52442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# tree. An additional intellectual property rights grant can be found 62442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# in the file PATENTS. All contributing project authors may 72442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org# be found in the AUTHORS file in the root of the source tree. 8da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com 9aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.orgimport os 108575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.orgimport re 113bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.orgimport sys 128575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 138575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 1451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.orgdef _CheckNoIOStreamInHeaders(input_api, output_api): 1551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org """Checks to make sure no .h files include <iostream>.""" 1651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org files = [] 1751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org pattern = input_api.re.compile(r'^#include\s*<iostream>', 1851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org input_api.re.MULTILINE) 1951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): 2051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if not f.LocalPath().endswith('.h'): 2151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org continue 2251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org contents = input_api.ReadFile(f) 2351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if pattern.search(contents): 2451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org files.append(f) 2551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 2651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if len(files): 2757e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander return [output_api.PresubmitError( 2851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 'Do not #include <iostream> in header files, since it inserts static ' + 2951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 'initialization into every file including the header. Instead, ' + 3051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org '#include <ostream>. See http://crbug.com/94794', 3157e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander files)] 3251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org return [] 3351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 34e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 3551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.orgdef _CheckNoFRIEND_TEST(input_api, output_api): 3651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org """Make sure that gtest's FRIEND_TEST() macro is not used, the 3751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be 3851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes.""" 3951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org problems = [] 4051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 4151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h')) 4251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org for f in input_api.AffectedFiles(file_filter=file_filter): 4351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org for line_num, line in f.ChangedContents(): 4451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if 'FRIEND_TEST(' in line: 4551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org problems.append(' %s:%d' % (f.LocalPath(), line_num)) 4651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 4751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if not problems: 4851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org return [] 4951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use ' 5051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and ' 5151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))] 5251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 53e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 542a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.orgdef _CheckApprovedFilesLintClean(input_api, output_api, 552a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org source_file_filter=None): 562a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org """Checks that all new or whitelisted .cc and .h files pass cpplint.py. 5751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org This check is based on _CheckChangeLintsClean in 5851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org depot_tools/presubmit_canned_checks.py but has less filters and only checks 5951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org added files.""" 6051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org result = [] 6151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 6251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # Initialize cpplint. 6351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org import cpplint 6451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # Access to a protected member _XX of a client class 6551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # pylint: disable=W0212 6651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org cpplint._cpplint_state.ResetErrorCounts() 6751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 6851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # Justifications for each filter: 6951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # 7051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # - build/header_guard : WebRTC coding style says they should be prefixed 7151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # with WEBRTC_, which is not possible to configure in 7251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # cpplint.py. 7351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org cpplint._SetFilters('-build/header_guard') 7451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 7551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # Use the strictest verbosity level for cpplint.py (level 1) which is the 7651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # default when running cpplint.py from command line. 7751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # To make it possible to work with not-yet-converted code, we're only applying 782a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org # it to new (or moved/renamed) files and files listed in LINT_FOLDERS. 7951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org verbosity_level = 1 8051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org files = [] 8151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org for f in input_api.AffectedSourceFiles(source_file_filter): 8257e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander # Note that moved/renamed files also count as added. 8357e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander if f.Action() == 'A': 8451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org files.append(f.AbsoluteLocalPath()) 852a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org 8651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org for file_name in files: 8751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org cpplint.ProcessFile(file_name, verbosity_level) 8851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 8951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if cpplint._cpplint_state.error_count > 0: 9051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org if input_api.is_committing: 9151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # TODO(kjellander): Change back to PresubmitError below when we're 9251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org # confident with the lint settings. 9351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org res_type = output_api.PresubmitPromptWarning 9451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org else: 9551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org res_type = output_api.PresubmitPromptWarning 9651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org result = [res_type('Changelist failed cpplint.py check.')] 9751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 9851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org return result 9951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org 10083fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.orgdef _CheckNoRtcBaseDeps(input_api, gyp_files, output_api): 10183fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org pattern = input_api.re.compile(r"base.gyp:rtc_base\s*'") 10283fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org violating_files = [] 10383fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org for f in gyp_files: 10436b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org gyp_exceptions = ( 10536b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'base_tests.gyp', 10636b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'desktop_capture.gypi', 10736b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'libjingle.gyp', 10828af64105b6dbe97e423e2f6cfde8e47a2df625ahenrike@webrtc.org 'libjingle_tests.gyp', 109e723728992de4626445fc7d3ca500cfea7c96890kjellander@webrtc.org 'p2p.gyp', 11036b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'sound.gyp', 11136b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'webrtc_test_common.gyp', 11236b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org 'webrtc_tests.gypi', 11336b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org ) 11436b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org if f.LocalPath().endswith(gyp_exceptions): 11536b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org continue 11683fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org contents = input_api.ReadFile(f) 11783fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org if pattern.search(contents): 11883fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org violating_files.append(f) 11983fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org if violating_files: 12083fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org return [output_api.PresubmitError( 12183fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org 'Depending on rtc_base is not allowed. Change your dependency to ' 12283fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org 'rtc_base_approved and possibly sanitize and move the desired source ' 12383fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org 'file(s) to rtc_base_approved.\nChanged GYP files:', 12483fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org items=violating_files)] 12583fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org return [] 126e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 127f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.orgdef _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api): 128f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org # Disallow referencing source files with paths above the GYP file location. 129f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org source_pattern = input_api.re.compile(r'sources.*?\[(.*?)\]', 130f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org re.MULTILINE | re.DOTALL) 131a33f05e8d7f293b5984b3cd7695eadefd16dcabakjellander@webrtc.org file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'") 132f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org violating_gyp_files = set() 133f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org violating_source_entries = [] 134f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org for gyp_file in gyp_files: 135f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org contents = input_api.ReadFile(gyp_file) 136f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org for source_block_match in source_pattern.finditer(contents): 137c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org # Find all source list entries starting with ../ in the source block 138c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org # (exclude overrides entries). 139f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org for file_list_match in file_pattern.finditer(source_block_match.group(0)): 140c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org source_file = file_list_match.group(0) 141c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org if 'overrides/' not in source_file: 142c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org violating_source_entries.append(source_file) 143c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org violating_gyp_files.add(gyp_file) 144f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org if violating_gyp_files: 145f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org return [output_api.PresubmitError( 146f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 'Referencing source files above the directory of the GYP file is not ' 147f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 'allowed. Please introduce new GYP targets and/or GYP files in the ' 148f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 'proper location instead.\n' 149f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 'Invalid source entries:\n' 150f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org '%s\n' 151f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 'Violating GYP files:' % '\n'.join(violating_source_entries), 152f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org items=violating_gyp_files)] 153f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org return [] 154f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org 155e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.orgdef _CheckGypChanges(input_api, output_api): 156e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org source_file_filter = lambda x: input_api.FilterSourceFile( 157e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org x, white_list=(r'.+\.(gyp|gypi)$',)) 158e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 159e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org gyp_files = [] 160e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org for f in input_api.AffectedSourceFiles(source_file_filter): 1613398a4ac15c9954f7d6355607897060236c3169bkjellander@webrtc.org if f.LocalPath().startswith('webrtc'): 1623398a4ac15c9954f7d6355607897060236c3169bkjellander@webrtc.org gyp_files.append(f) 163e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 164e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org result = [] 165e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org if gyp_files: 166e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org result.append(output_api.PresubmitNotifyResult( 167e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'As you\'re changing GYP files: please make sure corresponding ' 168e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'BUILD.gn files are also updated.\nChanged GYP files:', 169e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org items=gyp_files)) 17083fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api)) 171f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api)) 172e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org return result 173e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 1743bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.orgdef _CheckUnwantedDependencies(input_api, output_api): 1753bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org """Runs checkdeps on #include statements added in this 1763bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org change. Breaking - rules is an error, breaking ! rules is a 1773bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org warning. 1783bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org """ 1793bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org # Copied from Chromium's src/PRESUBMIT.py. 1803bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 1813bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org # We need to wait until we have an input_api object and use this 1823bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org # roundabout construct to import checkdeps because this file is 1833bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org # eval-ed and thus doesn't have __file__. 1843bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org original_sys_path = sys.path 1853bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org try: 186aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org checkdeps_path = input_api.os_path.join(input_api.PresubmitLocalPath(), 187aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org 'buildtools', 'checkdeps') 188aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org if not os.path.exists(checkdeps_path): 189aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org return [output_api.PresubmitError( 190aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org 'Cannot find checkdeps at %s\nHave you run "gclient sync" to ' 191aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org 'download Chromium and setup the symlinks?' % checkdeps_path)] 192aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org sys.path.append(checkdeps_path) 1933bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org import checkdeps 1943bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org from cpp_checker import CppChecker 1953bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org from rules import Rule 1963bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org finally: 1973bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org # Restore sys.path to what it was before. 1983bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org sys.path = original_sys_path 1993bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 2003bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org added_includes = [] 2013bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org for f in input_api.AffectedFiles(): 2023bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org if not CppChecker.IsCppFile(f.LocalPath()): 2033bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org continue 2043bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 20557e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander changed_lines = [line for _, line in f.ChangedContents()] 2063bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org added_includes.append([f.LocalPath(), changed_lines]) 2073bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 2083bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath()) 2093bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 2103bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org error_descriptions = [] 2113bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org warning_descriptions = [] 2123bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes( 2133bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org added_includes): 2143bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org description_with_path = '%s\n %s' % (path, rule_description) 2153bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org if rule_type == Rule.DISALLOW: 2163bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org error_descriptions.append(description_with_path) 2173bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org else: 2183bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org warning_descriptions.append(description_with_path) 2193bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 2203bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org results = [] 2213bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org if error_descriptions: 2223bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org results.append(output_api.PresubmitError( 2233bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 'You added one or more #includes that violate checkdeps rules.', 2243bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org error_descriptions)) 2253bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org if warning_descriptions: 2263bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org results.append(output_api.PresubmitPromptOrNotify( 2273bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 'You added one or more #includes of files that are temporarily\n' 2283bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 'allowed but being removed. Can you avoid introducing the\n' 2293bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org '#include? See relevant DEPS file(s) for details and contacts.', 2303bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org warning_descriptions)) 2313bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org return results 2323bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org 233e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 23453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.orgdef _CommonChecks(input_api, output_api): 23553df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org """Checks common to both upload and commit.""" 236da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com results = [] 2375d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org results.extend(input_api.canned_checks.RunPylint(input_api, output_api, 2385d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org black_list=(r'^.*gviz_api\.py$', 2395d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^.*gaeunit\.py$', 24033584f942c6e1723918d9d2b76f429ab8396751efischman@webrtc.org # Embedded shell-script fakes out pylint. 241e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^build/.*\.py$', 242e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^buildtools/.*\.py$', 2438925662318ca10d841e92f4dc20bbf0c53aea865kjellander@webrtc.org r'^chromium/.*\.py$', 244e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^out.*/.*\.py$', 2455d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^testing/.*\.py$', 246e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^third_party/.*\.py$', 247c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org r'^tools/clang/.*\.py$', 248e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^tools/gn/.*\.py$', 2495d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^tools/gyp/.*\.py$', 2506d07ad9cccbf172efd84294ee8552da4fa8860fephoglund@webrtc.org r'^tools/protoc_wrapper/.*\.py$', 2515d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^tools/python/.*\.py$', 2525d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^tools/python_charts/data/.*\.py$', 2533365422c419b535dc436da5990e32860a3d02440kjellander@webrtc.org r'^tools/refactoring/.*\.py$', 254f9bdbe36198341d678ea22f8a47de60ee552e69akjellander@webrtc.org r'^tools/swarming_client/.*\.py$', 2555d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org # TODO(phoglund): should arguably be checked. 2565d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^tools/valgrind-webrtc/.*\.py$', 2575d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org r'^tools/valgrind/.*\.py$', 258e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org r'^xcodebuild.*/.*\.py$',), 2595d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org disabled_warnings=['F0401', # Failed to import x 2605d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org 'E0611', # No package y in x 2615d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org 'W0232', # Class has no __init__ method 26257e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander ], 26357e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander pylintrc='pylintrc')) 26457e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander # WebRTC can't use the presubmit_canned_checks.PanProjectChecks function since 26557e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander # we need to have different license checks in talk/ and webrtc/ directories. 26657e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander # Instead, hand-picked checks are included below. 2672442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org results.extend(input_api.canned_checks.CheckLongLines( 268f2e7bc6b6ac3ec7761a6a164a41c8d708bc1ef33pbos@webrtc.org input_api, output_api, maxlen=80)) 2692442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org results.extend(input_api.canned_checks.CheckChangeHasNoTabs( 2702442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org input_api, output_api)) 27153df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( 27253df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org input_api, output_api)) 27353df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(input_api.canned_checks.CheckChangeTodoHasOwner( 27453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org input_api, output_api)) 2752a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org results.extend(_CheckApprovedFilesLintClean(input_api, output_api)) 27651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org results.extend(_CheckNoIOStreamInHeaders(input_api, output_api)) 27751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org results.extend(_CheckNoFRIEND_TEST(input_api, output_api)) 278e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org results.extend(_CheckGypChanges(input_api, output_api)) 2793bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org results.extend(_CheckUnwantedDependencies(input_api, output_api)) 28053df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org return results 281da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com 282e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 28353df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.orgdef CheckChangeOnUpload(input_api, output_api): 28453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results = [] 28553df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(_CommonChecks(input_api, output_api)) 28657e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander results.extend( 28757e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander input_api.canned_checks.CheckGNFormatted(input_api, output_api)) 2882442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org return results 289da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com 290e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 2912442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.orgdef CheckChangeOnCommit(input_api, output_api): 2921198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com results = [] 29353df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(_CommonChecks(input_api, output_api)) 2941198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com results.extend(input_api.canned_checks.CheckOwners(input_api, output_api)) 29553df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(input_api.canned_checks.CheckChangeWasUploaded( 29653df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org input_api, output_api)) 29753df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org results.extend(input_api.canned_checks.CheckChangeHasDescription( 29853df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org input_api, output_api)) 29951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org results.extend(input_api.canned_checks.CheckChangeHasBugField( 30051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org input_api, output_api)) 30151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org results.extend(input_api.canned_checks.CheckChangeHasTestField( 30251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org input_api, output_api)) 30312cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org results.extend(input_api.canned_checks.CheckTreeIsOpen( 30412cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org input_api, output_api, 30512cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org json_url='http://webrtc-status.appspot.com/current?format=json')) 3061198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com return results 3078575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 308e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 309c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.orgdef GetDefaultTryConfigs(bots=None): 310c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org """Returns a list of ('bot', set(['tests']), optionally filtered by [bots]. 311c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org 312c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org For WebRTC purposes, we always return an empty list of tests, since we want 313c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org to run all tests by default on all our trybots. 314c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org """ 31557e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander return {'tryserver.webrtc': dict((bot, []) for bot in bots)} 316c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org 317e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 3188575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org# pylint: disable=W0613 319c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.orgdef GetPreferredTryMasters(project, change): 3208575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org files = change.LocalPaths() 3218575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 322e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org android_gn_bots = [ 323e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'android_gn', 324e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'android_gn_rel', 325e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org ] 326cf2b3acc480b5b316b03ba867d6504618019051fkjellander@webrtc.org android_bots = [ 327cf2b3acc480b5b316b03ba867d6504618019051fkjellander@webrtc.org 'android', 32836fc1bad3851d9e5f57c09034bd22e145f08ca33Henrik Kjellander 'android_arm64_rel', 329cf2b3acc480b5b316b03ba867d6504618019051fkjellander@webrtc.org 'android_rel', 330cf2b3acc480b5b316b03ba867d6504618019051fkjellander@webrtc.org 'android_clang', 331e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org ] + android_gn_bots 3328575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org ios_bots = [ 3338575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'ios', 334d91d359feb29a90ebbdcdb359fc0f426cd8b3b8ckjellander@webrtc.org 'ios_arm64', 335d91d359feb29a90ebbdcdb359fc0f426cd8b3b8ckjellander@webrtc.org 'ios_arm64_rel', 3368575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'ios_rel', 337d43ba89d0056854e84c6dc7f12698edd14719efbHenrik Kjellander 'ios32_sim', 338d43ba89d0056854e84c6dc7f12698edd14719efbHenrik Kjellander 'ios64_sim', 3398575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org ] 340e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org linux_gn_bots = [ 341e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'linux_gn', 342e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org 'linux_gn_rel', 343e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org ] 3448575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org linux_bots = [ 3458575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'linux', 3468575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'linux_asan', 347570bc3d792369c357bca4dc3a6c22e0f1fc5337dkjellander@webrtc.org 'linux_baremetal', 3483b839d008f3d03fdd23fbf25d840c139322b9358kjellander@webrtc.org 'linux_msan', 3498575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'linux_rel', 350c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org 'linux_tsan2', 351e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org ] + linux_gn_bots 3521592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org mac_gn_bots = [ 3531592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org 'mac_x64_gn', 3541592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org 'mac_x64_gn_rel', 3551592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org ] 3568575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org mac_bots = [ 3578575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'mac', 3588575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'mac_asan', 359570bc3d792369c357bca4dc3a6c22e0f1fc5337dkjellander@webrtc.org 'mac_baremetal', 3608575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'mac_rel', 361c0fc4dd87c1d226158cdaf1489c6f69e0fff62cakjellander@webrtc.org 'mac_x64', 3628575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'mac_x64_rel', 3631592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org ] + mac_gn_bots 3641592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org win_gn_bots = [ 3651592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org 'win_x64_gn', 3661592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org 'win_x64_gn_rel', 3678575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org ] 3688575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org win_bots = [ 3698575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'win', 370570bc3d792369c357bca4dc3a6c22e0f1fc5337dkjellander@webrtc.org 'win_baremetal', 371a956ec2019c28598b0abcc801b17b6589230cca9kjellander@webrtc.org 'win_drmemory_light', 3728575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'win_rel', 3738575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 'win_x64_rel', 3741592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org ] + win_gn_bots 3758575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org if not files or all(re.search(r'[\\/]OWNERS$', f) for f in files): 376c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return {} 377e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org if all(re.search(r'[\\/]BUILD.gn$', f) for f in files): 3781592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org return GetDefaultTryConfigs(android_gn_bots + linux_gn_bots + mac_gn_bots + 3791592df78ef952a4a44fe4c37291998095ad40ef5kjellander@webrtc.org win_gn_bots) 38057e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander if all(re.search('[/_])mac[/_.]', f) for f in files): 381c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return GetDefaultTryConfigs(mac_bots) 3828575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org if all(re.search('(^|[/_])win[/_.]', f) for f in files): 383c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return GetDefaultTryConfigs(win_bots) 384c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org if all(re.search('(^|[/_])android[/_.]', f) for f in files): 385c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return GetDefaultTryConfigs(android_bots) 386c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org if all(re.search('[/_]ios[/_.]', f) for f in files): 387c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return GetDefaultTryConfigs(ios_bots) 3888575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org 389c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org return GetDefaultTryConfigs(android_bots + ios_bots + linux_bots + mac_bots + 390c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.org win_bots) 391