2012-01-23 18:45:41 +01:00
|
|
|
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
|
|
#
|
|
|
|
# Use of this source code is governed by a BSD-style license
|
|
|
|
# that can be found in the LICENSE file in the root of the source
|
|
|
|
# tree. An additional intellectual property rights grant can be found
|
|
|
|
# in the file PATENTS. All contributing project authors may
|
|
|
|
# be found in the AUTHORS file in the root of the source tree.
|
2011-05-30 13:51:34 +02:00
|
|
|
|
2012-01-26 22:24:23 +01:00
|
|
|
def _LicenseHeader(input_api):
|
|
|
|
"""Returns the license header regexp."""
|
|
|
|
license_header = (
|
2012-01-23 18:45:41 +01:00
|
|
|
r'.*? Copyright \(c\) %(year)s The WebRTC project authors\. '
|
|
|
|
r'All Rights Reserved\.\n'
|
|
|
|
r'.*?\n'
|
|
|
|
r'.*? Use of this source code is governed by a BSD-style license\n'
|
2011-05-30 13:51:34 +02:00
|
|
|
r'.*? that can be found in the LICENSE file in the root of the source\n'
|
2012-01-23 18:45:41 +01:00
|
|
|
r'.*? tree\. An additional intellectual property rights grant can be '
|
|
|
|
r'found\n'
|
|
|
|
r'.*? in the file PATENTS\. All contributing project authors may\n'
|
|
|
|
r'.*? be found in the AUTHORS file in the root of the source tree\.\n'
|
|
|
|
) % {
|
|
|
|
'year': input_api.time.strftime('%Y'),
|
|
|
|
}
|
2012-01-26 22:24:23 +01:00
|
|
|
return license_header
|
2011-05-30 13:51:34 +02:00
|
|
|
|
2012-02-21 18:53:46 +01:00
|
|
|
def _CheckNoIOStreamInHeaders(input_api, output_api):
|
|
|
|
"""Checks to make sure no .h files include <iostream>."""
|
|
|
|
files = []
|
|
|
|
pattern = input_api.re.compile(r'^#include\s*<iostream>',
|
|
|
|
input_api.re.MULTILINE)
|
|
|
|
for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile):
|
|
|
|
if not f.LocalPath().endswith('.h'):
|
|
|
|
continue
|
|
|
|
contents = input_api.ReadFile(f)
|
|
|
|
if pattern.search(contents):
|
|
|
|
files.append(f)
|
|
|
|
|
|
|
|
if len(files):
|
|
|
|
return [ output_api.PresubmitError(
|
|
|
|
'Do not #include <iostream> in header files, since it inserts static ' +
|
|
|
|
'initialization into every file including the header. Instead, ' +
|
|
|
|
'#include <ostream>. See http://crbug.com/94794',
|
|
|
|
files) ]
|
|
|
|
return []
|
|
|
|
|
|
|
|
def _CheckNoFRIEND_TEST(input_api, output_api):
|
|
|
|
"""Make sure that gtest's FRIEND_TEST() macro is not used, the
|
|
|
|
FRIEND_TEST_ALL_PREFIXES() macro from testsupport/gtest_prod_util.h should be
|
|
|
|
used instead since that allows for FLAKY_, FAILS_ and DISABLED_ prefixes."""
|
|
|
|
problems = []
|
|
|
|
|
|
|
|
file_filter = lambda f: f.LocalPath().endswith(('.cc', '.h'))
|
|
|
|
for f in input_api.AffectedFiles(file_filter=file_filter):
|
|
|
|
for line_num, line in f.ChangedContents():
|
|
|
|
if 'FRIEND_TEST(' in line:
|
|
|
|
problems.append(' %s:%d' % (f.LocalPath(), line_num))
|
|
|
|
|
|
|
|
if not problems:
|
|
|
|
return []
|
|
|
|
return [output_api.PresubmitPromptWarning('WebRTC\'s code should not use '
|
|
|
|
'gtest\'s FRIEND_TEST() macro. Include testsupport/gtest_prod_util.h and '
|
|
|
|
'use FRIEND_TEST_ALL_PREFIXES() instead.\n' + '\n'.join(problems))]
|
|
|
|
|
|
|
|
def _CheckNewFilesLintClean(input_api, output_api, source_file_filter=None):
|
|
|
|
"""Checks that all NEW '.cc' and '.h' files pass cpplint.py.
|
|
|
|
This check is based on _CheckChangeLintsClean in
|
|
|
|
depot_tools/presubmit_canned_checks.py but has less filters and only checks
|
|
|
|
added files."""
|
|
|
|
result = []
|
|
|
|
|
|
|
|
# Initialize cpplint.
|
|
|
|
import cpplint
|
|
|
|
# Access to a protected member _XX of a client class
|
|
|
|
# pylint: disable=W0212
|
|
|
|
cpplint._cpplint_state.ResetErrorCounts()
|
|
|
|
|
|
|
|
# Justifications for each filter:
|
|
|
|
#
|
|
|
|
# - build/header_guard : WebRTC coding style says they should be prefixed
|
|
|
|
# with WEBRTC_, which is not possible to configure in
|
|
|
|
# cpplint.py.
|
|
|
|
cpplint._SetFilters('-build/header_guard')
|
|
|
|
|
|
|
|
# Use the strictest verbosity level for cpplint.py (level 1) which is the
|
|
|
|
# default when running cpplint.py from command line.
|
|
|
|
# To make it possible to work with not-yet-converted code, we're only applying
|
|
|
|
# it to new (or moved/renamed) files.
|
|
|
|
verbosity_level = 1
|
|
|
|
files = []
|
|
|
|
for f in input_api.AffectedSourceFiles(source_file_filter):
|
|
|
|
# Note that moved/renamed files also count as added for svn.
|
|
|
|
if (f.Action() == 'A'):
|
|
|
|
files.append(f.AbsoluteLocalPath())
|
|
|
|
for file_name in files:
|
|
|
|
cpplint.ProcessFile(file_name, verbosity_level)
|
|
|
|
|
|
|
|
if cpplint._cpplint_state.error_count > 0:
|
|
|
|
if input_api.is_committing:
|
|
|
|
# TODO(kjellander): Change back to PresubmitError below when we're
|
|
|
|
# confident with the lint settings.
|
|
|
|
res_type = output_api.PresubmitPromptWarning
|
|
|
|
else:
|
|
|
|
res_type = output_api.PresubmitPromptWarning
|
|
|
|
result = [res_type('Changelist failed cpplint.py check.')]
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
2012-01-26 22:24:23 +01:00
|
|
|
def _CommonChecks(input_api, output_api):
|
|
|
|
"""Checks common to both upload and commit."""
|
2012-02-21 18:53:46 +01:00
|
|
|
# TODO(kjellander): Use presubmit_canned_checks.PanProjectChecks too.
|
2011-05-30 13:51:34 +02:00
|
|
|
results = []
|
2012-01-23 18:45:41 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckLongLines(
|
2012-01-26 22:24:23 +01:00
|
|
|
input_api, output_api))
|
2012-01-23 18:45:41 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
|
|
|
|
input_api, output_api))
|
2012-01-26 22:24:23 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
|
|
|
|
input_api, output_api))
|
|
|
|
results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
|
|
|
|
input_api, output_api))
|
2012-02-21 18:53:46 +01:00
|
|
|
results.extend(_CheckNewFilesLintClean(input_api, output_api))
|
2012-01-23 18:45:41 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckLicense(
|
2012-01-26 22:24:23 +01:00
|
|
|
input_api, output_api, _LicenseHeader(input_api)))
|
2012-02-21 18:53:46 +01:00
|
|
|
results.extend(_CheckNoIOStreamInHeaders(input_api, output_api))
|
|
|
|
results.extend(_CheckNoFRIEND_TEST(input_api, output_api))
|
2012-01-26 22:24:23 +01:00
|
|
|
return results
|
2011-05-30 13:51:34 +02:00
|
|
|
|
2012-01-26 22:24:23 +01:00
|
|
|
def CheckChangeOnUpload(input_api, output_api):
|
|
|
|
results = []
|
|
|
|
results.extend(_CommonChecks(input_api, output_api))
|
2012-01-23 18:45:41 +01:00
|
|
|
return results
|
2011-05-30 13:51:34 +02:00
|
|
|
|
2012-01-23 18:45:41 +01:00
|
|
|
def CheckChangeOnCommit(input_api, output_api):
|
2011-06-09 09:07:24 +02:00
|
|
|
results = []
|
2012-01-26 22:24:23 +01:00
|
|
|
results.extend(_CommonChecks(input_api, output_api))
|
2011-06-09 09:07:24 +02:00
|
|
|
results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
|
2012-01-26 22:24:23 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckChangeWasUploaded(
|
|
|
|
input_api, output_api))
|
|
|
|
results.extend(input_api.canned_checks.CheckChangeHasDescription(
|
|
|
|
input_api, output_api))
|
2012-02-21 18:53:46 +01:00
|
|
|
results.extend(input_api.canned_checks.CheckChangeHasBugField(
|
|
|
|
input_api, output_api))
|
|
|
|
results.extend(input_api.canned_checks.CheckChangeHasTestField(
|
|
|
|
input_api, output_api))
|
2011-06-09 09:07:24 +02:00
|
|
|
return results
|