PRESUBMIT.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # Copyright (c) 2011 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. """Presubmit script for changes affecting chrome/
  5. See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
  6. for more details about the presubmit API built into depot_tools.
  7. """
  8. USE_PYTHON3 = True
  9. import re
  10. INCLUDE_CPP_FILES_ONLY = (
  11. r'.*\.(cc|h)$',
  12. )
  13. INCLUDE_SOURCE_FILES_ONLY = (
  14. r'.*\.(c|cc|cpp|h|m|mm)$',
  15. )
  16. EXCLUDE = (
  17. # Objective C confuses everything.
  18. r'.*cocoa.*',
  19. r'.*_mac\.(cc|h)$',
  20. r'.*_mac_.*',
  21. # All the messages files do weird multiple include trickery
  22. r'.*_messages.*\.h$',
  23. # Autogenerated window resources files are off limits
  24. r'.*resource.h$',
  25. # Header trickery
  26. r'.*-inl\.h$',
  27. # Has safe printf usage that cpplint complains about
  28. r'safe_browsing_util\.cc$',
  29. )
  30. def _CheckChangeLintsClean(input_api, output_api):
  31. """Makes sure that the chrome/ code is cpplint clean."""
  32. files_to_skip = input_api.DEFAULT_FILES_TO_SKIP + EXCLUDE
  33. sources = lambda x: input_api.FilterSourceFile(
  34. x, files_to_check=INCLUDE_CPP_FILES_ONLY, files_to_skip=files_to_skip)
  35. return input_api.canned_checks.CheckChangeLintsClean(
  36. input_api, output_api, sources)
  37. def _CheckNoContentUnitTestsInChrome(input_api, output_api):
  38. """Makes sure that no unit tests from content/ are included in unit_tests."""
  39. problems = []
  40. for f in input_api.AffectedFiles():
  41. if not f.LocalPath().endswith('BUILD.gn'):
  42. continue
  43. for line_num, line in f.ChangedContents():
  44. m = re.search(r"'(.*\/content\/.*unittest.*)'", line)
  45. if m:
  46. problems.append(m.group(1))
  47. if not problems:
  48. return []
  49. return [output_api.PresubmitPromptWarning(
  50. 'Unit tests located in content/ should be added to the ' +
  51. 'content_unittests target.',
  52. items=problems)]
  53. def _CheckNoIsAppleBuildFlagsInChromeFile(input_api, f):
  54. """Check for IS_APPLE in a given file in chrome/."""
  55. preprocessor_statement = input_api.re.compile(r'^\s*#')
  56. apple_buildflag = input_api.re.compile(r'BUILDFLAG\(IS_APPLE\)')
  57. results = []
  58. for lnum, line in f.ChangedContents():
  59. if preprocessor_statement.search(line) and apple_buildflag.search(line):
  60. results.append(' %s:%d' % (f.LocalPath(), lnum))
  61. return results
  62. def _CheckNoIsAppleBuildFlagsInChrome(input_api, output_api):
  63. """Check for IS_APPLE which isn't used in chrome/."""
  64. apple_buildflags = []
  65. def SourceFilter(affected_file):
  66. return input_api.FilterSourceFile(affected_file, INCLUDE_SOURCE_FILES_ONLY,
  67. input_api.DEFAULT_FILES_TO_SKIP)
  68. for f in input_api.AffectedSourceFiles(SourceFilter):
  69. apple_buildflags.extend(_CheckNoIsAppleBuildFlagsInChromeFile(input_api, f))
  70. if not apple_buildflags:
  71. return []
  72. return [output_api.PresubmitError(
  73. 'IS_APPLE is not used in chrome/ but found in:\n', apple_buildflags)]
  74. def _CheckNoIsIOSBuildFlagsInChromeFile(input_api, f):
  75. """Check for IS_IOS in a given file in chrome/."""
  76. preprocessor_statement = input_api.re.compile(r'^\s*#')
  77. ios_buildflag = input_api.re.compile(r'BUILDFLAG\(IS_IOS\)')
  78. results = []
  79. for lnum, line in f.ChangedContents():
  80. if preprocessor_statement.search(line) and ios_buildflag.search(line):
  81. results.append(' %s:%d' % (f.LocalPath(), lnum))
  82. return results
  83. def _CheckNoIsIOSBuildFlagsInChrome(input_api, output_api):
  84. """Check for IS_IOS which isn't used in chrome/."""
  85. ios_buildflags = []
  86. def SourceFilter(affected_file):
  87. return input_api.FilterSourceFile(affected_file, INCLUDE_SOURCE_FILES_ONLY,
  88. input_api.DEFAULT_FILES_TO_SKIP)
  89. for f in input_api.AffectedSourceFiles(SourceFilter):
  90. ios_buildflags.extend(_CheckNoIsIOSBuildFlagsInChromeFile(input_api, f))
  91. if not ios_buildflags:
  92. return []
  93. return [output_api.PresubmitError(
  94. 'IS_IOS is not used in chrome/ but found in:\n', ios_buildflags)]
  95. def _CommonChecks(input_api, output_api):
  96. """Checks common to both upload and commit."""
  97. results = []
  98. results.extend(_CheckNoContentUnitTestsInChrome(input_api, output_api))
  99. results.extend(_CheckNoIsAppleBuildFlagsInChrome(input_api, output_api))
  100. results.extend(_CheckNoIsIOSBuildFlagsInChrome(input_api, output_api))
  101. return results
  102. def CheckChangeOnUpload(input_api, output_api):
  103. results = []
  104. results.extend(_CommonChecks(input_api, output_api))
  105. results.extend(_CheckChangeLintsClean(input_api, output_api))
  106. return results
  107. def CheckChangeOnCommit(input_api, output_api):
  108. results = []
  109. results.extend(_CommonChecks(input_api, output_api))
  110. return results