summaryrefslogtreecommitdiffstats
path: root/googleurl/PRESUBMIT.py
diff options
context:
space:
mode:
Diffstat (limited to 'googleurl/PRESUBMIT.py')
-rw-r--r--googleurl/PRESUBMIT.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/googleurl/PRESUBMIT.py b/googleurl/PRESUBMIT.py
new file mode 100644
index 0000000..6cfbe74
--- /dev/null
+++ b/googleurl/PRESUBMIT.py
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Top-level presubmit script for googleurl.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
+details on the presubmit API built into gcl.
+"""
+
+# Files with these extensions will be considered source files
+SOURCE_FILE_EXTENSIONS = [
+ '.c', '.cc', '.cpp', '.h', '.m', '.mm', '.py', '.mk', '.am', '.json',
+]
+EXCLUDED_PATHS = [
+ r".*third_party[\\\/].*",
+]
+
+def ReadFile(path):
+ """Given a path, returns the full contents of the file.
+
+ Reads files in binary format.
+ """
+ fo = open(path, 'rb')
+ try:
+ contents = fo.read()
+ finally:
+ fo.close()
+ return contents
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ # TODO(brettw) Enforce 80 cols.
+ return LocalChecks(input_api, output_api, max_cols=0)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ # TODO(brettw) Enforce 80 cols.
+ return (LocalChecks(input_api, output_api, max_cols=0) +
+ input_api.canned_checks.CheckDoNotSubmit(input_api, output_api))
+
+
+def LocalChecks(input_api, output_api, max_cols=80):
+ """Reports an error if for any source file in SOURCE_FILE_EXTENSIONS:
+ - uses CR (or CRLF)
+ - contains a TAB
+ - has a line that ends with whitespace
+ - contains a line >|max_cols| cols unless |max_cols| is 0.
+
+ Note that the whole file is checked, not only the changes.
+ """
+ cr_files = []
+ results = []
+ excluded_paths = [input_api.re.compile(x) for x in EXCLUDED_PATHS]
+ files = input_api.AffectedFiles()
+ for f in files:
+ path = f.LocalPath()
+ root, ext = input_api.os_path.splitext(path)
+ # Look for unsupported extensions.
+ if not ext in SOURCE_FILE_EXTENSIONS:
+ continue
+ # Look for excluded paths.
+ found = False
+ for item in excluded_paths:
+ if item.match(path):
+ found = True
+ break
+ if found:
+ continue
+
+ # Need to read the file ourselves since AffectedFile.NewContents()
+ # will normalize line endings.
+ contents = ReadFile(path)
+ if '\r' in contents:
+ cr_files.append(path)
+
+ local_errors = []
+ # Remove EOL character.
+ lines = contents.splitlines()
+ line_num = 1
+ for line in lines:
+ if line.endswith(' '):
+ local_errors.append(output_api.PresubmitError(
+ '%s, line %s ends with whitespaces.' %
+ (path, line_num)))
+ # Accept lines with http:// to exceed the max_cols rule.
+ if max_cols and len(line) > max_cols and not 'http://' in line:
+ local_errors.append(output_api.PresubmitError(
+ '%s, line %s has %s chars, please reduce to %d chars.' %
+ (path, line_num, len(line), max_cols)))
+ if '\t' in line:
+ local_errors.append(output_api.PresubmitError(
+ "%s, line %s contains a tab character." %
+ (path, line_num)))
+ line_num += 1
+ # Just show the first 5 errors.
+ if len(local_errors) == 6:
+ local_errors.pop()
+ local_errors.append(output_api.PresubmitError("... and more."))
+ break
+ results.extend(local_errors)
+
+ if cr_files:
+ results.append(output_api.PresubmitError(
+ 'Found CR (or CRLF) line ending in these files, please use only LF:',
+ items=cr_files))
+ return results