PRESUBMIT.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # Copyright (c) 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. """Top-level presubmit script for depot tools.
  5. See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
  6. details on the presubmit API built into depot_tools.
  7. """
  8. PRESUBMIT_VERSION = '2.0.0'
  9. import fnmatch
  10. import os
  11. import sys
  12. # CIPD ensure manifest for checking CIPD client itself.
  13. CIPD_CLIENT_ENSURE_FILE_TEMPLATE = r'''
  14. # Full supported.
  15. $VerifiedPlatform linux-amd64 mac-amd64 windows-amd64 windows-386
  16. # Best effort support.
  17. $VerifiedPlatform linux-386 linux-ppc64 linux-ppc64le linux-s390x
  18. $VerifiedPlatform linux-arm64 linux-armv6l
  19. $VerifiedPlatform linux-mips64 linux-mips64le linux-mipsle
  20. %s %s
  21. '''
  22. # Timeout for a test to be executed.
  23. TEST_TIMEOUT_S = 450 # 7m 30s
  24. def CheckPylint(input_api, output_api):
  25. """Gather all the pylint logic into one place to make it self-contained."""
  26. files_to_check = [
  27. r'^[^/]*\.py$',
  28. r'^testing_support/[^/]*\.py$',
  29. r'^tests/[^/]*\.py$',
  30. r'^recipe_modules/.*\.py$', # Allow recursive search in recipe modules.
  31. ]
  32. files_to_skip = list(input_api.DEFAULT_FILES_TO_SKIP)
  33. if os.path.exists('.gitignore'):
  34. with open('.gitignore', encoding='utf-8') as fh:
  35. lines = [l.strip() for l in fh.readlines()]
  36. files_to_skip.extend([
  37. fnmatch.translate(l) for l in lines
  38. if l and not l.startswith('#')
  39. ])
  40. if os.path.exists('.git/info/exclude'):
  41. with open('.git/info/exclude', encoding='utf-8') as fh:
  42. lines = [l.strip() for l in fh.readlines()]
  43. files_to_skip.extend([
  44. fnmatch.translate(l) for l in lines
  45. if l and not l.startswith('#')
  46. ])
  47. disabled_warnings = [
  48. 'R0401', # Cyclic import
  49. 'W0613', # Unused argument
  50. 'C0415', # import-outside-toplevel
  51. 'R1710', # inconsistent-return-statements
  52. 'E1101', # no-member
  53. 'E1120', # no-value-for-parameter
  54. 'R1708', # stop-iteration-return
  55. 'W1510', # subprocess-run-check
  56. # Checks which should be re-enabled after Python 2 support is removed.
  57. 'R0205', # useless-object-inheritance
  58. 'R1725', # super-with-arguments
  59. 'W0707', # raise-missing-from
  60. 'W1113', # keyword-arg-before-vararg
  61. ]
  62. return input_api.RunTests(input_api.canned_checks.GetPylint(
  63. input_api,
  64. output_api,
  65. files_to_check=files_to_check,
  66. files_to_skip=files_to_skip,
  67. disabled_warnings=disabled_warnings,
  68. version='2.7'),
  69. parallel=False)
  70. def CheckRecipes(input_api, output_api):
  71. file_filter = lambda x: x.LocalPath() == 'infra/config/recipes.cfg'
  72. return input_api.canned_checks.CheckJsonParses(input_api,
  73. output_api,
  74. file_filter=file_filter)
  75. def CheckUsePython3(input_api, output_api):
  76. results = []
  77. if sys.version_info.major != 3:
  78. results.append(
  79. output_api.PresubmitError(
  80. 'Did not use Python3 for //tests/PRESUBMIT.py.'))
  81. return results
  82. def CheckJsonFiles(input_api, output_api):
  83. return input_api.canned_checks.CheckJsonParses(input_api, output_api)
  84. def CheckUnitTestsOnCommit(input_api, output_api):
  85. """Do not run integration tests on upload since they are way too slow."""
  86. input_api.SetTimeout(TEST_TIMEOUT_S)
  87. # Run only selected tests on Windows.
  88. test_to_run_list = [r'.*test\.py$']
  89. tests_to_skip_list = []
  90. if input_api.platform.startswith(('cygwin', 'win32')):
  91. print('Warning: skipping most unit tests on Windows')
  92. tests_to_skip_list.extend([
  93. r'.*auth_test\.py$',
  94. r'.*git_common_test\.py$',
  95. r'.*git_hyper_blame_test\.py$',
  96. r'.*git_map_test\.py$',
  97. r'.*ninjalog_uploader_test\.py$',
  98. r'.*recipes_test\.py$',
  99. ])
  100. tests = input_api.canned_checks.GetUnitTestsInDirectory(
  101. input_api,
  102. output_api,
  103. 'tests',
  104. files_to_check=test_to_run_list,
  105. files_to_skip=tests_to_skip_list)
  106. return input_api.RunTests(tests)
  107. def CheckCIPDManifest(input_api, output_api):
  108. # Validate CIPD manifests.
  109. root = input_api.os_path.normpath(
  110. input_api.os_path.abspath(input_api.PresubmitLocalPath()))
  111. rel_file = lambda rel: input_api.os_path.join(root, rel)
  112. cipd_manifests = set(
  113. rel_file(input_api.os_path.join(*x)) for x in (
  114. ('cipd_manifest.txt', ),
  115. ('bootstrap', 'manifest.txt'),
  116. ('bootstrap', 'manifest_bleeding_edge.txt'),
  117. # Also generate a file for the cipd client itself.
  118. (
  119. 'cipd_client_version', ),
  120. ))
  121. affected_manifests = input_api.AffectedFiles(
  122. include_deletes=False,
  123. file_filter=lambda x: input_api.os_path.normpath(x.AbsoluteLocalPath()
  124. ) in cipd_manifests)
  125. tests = []
  126. for path in affected_manifests:
  127. path = path.AbsoluteLocalPath()
  128. if path.endswith('.txt'):
  129. tests.append(
  130. input_api.canned_checks.CheckCIPDManifest(input_api,
  131. output_api,
  132. path=path))
  133. else:
  134. pkg = 'infra/tools/cipd/${platform}'
  135. ver = input_api.ReadFile(path)
  136. tests.append(
  137. input_api.canned_checks.CheckCIPDManifest(
  138. input_api,
  139. output_api,
  140. content=CIPD_CLIENT_ENSURE_FILE_TEMPLATE % (pkg, ver)))
  141. tests.append(
  142. input_api.canned_checks.CheckCIPDClientDigests(
  143. input_api, output_api, client_version_file=path))
  144. return input_api.RunTests(tests)
  145. def CheckOwnersFormat(input_api, output_api):
  146. return input_api.canned_checks.CheckOwnersFormat(input_api, output_api)
  147. def CheckOwnersOnUpload(input_api, output_api):
  148. return input_api.canned_checks.CheckOwners(input_api,
  149. output_api,
  150. allow_tbr=False)
  151. def CheckDoNotSubmitOnCommit(input_api, output_api):
  152. return input_api.canned_checks.CheckDoNotSubmit(input_api, output_api)
  153. def CheckPatchFormatted(input_api, output_api):
  154. # TODO(https://crbug.com/979330) If clang-format is fixed for non-chromium
  155. # repos, remove check_clang_format=False so that proto files can be
  156. # formatted
  157. return input_api.canned_checks.CheckPatchFormatted(input_api,
  158. output_api,
  159. check_clang_format=False)
  160. def CheckFreezeOnCommit(input_api, output_api):
  161. return input_api.canned_checks.CheckInfraFreeze(input_api, output_api)