PRESUBMIT.py 5.1 KB

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