Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Unified Diff: PRESUBMIT.py

Issue 341193004: Add lots of utils, PRESUBMIT.py (Closed) Base URL: https://skia.googlesource.com/common.git@master
Patch Set: Address comments Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « .gitignore ('k') | __init__.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: PRESUBMIT.py
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a5ca44611d84425d546f67d0d5e4e08aa447c12
--- /dev/null
+++ b/PRESUBMIT.py
@@ -0,0 +1,141 @@
+# Copyright (c) 2014 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.
+
+
+"""Presubmit checks for common code."""
+
+import os
+import subprocess
+import sys
+
+
+SKIA_TREE_STATUS_URL = 'http://skia-tree-status.appspot.com'
+SKIP_RUNS_KEYWORD = '(SkipBuildbotRuns)'
+
+
+def _RunPyUnitTests(input_api, output_api):
+ """ Run the Python unit tests and return a list of strings containing any
+ errors.
+ """
+ results = []
+ success = True
+ try:
+ proc = subprocess.Popen(['python', os.path.join('py', 'run_unittests')],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ success = proc.wait() == 0
+ long_text = proc.communicate()[0]
+ except Exception:
+ success = False
+ long_text = 'Failed to run the common tests!'
+ if not success:
+ results.append(output_api.PresubmitPromptWarning(
+ message='One or more unit tests failed.',
+ long_text=long_text))
+ return results
+
+
+def CheckChange(input_api, output_api):
+ """Presubmit checks for the change on upload or commit.
+
+ The presubmit checks have been handpicked from the list of canned checks
+ here:
+ https://chromium.googlesource.com/chromium/tools/depot_tools/+/master/presubmit_canned_checks.py
+
+ The following are the presubmit checks:
+ * Pylint is run if the change contains any .py files.
+ * Enforces max length for all lines is 80.
+ * Checks that the user didn't add TODO(name) without an owner.
+ * Checks that there is no stray whitespace at source lines end.
+ * Checks that there are no tab characters in any of the text files.
+ """
+ results = []
+
+ pylint_disabled_warnings = (
+ 'F0401', # Unable to import.
+ 'E0611', # No name in module.
+ 'W0232', # Class has no __init__ method.
+ 'E1002', # Use of super on an old style class.
+ 'W0403', # Relative import used.
+ 'R0201', # Method could be a function.
+ 'E1003', # Using class name in super.
+ 'W0613', # Unused argument.
+ )
+ # Run Pylint on only the modified python files. Unfortunately it still runs
+ # Pylint on the whole file instead of just the modified lines.
+ affected_python_files = []
+ for affected_file in input_api.AffectedSourceFiles(None):
+ affected_file_path = affected_file.LocalPath()
+ if affected_file_path.endswith('.py'):
+ affected_python_files.append(affected_file_path)
+ results += input_api.canned_checks.RunPylint(
+ input_api, output_api,
+ disabled_warnings=pylint_disabled_warnings,
+ white_list=affected_python_files)
+
+ # Use 100 for max length for files other than python. Python length is
+ # already checked during the Pylint above.
+ results += input_api.canned_checks.CheckLongLines(input_api, output_api, 100)
+ results += input_api.canned_checks.CheckChangeTodoHasOwner(
+ input_api, output_api)
+ results += input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
+ input_api, output_api)
+ results += input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api)
+
+ results += _RunPyUnitTests(input_api, output_api)
+
+ return results
+
+
+def _CheckTreeStatus(input_api, output_api, json_url):
+ """Check whether to allow commit.
+
+ Args:
+ input_api: input related apis.
+ output_api: output related apis.
+ json_url: url to download json style status.
+ """
+ results = []
+ tree_status_results = input_api.canned_checks.CheckTreeIsOpen(
+ input_api, output_api, json_url=json_url)
+ display_skip_keyword_prompt = False
+ tree_status = None
+ if not tree_status_results:
+ # Check for caution state only if tree is not closed.
+ connection = input_api.urllib2.urlopen(json_url)
+ status = input_api.json.loads(connection.read())
+ connection.close()
+ tree_status = status['message']
+ if 'caution' in tree_status.lower():
+ # Display a prompt only if we are in an interactive shell. Without this
+ # check the commit queue behaves incorrectly because it considers
+ # prompts to be failures.
+ display_skip_keyword_prompt = True
+ else:
+ # pylint: disable=W0212
+ tree_status = tree_status_results[0]._message
+ display_skip_keyword_prompt = True
+
+ if (display_skip_keyword_prompt
+ and os.isatty(sys.stdout.fileno())
+ and not SKIP_RUNS_KEYWORD in input_api.change.DescriptionText()):
+ long_text = (
+ '%s\nAre you sure the change should be submitted. If it should be '
+ 'submitted but not run on the buildbots you can use the %s keyword.' % (
+ tree_status, SKIP_RUNS_KEYWORD))
+ results.append(output_api.PresubmitPromptWarning(
+ message=tree_status, long_text=long_text))
+ return results
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return CheckChange(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ results = CheckChange(input_api, output_api)
+ results.extend(
+ _CheckTreeStatus(input_api, output_api, json_url=(
+ SKIA_TREE_STATUS_URL + '/banner-status?format=json')))
+ return results
+
« no previous file with comments | « .gitignore ('k') | __init__.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698