PRESUBMIT.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. import fnmatch
  9. import os
  10. # CIPD ensure manifest for checking CIPD client itself.
  11. CIPD_CLIENT_ENSURE_FILE_TEMPLATE = r'''
  12. # Full supported.
  13. $VerifiedPlatform linux-amd64 mac-amd64 windows-amd64 windows-386
  14. # Best effort support.
  15. $VerifiedPlatform linux-386 linux-ppc64 linux-ppc64le linux-s390x
  16. $VerifiedPlatform linux-arm64 linux-armv6l
  17. $VerifiedPlatform linux-mips64 linux-mips64le linux-mipsle
  18. %s %s
  19. '''
  20. def DepotToolsPylint(input_api, output_api):
  21. """Gather all the pylint logic into one place to make it self-contained."""
  22. white_list = [
  23. r'^[^/]*\.py$',
  24. r'^testing_support/[^/]*\.py$',
  25. r'^tests/[^/]*\.py$',
  26. r'^recipe_modules/.*\.py$', # Allow recursive search in recipe modules.
  27. ]
  28. black_list = list(input_api.DEFAULT_BLACK_LIST)
  29. if os.path.exists('.gitignore'):
  30. with open('.gitignore') as fh:
  31. lines = [l.strip() for l in fh.readlines()]
  32. black_list.extend([fnmatch.translate(l) for l in lines if
  33. l and not l.startswith('#')])
  34. if os.path.exists('.git/info/exclude'):
  35. with open('.git/info/exclude') as fh:
  36. lines = [l.strip() for l in fh.readlines()]
  37. black_list.extend([fnmatch.translate(l) for l in lines if
  38. l and not l.startswith('#')])
  39. disabled_warnings = [
  40. 'R0401', # Cyclic import
  41. 'W0613', # Unused argument
  42. ]
  43. return input_api.canned_checks.GetPylint(
  44. input_api,
  45. output_api,
  46. white_list=white_list,
  47. black_list=black_list,
  48. disabled_warnings=disabled_warnings)
  49. def CommonChecks(input_api, output_api, tests_to_black_list, run_on_python3):
  50. results = []
  51. results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
  52. results.extend(input_api.canned_checks.CheckOwnersFormat(
  53. input_api, output_api))
  54. results.extend(input_api.canned_checks.CheckJsonParses(
  55. input_api, output_api))
  56. # Run only selected tests on Windows.
  57. tests_to_white_list = [r'.*test\.py$']
  58. if input_api.platform.startswith(('cygwin', 'win32')):
  59. print('Warning: skipping most unit tests on Windows')
  60. tests_to_black_list = [
  61. r'.*auth_test\.py$',
  62. r'.*gclient_smoketest\.py$',
  63. r'.*git_cl_test\.py$',
  64. r'.*git_common_test\.py$',
  65. r'.*git_hyper_blame_test\.py$',
  66. r'.*git_number_test\.py$',
  67. r'.*git_rebase_update_test\.py$',
  68. r'.*ninjalog_uploader_test\.py$',
  69. r'.*recipes_test\.py$',
  70. r'.*roll_dep_test\.py$',
  71. r'.*scm_unittest\.py$',
  72. r'.*subprocess2_test\.py$',
  73. ]
  74. # TODO(maruel): Make sure at least one file is modified first.
  75. # TODO(maruel): If only tests are modified, only run them.
  76. tests = DepotToolsPylint(input_api, output_api)
  77. tests.extend(input_api.canned_checks.GetUnitTestsInDirectory(
  78. input_api,
  79. output_api,
  80. 'tests',
  81. whitelist=tests_to_white_list,
  82. blacklist=tests_to_black_list,
  83. run_on_python3=run_on_python3))
  84. # Validate CIPD manifests.
  85. root = input_api.os_path.normpath(
  86. input_api.os_path.abspath(input_api.PresubmitLocalPath()))
  87. rel_file = lambda rel: input_api.os_path.join(root, rel)
  88. cipd_manifests = set(rel_file(input_api.os_path.join(*x)) for x in (
  89. ('cipd_manifest.txt',),
  90. ('bootstrap', 'win', 'manifest.txt'),
  91. ('bootstrap', 'win', 'manifest_bleeding_edge.txt'),
  92. # Also generate a file for the cipd client itself.
  93. ('cipd_client_version',),
  94. ))
  95. affected_manifests = input_api.AffectedFiles(
  96. include_deletes=False,
  97. file_filter=lambda x:
  98. input_api.os_path.normpath(x.AbsoluteLocalPath()) in cipd_manifests)
  99. for path in affected_manifests:
  100. path = path.AbsoluteLocalPath()
  101. if path.endswith('.txt'):
  102. tests.append(input_api.canned_checks.CheckCIPDManifest(
  103. input_api, output_api, path=path))
  104. else:
  105. pkg = 'infra/tools/cipd/${platform}'
  106. ver = input_api.ReadFile(path)
  107. tests.append(input_api.canned_checks.CheckCIPDManifest(
  108. input_api, output_api,
  109. content=CIPD_CLIENT_ENSURE_FILE_TEMPLATE % (pkg, ver)))
  110. tests.append(input_api.canned_checks.CheckCIPDClientDigests(
  111. input_api, output_api, client_version_file=path))
  112. results.extend(input_api.RunTests(tests))
  113. return results
  114. def CheckChangeOnUpload(input_api, output_api):
  115. # Do not run integration tests on upload since they are way too slow.
  116. tests_to_black_list = [
  117. r'^checkout_test\.py$',
  118. r'^cipd_bootstrap_test\.py$',
  119. r'^gclient_smoketest\.py$',
  120. ]
  121. # TODO(ehmaldonado): Run Python 3 tests on upload once Python 3 is
  122. # bootstrapped on Linux and Mac.
  123. return CommonChecks(input_api, output_api, tests_to_black_list, False)
  124. def CheckChangeOnCommit(input_api, output_api):
  125. output = []
  126. output.extend(CommonChecks(input_api, output_api, [], True))
  127. output.extend(input_api.canned_checks.CheckDoNotSubmit(
  128. input_api,
  129. output_api))
  130. return output