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