1 # Copyright 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 6 def _CommonChecks(input_api, output_api): 7 results = [] 8 9 results += input_api.RunTests(input_api.canned_checks.GetPylint( 10 input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api), 11 pylintrc='pylintrc')) 12 results += _CheckNoMoreUsageOfDeprecatedCode( 13 input_api, output_api, deprecated_code='GetChromiumSrcDir()', 14 crbug_number=511332) 15 return results 16 17 18 def _RunArgs(args, input_api): 19 p = input_api.subprocess.Popen(args, stdout=input_api.subprocess.PIPE, 20 stderr=input_api.subprocess.STDOUT) 21 out, _ = p.communicate() 22 return (out, p.returncode) 23 24 25 def _ValidateDependenciesFile(input_api, output_api, dependencies_path): 26 """ Check that binary_dependencies.json has valid format and content. 27 28 This check should only be done in CheckChangeOnUpload() only since it invokes 29 network I/O. 30 """ 31 results = [] 32 telemetry_dir = input_api.PresubmitLocalPath() 33 for f in input_api.AffectedFiles(): 34 if not f.AbsoluteLocalPath() == dependencies_path: 35 continue 36 out, return_code = _RunArgs([ 37 input_api.python_executable, 38 input_api.os_path.join(telemetry_dir, 'json_format'), 39 dependencies_path], input_api) 40 if return_code: 41 results.append(output_api.PresubmitError( 42 'Validating %s failed:' % dependencies_path, long_text=out)) 43 break 44 out, return_code = _RunArgs([ 45 input_api.python_executable, 46 input_api.os_path.join(telemetry_dir, 'validate_binary_dependencies'), 47 dependencies_path], input_api) 48 if return_code: 49 results.append(output_api.PresubmitError( 50 'Validating %s failed:' % dependencies_path, long_text=out)) 51 break 52 return results 53 54 55 def _CheckNoMoreUsageOfDeprecatedCode( 56 input_api, output_api, deprecated_code, crbug_number): 57 results = [] 58 # These checks are not perfcet but should be good enough for most of our 59 # usecases. 60 def _IsAddedLine(line): 61 return line.startswith('+') and not line.startswith('+++ ') 62 def _IsRemovedLine(line): 63 return line.startswith('-') and not line.startswith('--- ') 64 65 presubmit_dir = input_api.os_path.join( 66 input_api.PresubmitLocalPath(), 'PRESUBMIT.py') 67 68 added_calls = 0 69 removed_calls = 0 70 for affected_file in input_api.AffectedFiles(): 71 # Do not do the check on PRESUBMIT.py itself. 72 if affected_file.AbsoluteLocalPath() == presubmit_dir: 73 continue 74 for line in affected_file.GenerateScmDiff().splitlines(): 75 if _IsAddedLine(line) and deprecated_code in line: 76 added_calls += 1 77 elif _IsRemovedLine(line) and deprecated_code in line: 78 removed_calls += 1 79 80 if added_calls > removed_calls: 81 results.append(output_api.PresubmitError( 82 'Your patch adds more instances of %s. Please see crbug.com/%i for' 83 'how to proceed.' % (deprecated_code, crbug_number))) 84 return results 85 86 87 def _GetPathsToPrepend(input_api): 88 telemetry_dir = input_api.PresubmitLocalPath() 89 catapult_dir = input_api.os_path.join(telemetry_dir, '..') 90 return [ 91 telemetry_dir, 92 93 input_api.os_path.join(telemetry_dir, 'third_party', 'altgraph'), 94 input_api.os_path.join(telemetry_dir, 'third_party', 'modulegraph'), 95 input_api.os_path.join(telemetry_dir, 'third_party', 'pexpect'), 96 input_api.os_path.join(telemetry_dir, 'third_party', 'png'), 97 input_api.os_path.join(telemetry_dir, 'third_party', 'web-page-replay'), 98 input_api.os_path.join(telemetry_dir, 'third_party', 'websocket-client'), 99 100 input_api.os_path.join(catapult_dir, 'common', 'py_utils'), 101 input_api.os_path.join(catapult_dir, 'dependency_manager'), 102 input_api.os_path.join(catapult_dir, 'devil'), 103 input_api.os_path.join(catapult_dir, 'systrace'), 104 input_api.os_path.join(catapult_dir, 'tracing'), 105 input_api.os_path.join(catapult_dir, 'common', 'battor'), 106 input_api.os_path.join(catapult_dir, 'common', 'py_trace_event'), 107 108 input_api.os_path.join(catapult_dir, 'third_party', 'mock'), 109 input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'), 110 input_api.os_path.join(catapult_dir, 'third_party', 'pyserial'), 111 input_api.os_path.join(catapult_dir, 'third_party', 'typ'), 112 ] 113 114 115 def _ValidateAllDependenciesFiles(input_api, output_api): 116 results = [] 117 telemetry_dir = input_api.PresubmitLocalPath() 118 binary_dependencies = input_api.os_path.join( 119 telemetry_dir, 'telemetry', 'internal', 'binary_dependencies.json') 120 telemetry_unittest_dependencies = input_api.os_path.join( 121 telemetry_dir, 'telemetry', 'telemetry_unittest_deps.json') 122 for path in [binary_dependencies, telemetry_unittest_dependencies]: 123 results += _ValidateDependenciesFile(input_api, output_api, path) 124 return results 125 126 127 def CheckChangeOnUpload(input_api, output_api): 128 results = [] 129 results += _CommonChecks(input_api, output_api) 130 results += _ValidateAllDependenciesFiles(input_api, output_api) 131 return results 132 133 134 def CheckChangeOnCommit(input_api, output_api): 135 results = [] 136 results += _CommonChecks(input_api, output_api) 137 return results 138