aboutsummaryrefslogtreecommitdiff
path: root/PRESUBMIT.py
diff options
context:
space:
mode:
Diffstat (limited to 'PRESUBMIT.py')
-rwxr-xr-xPRESUBMIT.py218
1 files changed, 117 insertions, 101 deletions
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index dafbc5ea..07d567c5 100755
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -2,7 +2,21 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import os
import re
+import sys
+
+_REPO_PATH = os.path.dirname(os.path.realpath('__file__'))
+_IMPORT_SUBFOLDERS = ['tools', os.path.join('buildtools', 'checkdeps')]
+
+# git-cl upload is not compatible with __init__.py based subfolder imports, so
+# we extend the system path instead.
+sys.path.extend(os.path.join(_REPO_PATH, p) for p in _IMPORT_SUBFOLDERS)
+
+import licenses
+from checkdeps import DepsChecker
+from cpp_checker import CppChecker
+from rules import Rule
# Rather than pass this to all of the checks, we override the global excluded
# list with this one.
@@ -22,25 +36,19 @@ _EXCLUDED_PATHS = (
)
+def _CheckLicenses(input_api, output_api):
+ """Checks third party licenses and returns a list of violations."""
+ return [
+ output_api.PresubmitError(v) for v in licenses.ScanThirdPartyDirs()
+ ]
+
+
def _CheckDeps(input_api, output_api):
- results = []
- import sys
- original_sys_path = sys.path
- try:
- sys.path = sys.path + [input_api.os_path.join(
- input_api.PresubmitLocalPath(), 'buildtools', 'checkdeps')]
- import checkdeps
- from cpp_checker import CppChecker
- from rules import Rule
- finally:
- sys.path = original_sys_path
-
- deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath())
- deps_checker.CheckDirectory(input_api.PresubmitLocalPath())
- deps_results = deps_checker.results_formatter.GetResults()
- for violation in deps_results:
- results.append(output_api.PresubmitError(violation))
- return results
+ """Checks DEPS rules and returns a list of violations."""
+ deps_checker = DepsChecker(input_api.PresubmitLocalPath())
+ deps_checker.CheckDirectory(input_api.PresubmitLocalPath())
+ deps_results = deps_checker.results_formatter.GetResults()
+ return [output_api.PresubmitError(v) for v in deps_results]
# Matches Foo(Foo&&) when not followed by noexcept.
@@ -49,7 +57,7 @@ _RE_PATTERN_MOVE_WITHOUT_NOEXCEPT = re.compile(
def _CheckNoexceptOnMove(filename, clean_lines, linenum, error):
- """Checks that move constructors are declared with 'noexcept'.
+ """Checks that move constructors are declared with 'noexcept'.
Args:
filename: The name of the current file.
@@ -57,17 +65,19 @@ def _CheckNoexceptOnMove(filename, clean_lines, linenum, error):
linenum: The number of the line to check.
error: The function to call with any errors found.
"""
- # We only check headers as noexcept is meaningful on declarations, not
- # definitions. This may skip some definitions in .cc files though.
- if not filename.endswith('.h'):
- return
-
- line = clean_lines.elided[linenum]
- matched = _RE_PATTERN_MOVE_WITHOUT_NOEXCEPT.match(line)
- if matched:
- error(filename, linenum, 'runtime/noexcept', 4,
- 'Move constructor of %s not declared \'noexcept\' in %s' %
- (matched.group('classname'), matched.group(0).strip()))
+ # We only check headers as noexcept is meaningful on declarations, not
+ # definitions. This may skip some definitions in .cc files though.
+ if not filename.endswith('.h'):
+ return
+
+ line = clean_lines.elided[linenum]
+ matched = _RE_PATTERN_MOVE_WITHOUT_NOEXCEPT.match(line)
+ if matched:
+ error(
+ filename, linenum, 'runtime/noexcept', 4,
+ 'Move constructor of {} not declared \'noexcept\' in {}'.format(
+ matched.group('classname'),
+ matched.group(0).strip()))
# - We disable c++11 header checks since Open Screen allows them.
# - We disable whitespace/braces because of various false positives.
@@ -75,83 +85,89 @@ def _CheckNoexceptOnMove(filename, clean_lines, linenum, error):
# enough to keep.
# - We add a custom check for 'noexcept' usage.
def _CheckChangeLintsClean(input_api, output_api):
- """Checks that all '.cc' and '.h' files pass cpplint.py."""
- result = []
-
- cpplint = input_api.cpplint
- # Access to a protected member _XX of a client class
- # pylint: disable=protected-access
- cpplint._cpplint_state.ResetErrorCounts()
-
- cpplint._SetFilters('-build/c++11,-whitespace/braces')
- files = [f.AbsoluteLocalPath() for f in input_api.AffectedSourceFiles(None)]
- for file_name in files:
- # 4 = verbose_level
- cpplint.ProcessFile(file_name, 4, [_CheckNoexceptOnMove])
-
- if cpplint._cpplint_state.error_count > 0:
- if input_api.is_committing:
- res_type = output_api.PresubmitError
- else:
- res_type = output_api.PresubmitPromptWarning
- result = [res_type('Changelist failed cpplint.py check.')]
-
- return result
+ """Checks that all '.cc' and '.h' files pass cpplint.py."""
+ cpplint = input_api.cpplint
+ # Access to a protected member _XX of a client class
+ # pylint: disable=protected-access
+ cpplint._cpplint_state.ResetErrorCounts()
+
+ cpplint._SetFilters('-build/c++11,-whitespace/braces')
+ files = [
+ f.AbsoluteLocalPath() for f in input_api.AffectedSourceFiles(None)
+ ]
+ CPPLINT_VERBOSE_LEVEL = 4
+ for file_name in files:
+ cpplint.ProcessFile(file_name, CPPLINT_VERBOSE_LEVEL,
+ [_CheckNoexceptOnMove])
+
+ if cpplint._cpplint_state.error_count:
+ if input_api.is_committing:
+ res_type = output_api.PresubmitError
+ else:
+ res_type = output_api.PresubmitPromptWarning
+ return [res_type('Changelist failed cpplint.py check.')]
+
+ return []
def _CommonChecks(input_api, output_api):
- results = []
- # PanProjectChecks include:
- # CheckLongLines (@ 80 cols)
- # CheckChangeHasNoTabs
- # CheckChangeHasNoStrayWhitespace
- # CheckLicense
- # CheckChangeWasUploaded (if committing)
- # CheckChangeHasDescription
- # CheckDoNotSubmitInDescription
- # CheckDoNotSubmitInFiles
- results.extend(input_api.canned_checks.PanProjectChecks(
- input_api, output_api, owners_check=False));
-
- # No carriage return characters, files end with one EOL (\n).
- results.extend(input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
- input_api, output_api));
-
- # Gender inclusivity
- results.extend(input_api.canned_checks.CheckGenderNeutral(
- input_api, output_api))
-
- # TODO(bug) format required
- results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
- input_api, output_api))
-
- # Linter.
- results.extend(_CheckChangeLintsClean(input_api, output_api))
-
- # clang-format
- results.extend(input_api.canned_checks.CheckPatchFormatted(
- input_api, output_api, bypass_warnings=False))
-
- # GN formatting
- results.extend(input_api.canned_checks.CheckGNFormatted(
- input_api, output_api))
-
- # buildtools/checkdeps
- results.extend(_CheckDeps(input_api, output_api))
- return results
+ # PanProjectChecks include:
+ # CheckLongLines (@ 80 cols)
+ # CheckChangeHasNoTabs
+ # CheckChangeHasNoStrayWhitespace
+ # CheckLicense
+ # CheckChangeWasUploaded (if committing)
+ # CheckChangeHasDescription
+ # CheckDoNotSubmitInDescription
+ # CheckDoNotSubmitInFiles
+ results = input_api.canned_checks.PanProjectChecks(input_api,
+ output_api,
+ owners_check=False)
+
+ # No carriage return characters, files end with one EOL (\n).
+ results.extend(
+ input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
+ input_api, output_api))
+
+ # Gender inclusivity
+ results.extend(
+ input_api.canned_checks.CheckGenderNeutral(input_api, output_api))
+
+ # TODO(bug) format required
+ results.extend(
+ input_api.canned_checks.CheckChangeTodoHasOwner(input_api, output_api))
+
+ # Linter.
+ results.extend(_CheckChangeLintsClean(input_api, output_api))
+
+ # clang-format
+ results.extend(
+ input_api.canned_checks.CheckPatchFormatted(input_api,
+ output_api,
+ bypass_warnings=False))
+
+ # GN formatting
+ results.extend(
+ input_api.canned_checks.CheckGNFormatted(input_api, output_api))
+
+ # buildtools/checkdeps
+ results.extend(_CheckDeps(input_api, output_api))
+
+ # tools/licenses
+ results.extend(_CheckLicenses(input_api, output_api))
+
+ return results
def CheckChangeOnUpload(input_api, output_api):
- input_api.DEFAULT_FILES_TO_SKIP = _EXCLUDED_PATHS;
- results = []
- results.extend(_CommonChecks(input_api, output_api))
- results.extend(
- input_api.canned_checks.CheckChangedLUCIConfigs(input_api, output_api))
- return results
+ input_api.DEFAULT_FILES_TO_SKIP = _EXCLUDED_PATHS
+ # We always run the OnCommit checks, as well as some additional checks.
+ results = CheckChangeOnCommit(input_api, output_api)
+ results.extend(
+ input_api.canned_checks.CheckChangedLUCIConfigs(input_api, output_api))
+ return results
def CheckChangeOnCommit(input_api, output_api):
- input_api.DEFAULT_FILES_TO_SKIP = _EXCLUDED_PATHS;
- results = []
- results.extend(_CommonChecks(input_api, output_api))
- return results
+ input_api.DEFAULT_FILES_TO_SKIP = _EXCLUDED_PATHS
+ return _CommonChecks(input_api, output_api)