1*1fa4b3daSHector Dearman# Copyright 2015 The Chromium Authors. All rights reserved. 2*1fa4b3daSHector Dearman# Use of this source code is governed by a BSD-style license that can be 3*1fa4b3daSHector Dearman# found in the LICENSE file. 4*1fa4b3daSHector Dearman"""Presubmit script for devil. 5*1fa4b3daSHector Dearman 6*1fa4b3daSHector DearmanSee http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for 7*1fa4b3daSHector Dearmandetails on the presubmit API built into depot_tools. 8*1fa4b3daSHector Dearman""" 9*1fa4b3daSHector Dearman 10*1fa4b3daSHector Dearman 11*1fa4b3daSHector Dearmandef _RunPylint(input_api, output_api): 12*1fa4b3daSHector Dearman return input_api.RunTests( 13*1fa4b3daSHector Dearman input_api.canned_checks.RunPylint( 14*1fa4b3daSHector Dearman input_api, output_api, pylintrc='pylintrc')) 15*1fa4b3daSHector Dearman 16*1fa4b3daSHector Dearman 17*1fa4b3daSHector Dearmandef _RunUnitTests(input_api, output_api): 18*1fa4b3daSHector Dearman def J(*dirs): 19*1fa4b3daSHector Dearman """Returns a path relative to presubmit directory.""" 20*1fa4b3daSHector Dearman return input_api.os_path.join(input_api.PresubmitLocalPath(), 'devil', 21*1fa4b3daSHector Dearman *dirs) 22*1fa4b3daSHector Dearman 23*1fa4b3daSHector Dearman test_env = dict(input_api.environ) 24*1fa4b3daSHector Dearman test_env.update({ 25*1fa4b3daSHector Dearman 'PYTHONDONTWRITEBYTECODE': '1', 26*1fa4b3daSHector Dearman 'PYTHONPATH': ':'.join([J(), J('..')]), 27*1fa4b3daSHector Dearman }) 28*1fa4b3daSHector Dearman 29*1fa4b3daSHector Dearman message_type = (output_api.PresubmitError if input_api.is_committing else 30*1fa4b3daSHector Dearman output_api.PresubmitPromptWarning) 31*1fa4b3daSHector Dearman 32*1fa4b3daSHector Dearman return input_api.RunTests([ 33*1fa4b3daSHector Dearman input_api.Command(name='devil/bin/run_py_tests', 34*1fa4b3daSHector Dearman cmd=[ 35*1fa4b3daSHector Dearman input_api.os_path.join( 36*1fa4b3daSHector Dearman input_api.PresubmitLocalPath(), 'bin', 37*1fa4b3daSHector Dearman 'run_py_tests') 38*1fa4b3daSHector Dearman ], 39*1fa4b3daSHector Dearman kwargs={'env': test_env}, 40*1fa4b3daSHector Dearman message=message_type), 41*1fa4b3daSHector Dearman input_api.Command(name='devil/bin/run_py3_tests', 42*1fa4b3daSHector Dearman cmd=[ 43*1fa4b3daSHector Dearman input_api.os_path.join( 44*1fa4b3daSHector Dearman input_api.PresubmitLocalPath(), 'bin', 45*1fa4b3daSHector Dearman 'run_py3_tests') 46*1fa4b3daSHector Dearman ], 47*1fa4b3daSHector Dearman kwargs={'env': test_env}, 48*1fa4b3daSHector Dearman message=message_type, 49*1fa4b3daSHector Dearman python3=True), 50*1fa4b3daSHector Dearman ]) 51*1fa4b3daSHector Dearman 52*1fa4b3daSHector Dearman 53*1fa4b3daSHector Dearmandef _EnsureNoPylibUse(input_api, output_api): 54*1fa4b3daSHector Dearman def other_python_files(f): 55*1fa4b3daSHector Dearman this_presubmit_file = input_api.os_path.join(input_api.PresubmitLocalPath(), 56*1fa4b3daSHector Dearman 'PRESUBMIT.py') 57*1fa4b3daSHector Dearman return (f.LocalPath().endswith('.py') 58*1fa4b3daSHector Dearman and not f.AbsoluteLocalPath() == this_presubmit_file) 59*1fa4b3daSHector Dearman 60*1fa4b3daSHector Dearman changed_files = input_api.AffectedSourceFiles(other_python_files) 61*1fa4b3daSHector Dearman import_error_re = input_api.re.compile( 62*1fa4b3daSHector Dearman r'(from pylib.* import)|(import pylib)') 63*1fa4b3daSHector Dearman 64*1fa4b3daSHector Dearman errors = [] 65*1fa4b3daSHector Dearman for f in changed_files: 66*1fa4b3daSHector Dearman errors.extend('%s:%d' % (f.LocalPath(), line_number) 67*1fa4b3daSHector Dearman for line_number, line_text in f.ChangedContents() 68*1fa4b3daSHector Dearman if import_error_re.search(line_text)) 69*1fa4b3daSHector Dearman 70*1fa4b3daSHector Dearman if errors: 71*1fa4b3daSHector Dearman return [ 72*1fa4b3daSHector Dearman output_api.PresubmitError( 73*1fa4b3daSHector Dearman 'pylib modules should not be imported from devil modules.', 74*1fa4b3daSHector Dearman items=errors) 75*1fa4b3daSHector Dearman ] 76*1fa4b3daSHector Dearman return [] 77*1fa4b3daSHector Dearman 78*1fa4b3daSHector Dearman 79*1fa4b3daSHector Dearmandef CommonChecks(input_api, output_api): 80*1fa4b3daSHector Dearman output = [] 81*1fa4b3daSHector Dearman output += _RunPylint(input_api, output_api) 82*1fa4b3daSHector Dearman output += _RunUnitTests(input_api, output_api) 83*1fa4b3daSHector Dearman output += _EnsureNoPylibUse(input_api, output_api) 84*1fa4b3daSHector Dearman return output 85*1fa4b3daSHector Dearman 86*1fa4b3daSHector Dearman 87*1fa4b3daSHector Dearmandef CheckChangeOnUpload(input_api, output_api): 88*1fa4b3daSHector Dearman return CommonChecks(input_api, output_api) 89*1fa4b3daSHector Dearman 90*1fa4b3daSHector Dearman 91*1fa4b3daSHector Dearmandef CheckChangeOnCommit(input_api, output_api): 92*1fa4b3daSHector Dearman return CommonChecks(input_api, output_api) 93