Add presubmit check for changes in 3pp
Presubmit check will test will new changes be overriden by autoroll or not. In more details presubmit will check: 1. Each dependency in third_party have to be specified in one of: a. THIRD_PARTY_CHROMIUM_DEPS.json b. THIRD_PARTY_WEBRTC_DEPS.json 2. Each dependency not specified in both files from #1 3. Changes won't be overriden by chromium third_party deps autoroll: a. Changes were made in WebRTC owned dependency b. Changes were addition of new Chromium owned dependency Bug: webrtc:8366 Change-Id: Ic5db24289e7fa461e0959f75cfbe81ecc65af4b5 Reviewed-on: https://webrtc-review.googlesource.com/77421 Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Commit-Queue: Artem Titov <titovartem@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23301}
This commit is contained in:
37
PRESUBMIT.py
37
PRESUBMIT.py
@ -13,7 +13,6 @@ import sys
|
||||
from collections import defaultdict
|
||||
from contextlib import contextmanager
|
||||
|
||||
|
||||
# Files and directories that are *skipped* by cpplint in the presubmit script.
|
||||
CPPLINT_BLACKLIST = [
|
||||
'api/video_codecs/video_decoder.h',
|
||||
@ -140,6 +139,7 @@ def VerifyNativeApiHeadersListIsValid(input_api, output_api):
|
||||
non_existing_paths)]
|
||||
return []
|
||||
|
||||
|
||||
API_CHANGE_MSG = """
|
||||
You seem to be changing native API header files. Please make sure that you:
|
||||
1. Make compatible changes that don't break existing clients. Usually
|
||||
@ -159,6 +159,7 @@ You seem to be changing native API header files. Please make sure that you:
|
||||
Related files:
|
||||
"""
|
||||
|
||||
|
||||
def CheckNativeApiHeaderChanges(input_api, output_api):
|
||||
"""Checks to remind proper changing of native APIs."""
|
||||
files = []
|
||||
@ -288,7 +289,7 @@ def CheckApprovedFilesLintClean(input_api, output_api,
|
||||
for f in input_api.AffectedSourceFiles(source_file_filter):
|
||||
# Note that moved/renamed files also count as added.
|
||||
if f.Action() == 'A' or not IsLintBlacklisted(blacklist_paths,
|
||||
f.LocalPath()):
|
||||
f.LocalPath()):
|
||||
files.append(f.AbsoluteLocalPath())
|
||||
|
||||
for file_name in files:
|
||||
@ -303,6 +304,7 @@ def CheckApprovedFilesLintClean(input_api, output_api,
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def CheckNoSourcesAbove(input_api, gn_files, output_api):
|
||||
# Disallow referencing source files with paths above the GN file location.
|
||||
source_pattern = input_api.re.compile(r' +sources \+?= \[(.*?)\]',
|
||||
@ -331,11 +333,13 @@ def CheckNoSourcesAbove(input_api, gn_files, output_api):
|
||||
items=violating_gn_files)]
|
||||
return []
|
||||
|
||||
|
||||
def CheckNoMixingSources(input_api, gn_files, output_api):
|
||||
"""Disallow mixing C, C++ and Obj-C/Obj-C++ in the same target.
|
||||
|
||||
See bugs.webrtc.org/7743 for more context.
|
||||
"""
|
||||
|
||||
def _MoreThanOneSourceUsed(*sources_lists):
|
||||
sources_used = 0
|
||||
for source_list in sources_lists:
|
||||
@ -397,6 +401,7 @@ def CheckNoMixingSources(input_api, gn_files, output_api):
|
||||
'\n'.join(errors.keys())))]
|
||||
return []
|
||||
|
||||
|
||||
def CheckNoPackageBoundaryViolations(input_api, gn_files, output_api):
|
||||
cwd = input_api.PresubmitLocalPath()
|
||||
with _AddToPath(input_api.os_path.join(
|
||||
@ -456,6 +461,7 @@ def CheckNoStreamUsageIsAdded(input_api, output_api,
|
||||
return [output_api.PresubmitError(error_msg, errors)]
|
||||
return []
|
||||
|
||||
|
||||
def CheckPublicDepsIsNotUsed(gn_files, input_api, output_api):
|
||||
"""Checks that public_deps is not used without a good reason."""
|
||||
result = []
|
||||
@ -477,6 +483,7 @@ def CheckPublicDepsIsNotUsed(gn_files, input_api, output_api):
|
||||
line_number)))
|
||||
return result
|
||||
|
||||
|
||||
def CheckCheckIncludesIsNotUsed(gn_files, output_api):
|
||||
result = []
|
||||
error_msg = ('check_includes overrides are not allowed since it can cause '
|
||||
@ -494,6 +501,7 @@ def CheckCheckIncludesIsNotUsed(gn_files, output_api):
|
||||
line_number)))
|
||||
return result
|
||||
|
||||
|
||||
def CheckGnChanges(input_api, output_api, source_file_filter):
|
||||
file_filter = lambda x: (input_api.FilterSourceFile(
|
||||
x, white_list=(r'.+\.(gn|gni)$',),
|
||||
@ -514,6 +522,7 @@ def CheckGnChanges(input_api, output_api, source_file_filter):
|
||||
result.extend(CheckCheckIncludesIsNotUsed(gn_files, output_api))
|
||||
return result
|
||||
|
||||
|
||||
def CheckGnGen(input_api, output_api):
|
||||
"""Runs `gn gen --check` with default args to detect mismatches between
|
||||
#includes and dependencies in the BUILD.gn files, as well as general build
|
||||
@ -530,6 +539,7 @@ def CheckGnGen(input_api, output_api):
|
||||
long_text='\n\n'.join(errors))]
|
||||
return []
|
||||
|
||||
|
||||
def CheckUnwantedDependencies(input_api, output_api, source_file_filter):
|
||||
"""Runs checkdeps on #include statements added in this
|
||||
change. Breaking - rules is an error, breaking ! rules is a
|
||||
@ -589,6 +599,7 @@ def CheckUnwantedDependencies(input_api, output_api, source_file_filter):
|
||||
warning_descriptions))
|
||||
return results
|
||||
|
||||
|
||||
def CheckCommitMessageBugEntry(input_api, output_api):
|
||||
"""Check that bug entries are well-formed in commit message."""
|
||||
bogus_bug_msg = (
|
||||
@ -614,6 +625,7 @@ def CheckCommitMessageBugEntry(input_api, output_api):
|
||||
results.append(bogus_bug_msg % bug)
|
||||
return [output_api.PresubmitError(r) for r in results]
|
||||
|
||||
|
||||
def CheckChangeHasBugField(input_api, output_api):
|
||||
"""Requires that the changelist is associated with a bug.
|
||||
|
||||
@ -633,6 +645,7 @@ def CheckChangeHasBugField(input_api, output_api):
|
||||
' * https://bugs.webrtc.org - reference it using Bug: webrtc:XXXX\n'
|
||||
' * https://crbug.com - reference it using Bug: chromium:XXXXXX')]
|
||||
|
||||
|
||||
def CheckJSONParseErrors(input_api, output_api, source_file_filter):
|
||||
"""Check that JSON files do not contain syntax errors."""
|
||||
|
||||
@ -655,7 +668,8 @@ def CheckJSONParseErrors(input_api, output_api, source_file_filter):
|
||||
affected_file.AbsoluteLocalPath())
|
||||
if parse_error:
|
||||
results.append(output_api.PresubmitError('%s could not be parsed: %s' %
|
||||
(affected_file.LocalPath(), parse_error)))
|
||||
(affected_file.LocalPath(),
|
||||
parse_error)))
|
||||
return results
|
||||
|
||||
|
||||
@ -778,14 +792,14 @@ def CommonChecks(input_api, output_api):
|
||||
third_party_filter_list)
|
||||
hundred_char_sources = lambda x: input_api.FilterSourceFile(x,
|
||||
white_list=objc_filter_list)
|
||||
non_third_party_sources = lambda x: input_api.FilterSourceFile(x,
|
||||
black_list=third_party_filter_list)
|
||||
|
||||
results.extend(input_api.canned_checks.CheckLongLines(
|
||||
input_api, output_api, maxlen=80, source_file_filter=eighty_char_sources))
|
||||
results.extend(input_api.canned_checks.CheckLongLines(
|
||||
input_api, output_api, maxlen=100,
|
||||
source_file_filter=hundred_char_sources))
|
||||
|
||||
non_third_party_sources = lambda x: input_api.FilterSourceFile(x,
|
||||
black_list=third_party_filter_list)
|
||||
results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
|
||||
input_api, output_api, source_file_filter=non_third_party_sources))
|
||||
results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
|
||||
@ -816,9 +830,17 @@ def CommonChecks(input_api, output_api):
|
||||
input_api, output_api, source_file_filter=non_third_party_sources))
|
||||
results.extend(CheckNoStreamUsageIsAdded(
|
||||
input_api, output_api, non_third_party_sources))
|
||||
results.extend(CheckThirdPartyChanges(input_api, output_api))
|
||||
return results
|
||||
|
||||
|
||||
def CheckThirdPartyChanges(input_api, output_api):
|
||||
with _AddToPath(input_api.os_path.join(
|
||||
input_api.PresubmitLocalPath(), 'tools_webrtc', 'presubmit_checks_lib')):
|
||||
from check_3pp import CheckThirdPartyDirectory
|
||||
return CheckThirdPartyDirectory(input_api, output_api)
|
||||
|
||||
|
||||
def CheckChangeOnUpload(input_api, output_api):
|
||||
results = []
|
||||
results.extend(CommonChecks(input_api, output_api))
|
||||
@ -874,8 +896,7 @@ def CheckOrphanHeaders(input_api, output_api, source_file_filter):
|
||||
return results
|
||||
|
||||
|
||||
def CheckNewlineAtTheEndOfProtoFiles(input_api, output_api,
|
||||
source_file_filter):
|
||||
def CheckNewlineAtTheEndOfProtoFiles(input_api, output_api, source_file_filter):
|
||||
"""Checks that all .proto files are terminated with a newline."""
|
||||
error_msg = 'File {} must end with exactly one newline.'
|
||||
results = []
|
||||
|
Reference in New Issue
Block a user