# Copyright 2012 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. def _CommonChecks(input_api, output_api): results = [] results += input_api.RunTests(input_api.canned_checks.GetPylint( input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api), pylintrc='pylintrc')) results += _CheckNoMoreUsageOfDeprecatedCode( input_api, output_api, deprecated_code='GetChromiumSrcDir()', crbug_number=511332) return results def _RunArgs(args, input_api): p = input_api.subprocess.Popen(args, stdout=input_api.subprocess.PIPE, stderr=input_api.subprocess.STDOUT) out, _ = p.communicate() return (out, p.returncode) def _ValidateDependenciesFile(input_api, output_api, dependencies_path): """ Check that binary_dependencies.json has valid format and content. This check should only be done in CheckChangeOnUpload() only since it invokes network I/O. """ results = [] telemetry_dir = input_api.PresubmitLocalPath() for f in input_api.AffectedFiles(): if not f.AbsoluteLocalPath() == dependencies_path: continue out, return_code = _RunArgs([ input_api.python_executable, input_api.os_path.join(telemetry_dir, 'json_format'), dependencies_path], input_api) if return_code: results.append(output_api.PresubmitError( 'Validating %s failed:' % dependencies_path, long_text=out)) break out, return_code = _RunArgs([ input_api.python_executable, input_api.os_path.join(telemetry_dir, 'validate_binary_dependencies'), dependencies_path], input_api) if return_code: results.append(output_api.PresubmitError( 'Validating %s failed:' % dependencies_path, long_text=out)) break return results def _CheckNoMoreUsageOfDeprecatedCode( input_api, output_api, deprecated_code, crbug_number): results = [] # These checks are not perfcet but should be good enough for most of our # usecases. def _IsAddedLine(line): return line.startswith('+') and not line.startswith('+++ ') def _IsRemovedLine(line): return line.startswith('-') and not line.startswith('--- ') presubmit_dir = input_api.os_path.join( input_api.PresubmitLocalPath(), 'PRESUBMIT.py') added_calls = 0 removed_calls = 0 for affected_file in input_api.AffectedFiles(): # Do not do the check on PRESUBMIT.py itself. if affected_file.AbsoluteLocalPath() == presubmit_dir: continue for line in affected_file.GenerateScmDiff().splitlines(): if _IsAddedLine(line) and deprecated_code in line: added_calls += 1 elif _IsRemovedLine(line) and deprecated_code in line: removed_calls += 1 if added_calls > removed_calls: results.append(output_api.PresubmitError( 'Your patch adds more instances of %s. Please see crbug.com/%i for' 'how to proceed.' % (deprecated_code, crbug_number))) return results def _GetPathsToPrepend(input_api): telemetry_dir = input_api.PresubmitLocalPath() catapult_dir = input_api.os_path.join(telemetry_dir, '..') return [ telemetry_dir, input_api.os_path.join(telemetry_dir, 'third_party', 'altgraph'), input_api.os_path.join(telemetry_dir, 'third_party', 'modulegraph'), input_api.os_path.join(telemetry_dir, 'third_party', 'pexpect'), input_api.os_path.join(telemetry_dir, 'third_party', 'png'), input_api.os_path.join(telemetry_dir, 'third_party', 'web-page-replay'), input_api.os_path.join(telemetry_dir, 'third_party', 'websocket-client'), input_api.os_path.join(catapult_dir, 'common', 'py_utils'), input_api.os_path.join(catapult_dir, 'dependency_manager'), input_api.os_path.join(catapult_dir, 'devil'), input_api.os_path.join(catapult_dir, 'systrace'), input_api.os_path.join(catapult_dir, 'tracing'), input_api.os_path.join(catapult_dir, 'common', 'battor'), input_api.os_path.join(catapult_dir, 'common', 'py_trace_event'), input_api.os_path.join(catapult_dir, 'third_party', 'mock'), input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'), input_api.os_path.join(catapult_dir, 'third_party', 'pyserial'), input_api.os_path.join(catapult_dir, 'third_party', 'typ'), ] def _ValidateAllDependenciesFiles(input_api, output_api): results = [] telemetry_dir = input_api.PresubmitLocalPath() binary_dependencies = input_api.os_path.join( telemetry_dir, 'telemetry', 'internal', 'binary_dependencies.json') telemetry_unittest_dependencies = input_api.os_path.join( telemetry_dir, 'telemetry', 'telemetry_unittest_deps.json') for path in [binary_dependencies, telemetry_unittest_dependencies]: results += _ValidateDependenciesFile(input_api, output_api, path) return results def CheckChangeOnUpload(input_api, output_api): results = [] results += _CommonChecks(input_api, output_api) results += _ValidateAllDependenciesFiles(input_api, output_api) return results def CheckChangeOnCommit(input_api, output_api): results = [] results += _CommonChecks(input_api, output_api) return results