• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
6def _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
18def _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
25def _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
55def _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
87def _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
115def _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
127def 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
134def CheckChangeOnCommit(input_api, output_api):
135  results = []
136  results += _CommonChecks(input_api, output_api)
137  return results
138