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
9986ee082b628ffd3a90fbbe4b933a312489921e0kjellanderimport json
10aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.orgimport os
11986ee082b628ffd3a90fbbe4b933a312489921e0kjellanderimport platform
128575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.orgimport re
13986ee082b628ffd3a90fbbe4b933a312489921e0kjellanderimport subprocess
143bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.orgimport sys
158575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org
168575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org
170fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org# Directories that will be scanned by cpplint by the presubmit script.
180fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.orgCPPLINT_DIRS = [
19ea07373a2eb46f2732a8b5acef06a9b5078f37f8Fredrik Solenberg  'webrtc/audio',
20ea07373a2eb46f2732a8b5acef06a9b5078f37f8Fredrik Solenberg  'webrtc/call',
210f2e939a92fc1a70a67a9fc141d1f1d006bcded9jbauch  'webrtc/common_video',
2270625e5bf3c91c57bf704d380bcc9df86575f08ajbauch  'webrtc/examples',
238f09f170e650e14c4cd57c51be32a46e8cd1843bterelius  'webrtc/modules/remote_bitrate_estimator',
24377b5e622f3e2f4d3b564c0d64f40ff3b5d5acb5danilchap  'webrtc/modules/rtp_rtcp',
255908c71128aea207e42f86468aedb0a6fce3cccbphilipel  'webrtc/modules/video_coding',
2688eeac4aa7eaf22afc95bffbc8c2a2652b9222c8mflodman  'webrtc/modules/video_processing',
270f2e939a92fc1a70a67a9fc141d1f1d006bcded9jbauch  'webrtc/sound',
280f2e939a92fc1a70a67a9fc141d1f1d006bcded9jbauch  'webrtc/tools',
29d1590b2571c4cb33416e14c92e4f2dfed42ec3d4mflodman  'webrtc/video',
300fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org]
310fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
32fd595235878df06e7737ba8b72e8792d31d58d8akjellander# List of directories of "supported" native APIs. That means changes to headers
33fd595235878df06e7737ba8b72e8792d31d58d8akjellander# will be done in a compatible way following this scheme:
34fd595235878df06e7737ba8b72e8792d31d58d8akjellander# 1. Non-breaking changes are made.
35fd595235878df06e7737ba8b72e8792d31d58d8akjellander# 2. The old APIs as marked as deprecated (with comments).
36fd595235878df06e7737ba8b72e8792d31d58d8akjellander# 3. Deprecation is announced to discuss-webrtc@googlegroups.com and
37fd595235878df06e7737ba8b72e8792d31d58d8akjellander#    webrtc-users@google.com (internal list).
38fd595235878df06e7737ba8b72e8792d31d58d8akjellander# 4. (later) The deprecated APIs are removed.
39fd595235878df06e7737ba8b72e8792d31d58d8akjellander# Directories marked as DEPRECATED should not be used. They're only present in
40fd595235878df06e7737ba8b72e8792d31d58d8akjellander# the list to support legacy downstream code.
4153047c9739989251cbe7090865411b1469b47f5dkjellanderNATIVE_API_DIRS = (
4253047c9739989251cbe7090865411b1469b47f5dkjellander  'talk/app/webrtc',
4353047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc',
44fd595235878df06e7737ba8b72e8792d31d58d8akjellander  'webrtc/base',  # DEPRECATED.
45fd595235878df06e7737ba8b72e8792d31d58d8akjellander  'webrtc/common_audio/include',  # DEPRECATED.
4653047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/audio_coding/include',
47fd595235878df06e7737ba8b72e8792d31d58d8akjellander  'webrtc/modules/audio_conference_mixer/include',  # DEPRECATED.
4853047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/audio_device/include',
4953047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/audio_processing/include',
5053047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/bitrate_controller/include',
5153047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/include',
5253047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/remote_bitrate_estimator/include',
5353047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/rtp_rtcp/include',
54fd595235878df06e7737ba8b72e8792d31d58d8akjellander  'webrtc/modules/rtp_rtcp/source',  # DEPRECATED.
5553047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/utility/include',
5653047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/video_coding/codecs/h264/include',
5753047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/video_coding/codecs/i420/include',
5853047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/video_coding/codecs/vp8/include',
5953047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/video_coding/codecs/vp9/include',
6053047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/modules/video_coding/include',
61fd595235878df06e7737ba8b72e8792d31d58d8akjellander  'webrtc/system_wrappers/include',  # DEPRECATED.
6253047c9739989251cbe7090865411b1469b47f5dkjellander  'webrtc/voice_engine/include',
6353047c9739989251cbe7090865411b1469b47f5dkjellander)
6453047c9739989251cbe7090865411b1469b47f5dkjellander
6553047c9739989251cbe7090865411b1469b47f5dkjellander
6653047c9739989251cbe7090865411b1469b47f5dkjellanderdef _VerifyNativeApiHeadersListIsValid(input_api, output_api):
6753047c9739989251cbe7090865411b1469b47f5dkjellander  """Ensures the list of native API header directories is up to date."""
6853047c9739989251cbe7090865411b1469b47f5dkjellander  non_existing_paths = []
6953047c9739989251cbe7090865411b1469b47f5dkjellander  native_api_full_paths = [
7053047c9739989251cbe7090865411b1469b47f5dkjellander      input_api.os_path.join(input_api.PresubmitLocalPath(),
7153047c9739989251cbe7090865411b1469b47f5dkjellander                             *path.split('/')) for path in NATIVE_API_DIRS]
7253047c9739989251cbe7090865411b1469b47f5dkjellander  for path in native_api_full_paths:
7353047c9739989251cbe7090865411b1469b47f5dkjellander    if not os.path.isdir(path):
7453047c9739989251cbe7090865411b1469b47f5dkjellander      non_existing_paths.append(path)
7553047c9739989251cbe7090865411b1469b47f5dkjellander  if non_existing_paths:
7653047c9739989251cbe7090865411b1469b47f5dkjellander    return [output_api.PresubmitError(
7753047c9739989251cbe7090865411b1469b47f5dkjellander        'Directories to native API headers have changed which has made the '
7853047c9739989251cbe7090865411b1469b47f5dkjellander        'list in PRESUBMIT.py outdated.\nPlease update it to the current '
7953047c9739989251cbe7090865411b1469b47f5dkjellander        'location of our native APIs.',
8053047c9739989251cbe7090865411b1469b47f5dkjellander        non_existing_paths)]
8153047c9739989251cbe7090865411b1469b47f5dkjellander  return []
8253047c9739989251cbe7090865411b1469b47f5dkjellander
8353047c9739989251cbe7090865411b1469b47f5dkjellander
8453047c9739989251cbe7090865411b1469b47f5dkjellanderdef _CheckNativeApiHeaderChanges(input_api, output_api):
8553047c9739989251cbe7090865411b1469b47f5dkjellander  """Checks to remind proper changing of native APIs."""
8653047c9739989251cbe7090865411b1469b47f5dkjellander  files = []
8753047c9739989251cbe7090865411b1469b47f5dkjellander  for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
8853047c9739989251cbe7090865411b1469b47f5dkjellander    if f.LocalPath().endswith('.h'):
8953047c9739989251cbe7090865411b1469b47f5dkjellander      for path in NATIVE_API_DIRS:
9053047c9739989251cbe7090865411b1469b47f5dkjellander        if os.path.dirname(f.LocalPath()) == path:
9153047c9739989251cbe7090865411b1469b47f5dkjellander          files.append(f)
9253047c9739989251cbe7090865411b1469b47f5dkjellander
9353047c9739989251cbe7090865411b1469b47f5dkjellander  if files:
94ffea13c42cc3ebc118b6261be688f88974cc7ab5kjellander    return [output_api.PresubmitNotifyResult(
9553047c9739989251cbe7090865411b1469b47f5dkjellander        'You seem to be changing native API header files. Please make sure '
9653047c9739989251cbe7090865411b1469b47f5dkjellander        'you:\n'
9753047c9739989251cbe7090865411b1469b47f5dkjellander        '  1. Make compatible changes that don\'t break existing clients.\n'
9853047c9739989251cbe7090865411b1469b47f5dkjellander        '  2. Mark the old APIs as deprecated.\n'
9953047c9739989251cbe7090865411b1469b47f5dkjellander        '  3. Create a timeline and plan for when the deprecated method will '
10053047c9739989251cbe7090865411b1469b47f5dkjellander        'be removed (preferably 3 months or so).\n'
10153047c9739989251cbe7090865411b1469b47f5dkjellander        '  4. Update/inform existing downstream code owners to stop using the '
10253047c9739989251cbe7090865411b1469b47f5dkjellander        'deprecated APIs: \n'
10353047c9739989251cbe7090865411b1469b47f5dkjellander        'send announcement to discuss-webrtc@googlegroups.com and '
10453047c9739989251cbe7090865411b1469b47f5dkjellander        'webrtc-users@google.com.\n'
10553047c9739989251cbe7090865411b1469b47f5dkjellander        '  5. (after ~3 months) remove the deprecated API.\n'
10653047c9739989251cbe7090865411b1469b47f5dkjellander        'Related files:',
10753047c9739989251cbe7090865411b1469b47f5dkjellander        files)]
10853047c9739989251cbe7090865411b1469b47f5dkjellander  return []
10953047c9739989251cbe7090865411b1469b47f5dkjellander
1100fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
11151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.orgdef _CheckNoIOStreamInHeaders(input_api, output_api):
11251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  """Checks to make sure no .h files include <iostream>."""
11351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  files = []
11451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  pattern = input_api.re.compile(r'^#include\s*<iostream>',
11551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org                                 input_api.re.MULTILINE)
11651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
11751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    if not f.LocalPath().endswith('.h'):
11851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      continue
11951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    contents = input_api.ReadFile(f)
12051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    if pattern.search(contents):
12151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      files.append(f)
12251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
12351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  if len(files):
12457e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander    return [output_api.PresubmitError(
12551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org        'Do not #include <iostream> in header files, since it inserts static ' +
12651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org        'initialization into every file including the header. Instead, ' +
12751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org        '#include <ostream>. See http://crbug.com/94794',
12857e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander        files)]
12951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  return []
13051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
131e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
13251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.orgdef _CheckNoFRIEND_TEST(input_api, output_api):
13351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  """Make sure that gtest's FRIEND_TEST() macro is not used, the
13451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be
13551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
13651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  problems = []
13751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
13851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
13951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  for f in input_api.AffectedFiles(file_filter=file_filter):
14051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    for line_num, line in f.ChangedContents():
14151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      if 'FRIEND_TEST(' in line:
14251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org        problems.append('    %s:%d' % (f.LocalPath(), line_num))
14351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
14451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  if not problems:
14551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    return []
14651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use '
14751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and '
14851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
14951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
150e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
1510fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.orgdef _IsLintWhitelisted(whitelist_dirs, file_path):
1520fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org  """ Checks if a file is whitelisted for lint check."""
1530fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org  for path in whitelist_dirs:
1540fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org    if os.path.dirname(file_path).startswith(path):
1550fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org      return True
1560fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org  return False
1570fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
1580fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
1592a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.orgdef _CheckApprovedFilesLintClean(input_api, output_api,
1602a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org                                 source_file_filter=None):
1612a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org  """Checks that all new or whitelisted .cc and .h files pass cpplint.py.
16251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  This check is based on _CheckChangeLintsClean in
16351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  depot_tools/presubmit_canned_checks.py but has less filters and only checks
16451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  added files."""
16551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  result = []
16651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
16751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # Initialize cpplint.
16851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  import cpplint
16951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # Access to a protected member _XX of a client class
17051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # pylint: disable=W0212
17151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  cpplint._cpplint_state.ResetErrorCounts()
17251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
1730fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org  # Create a platform independent whitelist for the CPPLINT_DIRS.
1740fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org  whitelist_dirs = [input_api.os_path.join(*path.split('/'))
1750fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org                    for path in CPPLINT_DIRS]
1760fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org
17751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # Use the strictest verbosity level for cpplint.py (level 1) which is the
17851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # default when running cpplint.py from command line.
17951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  # To make it possible to work with not-yet-converted code, we're only applying
1802a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org  # it to new (or moved/renamed) files and files listed in LINT_FOLDERS.
18151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  verbosity_level = 1
18251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  files = []
18351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  for f in input_api.AffectedSourceFiles(source_file_filter):
18457e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander    # Note that moved/renamed files also count as added.
1850fcaf99b716c71e721db25f37f62dabf5dcbe69akjellander@webrtc.org    if f.Action() == 'A' or _IsLintWhitelisted(whitelist_dirs, f.LocalPath()):
18651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      files.append(f.AbsoluteLocalPath())
1872a45209a6d17e12419e13592eba786e7ba7b1425mflodman@webrtc.org
18851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  for file_name in files:
18951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    cpplint.ProcessFile(file_name, verbosity_level)
19051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
19151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  if cpplint._cpplint_state.error_count > 0:
19251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    if input_api.is_committing:
19351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      # TODO(kjellander): Change back to PresubmitError below when we're
19451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      # confident with the lint settings.
19551198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      res_type = output_api.PresubmitPromptWarning
19651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    else:
19751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      res_type = output_api.PresubmitPromptWarning
19851198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org    result = [res_type('Changelist failed cpplint.py check.')]
19951198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
20051198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  return result
20151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org
20283fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.orgdef _CheckNoRtcBaseDeps(input_api, gyp_files, output_api):
20383fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org  pattern = input_api.re.compile(r"base.gyp:rtc_base\s*'")
20483fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org  violating_files = []
20583fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org  for f in gyp_files:
20636b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org    gyp_exceptions = (
20736b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'base_tests.gyp',
20836b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'desktop_capture.gypi',
20936b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'libjingle.gyp',
21028af64105b6dbe97e423e2f6cfde8e47a2df625ahenrike@webrtc.org        'libjingle_tests.gyp',
211e723728992de4626445fc7d3ca500cfea7c96890kjellander@webrtc.org        'p2p.gyp',
21236b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'sound.gyp',
21336b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'webrtc_test_common.gyp',
21436b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org        'webrtc_tests.gypi',
21536b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org    )
21636b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org    if f.LocalPath().endswith(gyp_exceptions):
21736b0c1afae15e6cb47971ba81d1a8cf670045ccahenrike@webrtc.org      continue
21883fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org    contents = input_api.ReadFile(f)
21983fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org    if pattern.search(contents):
22083fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org      violating_files.append(f)
22183fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org  if violating_files:
22283fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org    return [output_api.PresubmitError(
22383fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org        'Depending on rtc_base is not allowed. Change your dependency to '
22483fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org        'rtc_base_approved and possibly sanitize and move the desired source '
22583fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org        'file(s) to rtc_base_approved.\nChanged GYP files:',
22683fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org        items=violating_files)]
22783fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org  return []
228e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
229f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.orgdef _CheckNoSourcesAboveGyp(input_api, gyp_files, output_api):
230f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  # Disallow referencing source files with paths above the GYP file location.
231f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  source_pattern = input_api.re.compile(r'sources.*?\[(.*?)\]',
232f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org                                        re.MULTILINE | re.DOTALL)
233a33f05e8d7f293b5984b3cd7695eadefd16dcabakjellander@webrtc.org  file_pattern = input_api.re.compile(r"'((\.\./.*?)|(<\(webrtc_root\).*?))'")
234f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  violating_gyp_files = set()
235f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  violating_source_entries = []
236f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  for gyp_file in gyp_files:
237f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org    contents = input_api.ReadFile(gyp_file)
238f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org    for source_block_match in source_pattern.finditer(contents):
239c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org      # Find all source list entries starting with ../ in the source block
240c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org      # (exclude overrides entries).
241f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org      for file_list_match in file_pattern.finditer(source_block_match.group(0)):
242c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org        source_file = file_list_match.group(0)
243c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org        if 'overrides/' not in source_file:
244c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org          violating_source_entries.append(source_file)
245c98f6f368a789955f4dec5a58e0163571021ac4akjellander@webrtc.org          violating_gyp_files.add(gyp_file)
246f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  if violating_gyp_files:
247f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org    return [output_api.PresubmitError(
248f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        'Referencing source files above the directory of the GYP file is not '
249f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        'allowed. Please introduce new GYP targets and/or GYP files in the '
250f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        'proper location instead.\n'
251f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        'Invalid source entries:\n'
252f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        '%s\n'
253f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        'Violating GYP files:' % '\n'.join(violating_source_entries),
254f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org        items=violating_gyp_files)]
255f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org  return []
256f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org
257e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.orgdef _CheckGypChanges(input_api, output_api):
258e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  source_file_filter = lambda x: input_api.FilterSourceFile(
259e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org      x, white_list=(r'.+\.(gyp|gypi)$',))
260e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
261e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  gyp_files = []
262e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  for f in input_api.AffectedSourceFiles(source_file_filter):
2633398a4ac15c9954f7d6355607897060236c3169bkjellander@webrtc.org    if f.LocalPath().startswith('webrtc'):
2643398a4ac15c9954f7d6355607897060236c3169bkjellander@webrtc.org      gyp_files.append(f)
265e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
266e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  result = []
267e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  if gyp_files:
268e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org    result.append(output_api.PresubmitNotifyResult(
269e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org        'As you\'re changing GYP files: please make sure corresponding '
270e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org        'BUILD.gn files are also updated.\nChanged GYP files:',
271e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org        items=gyp_files))
27283fe69da95bde17a8a80c4e9f8aaa1fe1439be85henrike@webrtc.org    result.extend(_CheckNoRtcBaseDeps(input_api, gyp_files, output_api))
273f68ffca050438b8055b108228cca198686abc0c1kjellander@webrtc.org    result.extend(_CheckNoSourcesAboveGyp(input_api, gyp_files, output_api))
274e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  return result
275e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
2763bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.orgdef _CheckUnwantedDependencies(input_api, output_api):
2773bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  """Runs checkdeps on #include statements added in this
2783bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  change. Breaking - rules is an error, breaking ! rules is a
2793bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  warning.
2803bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  """
2813bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  # Copied from Chromium's src/PRESUBMIT.py.
2823bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
2833bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  # We need to wait until we have an input_api object and use this
2843bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  # roundabout construct to import checkdeps because this file is
2853bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  # eval-ed and thus doesn't have __file__.
2863bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  original_sys_path = sys.path
2873bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  try:
288aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org    checkdeps_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
289aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org                                            'buildtools', 'checkdeps')
290aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org    if not os.path.exists(checkdeps_path):
291aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org      return [output_api.PresubmitError(
292aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org          'Cannot find checkdeps at %s\nHave you run "gclient sync" to '
293aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org          'download Chromium and setup the symlinks?' % checkdeps_path)]
294aefe61ae2a392122994739adac54017e33cab9bfkjellander@webrtc.org    sys.path.append(checkdeps_path)
2953bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    import checkdeps
2963bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    from cpp_checker import CppChecker
2973bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    from rules import Rule
2983bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  finally:
2993bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    # Restore sys.path to what it was before.
3003bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    sys.path = original_sys_path
3013bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
3023bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  added_includes = []
3033bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  for f in input_api.AffectedFiles():
3043bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    if not CppChecker.IsCppFile(f.LocalPath()):
3053bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org      continue
3063bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
30757e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander    changed_lines = [line for _, line in f.ChangedContents()]
3083bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    added_includes.append([f.LocalPath(), changed_lines])
3093bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
3103bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath())
3113bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
3123bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  error_descriptions = []
3133bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  warning_descriptions = []
3143bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes(
3153bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org      added_includes):
3163bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    description_with_path = '%s\n    %s' % (path, rule_description)
3173bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    if rule_type == Rule.DISALLOW:
3183bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org      error_descriptions.append(description_with_path)
3193bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    else:
3203bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org      warning_descriptions.append(description_with_path)
3213bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
3223bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  results = []
3233bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  if error_descriptions:
3243bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    results.append(output_api.PresubmitError(
3253bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        'You added one or more #includes that violate checkdeps rules.',
3263bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        error_descriptions))
3273bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  if warning_descriptions:
3283bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org    results.append(output_api.PresubmitPromptOrNotify(
3293bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        'You added one or more #includes of files that are temporarily\n'
3303bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        'allowed but being removed. Can you avoid introducing the\n'
3313bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        '#include? See relevant DEPS file(s) for details and contacts.',
3323bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org        warning_descriptions))
3333bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  return results
3343bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org
335e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
3368d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellanderdef _RunPythonTests(input_api, output_api):
3378d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  def join(*args):
3388d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander    return input_api.os_path.join(input_api.PresubmitLocalPath(), *args)
3398d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander
3408d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  test_directories = [
3418d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander    join('tools', 'autoroller', 'unittests'),
3428d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  ]
3438d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander
3448d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  tests = []
3458d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  for directory in test_directories:
3468d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander    tests.extend(
3478d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander      input_api.canned_checks.GetUnitTestsInDirectory(
3488d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander          input_api,
3498d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander          output_api,
3508d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander          directory,
3518d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander          whitelist=[r'.+_test\.py$']))
3528d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  return input_api.RunTests(tests, parallel=True)
3538d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander
3548d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander
35553df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.orgdef _CommonChecks(input_api, output_api):
35653df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  """Checks common to both upload and commit."""
357da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com  results = []
35842f580e490e8343a87362dbb20207380d850372ctkchin  # Filter out files that are in objc or ios dirs from being cpplint-ed since
35942f580e490e8343a87362dbb20207380d850372ctkchin  # they do not follow C++ lint rules.
36042f580e490e8343a87362dbb20207380d850372ctkchin  black_list = input_api.DEFAULT_BLACK_LIST + (
36142f580e490e8343a87362dbb20207380d850372ctkchin    r".*\bobjc[\\\/].*",
36242f580e490e8343a87362dbb20207380d850372ctkchin  )
36342f580e490e8343a87362dbb20207380d850372ctkchin  source_file_filter = lambda x: input_api.FilterSourceFile(x, None, black_list)
36442f580e490e8343a87362dbb20207380d850372ctkchin  results.extend(_CheckApprovedFilesLintClean(
36542f580e490e8343a87362dbb20207380d850372ctkchin      input_api, output_api, source_file_filter))
3665d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org  results.extend(input_api.canned_checks.RunPylint(input_api, output_api,
3675d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org      black_list=(r'^.*gviz_api\.py$',
3685d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org                  r'^.*gaeunit\.py$',
36933584f942c6e1723918d9d2b76f429ab8396751efischman@webrtc.org                  # Embedded shell-script fakes out pylint.
37014771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^build[\\\/].*\.py$',
37114771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^buildtools[\\\/].*\.py$',
37214771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^chromium[\\\/].*\.py$',
37314771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^google_apis[\\\/].*\.py$',
37414771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^net.*[\\\/].*\.py$',
37514771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^out.*[\\\/].*\.py$',
37614771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^testing[\\\/].*\.py$',
37714771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^third_party[\\\/].*\.py$',
37814771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]find_depot_tools.py$',
37914771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]clang[\\\/].*\.py$',
38014771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]generate_library_loader[\\\/].*\.py$',
38114771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]gn[\\\/].*\.py$',
38214771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]gyp[\\\/].*\.py$',
383d6d27e7340bca1598973e2197cf08d79ce9aeb04Henrik Kjellander                  r'^tools[\\\/]isolate_driver.py$',
38414771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]protoc_wrapper[\\\/].*\.py$',
38514771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]python[\\\/].*\.py$',
38614771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]python_charts[\\\/]data[\\\/].*\.py$',
38714771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]refactoring[\\\/].*\.py$',
38814771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]swarming_client[\\\/].*\.py$',
38914771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]vim[\\\/].*\.py$',
3905d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org                  # TODO(phoglund): should arguably be checked.
39114771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]valgrind-webrtc[\\\/].*\.py$',
39214771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]valgrind[\\\/].*\.py$',
39314771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^tools[\\\/]win[\\\/].*\.py$',
39414771ac6bfe0c66134425b99212f443f03231229Henrik Kjellander                  r'^xcodebuild.*[\\\/].*\.py$',),
3955d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org      disabled_warnings=['F0401',  # Failed to import x
3965d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org                         'E0611',  # No package y in x
3975d37139374178479c16956a2a4eefd231206c2a1phoglund@webrtc.org                         'W0232',  # Class has no __init__ method
39857e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander                        ],
39957e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander      pylintrc='pylintrc'))
40057e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander  # WebRTC can't use the presubmit_canned_checks.PanProjectChecks function since
40157e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander  # we need to have different license checks in talk/ and webrtc/ directories.
40257e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander  # Instead, hand-picked checks are included below.
403632246792fb208280a048fb2497a309c5a4d3690Henrik Kjellander
404632246792fb208280a048fb2497a309c5a4d3690Henrik Kjellander  # Skip long-lines check for DEPS, GN and GYP files.
405632246792fb208280a048fb2497a309c5a4d3690Henrik Kjellander  long_lines_sources = lambda x: input_api.FilterSourceFile(x,
406632246792fb208280a048fb2497a309c5a4d3690Henrik Kjellander      black_list=(r'.+\.gyp$', r'.+\.gypi$', r'.+\.gn$', r'.+\.gni$', 'DEPS'))
4072442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org  results.extend(input_api.canned_checks.CheckLongLines(
408632246792fb208280a048fb2497a309c5a4d3690Henrik Kjellander      input_api, output_api, maxlen=80, source_file_filter=long_lines_sources))
4092442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org  results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
4102442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org      input_api, output_api))
41153df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
41253df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org      input_api, output_api))
41353df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
41453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org      input_api, output_api))
41553047c9739989251cbe7090865411b1469b47f5dkjellander  results.extend(_CheckNativeApiHeaderChanges(input_api, output_api))
41651198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
41751198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
418e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org  results.extend(_CheckGypChanges(input_api, output_api))
4193bd4156d75b12c084026e8e31c12fd4b982374d3kjellander@webrtc.org  results.extend(_CheckUnwantedDependencies(input_api, output_api))
4208d3ad82d30f3634c49af07dad210449721b9d3d1Henrik Kjellander  results.extend(_RunPythonTests(input_api, output_api))
42153df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  return results
422da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com
423e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
42453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.orgdef CheckChangeOnUpload(input_api, output_api):
42553df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results = []
42653df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(_CommonChecks(input_api, output_api))
42757e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander  results.extend(
42857e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander      input_api.canned_checks.CheckGNFormatted(input_api, output_api))
4292442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.org  return results
430da159d6be61ae8041ab265092c2d6ba0ca7b64f5niklase@google.com
431e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
4322442de1351a8d9bee0912a09317122bb5bdb08bcandrew@webrtc.orgdef CheckChangeOnCommit(input_api, output_api):
4331198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com  results = []
43453df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(_CommonChecks(input_api, output_api))
43553047c9739989251cbe7090865411b1469b47f5dkjellander  results.extend(_VerifyNativeApiHeadersListIsValid(input_api, output_api))
4361198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com  results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
43753df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(input_api.canned_checks.CheckChangeWasUploaded(
43853df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org      input_api, output_api))
43953df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org  results.extend(input_api.canned_checks.CheckChangeHasDescription(
44053df136240bc78e8054085a2ef25c4240530a745andrew@webrtc.org      input_api, output_api))
44151198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  results.extend(input_api.canned_checks.CheckChangeHasBugField(
44251198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      input_api, output_api))
44351198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org  results.extend(input_api.canned_checks.CheckChangeHasTestField(
44451198f1c683cff50986fd043dc2185bb336fed99kjellander@webrtc.org      input_api, output_api))
44512cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org  results.extend(input_api.canned_checks.CheckTreeIsOpen(
44612cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org      input_api, output_api,
44712cb88cab9f3a1b4dbb60bebc4fc4fe6c705306ekjellander@webrtc.org      json_url='http://webrtc-status.appspot.com/current?format=json'))
4481198db9dd6017a286590ce3a7095b1deda7b94a9niklase@google.com  return results
4498575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org
450e415864a326ce48ff2d41d4c9a3faed26c033450kjellander@webrtc.org
4518575980e16b917b5d94e670a9c6da9029615b575kjellander@webrtc.org# pylint: disable=W0613
452c7b8b2f2a75f0620a978f3e7eff057780d49ed5ckjellander@webrtc.orgdef GetPreferredTryMasters(project, change):
453986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  cq_config_path = os.path.join(
45404465d286e6a1a643c88fabddd44eb870f906c38tandrii      change.RepositoryRoot(), 'infra', 'config', 'cq.cfg')
455986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  # commit_queue.py below is a script in depot_tools directory, which has a
456986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  # 'builders' command to retrieve a list of CQ builders from the CQ config.
457986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  is_win = platform.system() == 'Windows'
458986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  masters = json.loads(subprocess.check_output(
459986ee082b628ffd3a90fbbe4b933a312489921e0kjellander      ['commit_queue', 'builders', cq_config_path], shell=is_win))
460986ee082b628ffd3a90fbbe4b933a312489921e0kjellander
461986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  try_config = {}
462986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  for master in masters:
463986ee082b628ffd3a90fbbe4b933a312489921e0kjellander    try_config.setdefault(master, {})
464986ee082b628ffd3a90fbbe4b933a312489921e0kjellander    for builder in masters[master]:
465986ee082b628ffd3a90fbbe4b933a312489921e0kjellander      if 'presubmit' in builder:
466986ee082b628ffd3a90fbbe4b933a312489921e0kjellander        # Do not trigger presubmit builders, since they're likely to fail
467986ee082b628ffd3a90fbbe4b933a312489921e0kjellander        # (e.g. OWNERS checks before finished code review), and we're running
468986ee082b628ffd3a90fbbe4b933a312489921e0kjellander        # local presubmit anyway.
469986ee082b628ffd3a90fbbe4b933a312489921e0kjellander        pass
470986ee082b628ffd3a90fbbe4b933a312489921e0kjellander      else:
471986ee082b628ffd3a90fbbe4b933a312489921e0kjellander        try_config[master][builder] = ['defaulttests']
472986ee082b628ffd3a90fbbe4b933a312489921e0kjellander
473986ee082b628ffd3a90fbbe4b933a312489921e0kjellander  return try_config
474