#!/usr/bin/env python # Copyright (c) 2006-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. """Generic presubmit checks that can be reused by other presubmit checks.""" def CheckChangeHasTestField(input_api, output_api): """Requires that the changelist have a TEST= field.""" if input_api.change.Test: return [] else: return [output_api.PresubmitNotifyResult( "Changelist should have a TEST= field. TEST=none is allowed.")] def CheckChangeHasBugField(input_api, output_api): """Requires that the changelist have a BUG= field.""" if input_api.change.BugIDs: return [] else: return [output_api.PresubmitNotifyResult( "Changelist should have a BUG= field. BUG=none is allowed.")] def CheckChangeHasTestedField(input_api, output_api): """Requires that the changelist have a TESTED= field.""" if input_api.change.Tested: return [] else: return [output_api.PresubmitError("Changelist must have a TESTED= field.")] def CheckChangeHasQaField(input_api, output_api): """Requires that the changelist have a QA= field.""" if input_api.change.QA: return [] else: return [output_api.PresubmitError("Changelist must have a QA= field.")] def CheckDoNotSubmitInDescription(input_api, output_api): """Checks that the user didn't add 'DO NOT ' + 'SUBMIT' to the CL description. """ keyword = 'DO NOT ' + 'SUBMIT' if keyword in input_api.change.DescriptionText(): return [output_api.PresubmitError( keyword + " is present in the changelist description.")] else: return [] def CheckDoNotSubmitInFiles(input_api, output_api): """Checks that the user didn't add 'DO NOT ' + 'SUBMIT' to any files.""" keyword = 'DO NOT ' + 'SUBMIT' for f, line_num, line in input_api.RightHandSideLines(): if keyword in line: text = 'Found ' + keyword + ' in %s, line %s' % (f.LocalPath(), line_num) return [output_api.PresubmitError(text)] return [] def CheckDoNotSubmit(input_api, output_api): return ( CheckDoNotSubmitInDescription(input_api, output_api) + CheckDoNotSubmitInFiles(input_api, output_api) ) def CheckChangeHasNoTabs(input_api, output_api): """Checks that there are no tab characters in any of the text files to be submitted. """ for f, line_num, line in input_api.RightHandSideLines(): if '\t' in line: return [output_api.PresubmitError( "Found a tab character in %s, line %s" % (f.LocalPath(), line_num))] return [] def CheckLongLines(input_api, output_api, maxlen=80): """Checks that there aren't any lines longer than maxlen characters in any of the text files to be submitted. """ basename = input_api.basename bad = [] for f, line_num, line in input_api.RightHandSideLines(): if line.endswith('\n'): line = line[:-1] if len(line) > maxlen: bad.append( '%s, line %s, %s chars' % (basename(f.LocalPath()), line_num, len(line))) if len(bad) == 5: # Just show the first 5 errors. break if bad: msg = "Found lines longer than %s characters (first 5 shown)." % maxlen return [output_api.PresubmitPromptWarning(msg, items=bad)] else: return [] def CheckTreeIsOpen(input_api, output_api, url, closed): """Checks that an url's content doesn't match a regexp that would mean that the tree is closed.""" try: connection = input_api.urllib2.urlopen(url) status = connection.read() connection.close() if input_api.re.match(closed, status): long_text = status + '\n' + url return [output_api.PresubmitError("The tree is closed.", long_text=long_text)] except IOError: pass return [] def RunPythonUnitTests(input_api, output_api, unit_tests): """Imports the unit_tests modules and run them.""" import unittest tests_suite = [] test_loader = unittest.TestLoader() def LoadTests(module_name): module = __import__(module_name) for part in module_name.split('.')[1:]: module = getattr(module, part) tests_suite.extend(test_loader.loadTestsFromModule(module)._tests) outputs = [] for unit_test in unit_tests: try: LoadTests(unit_test) except ImportError: outputs.Append(output_api.PresubmitError("Failed to load %s" % unit_test)) raise results = unittest.TextTestRunner(verbosity=0).run(unittest.TestSuite( tests_suite)) if not results.wasSuccessful(): outputs.append(output_api.PresubmitError( "%d unit tests failed." % (results.failures + results.errors))) return outputs