OLD | NEW |
---|---|
1 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Top-level presubmit script for Chromium. | 5 """Top-level presubmit script for Chromium. |
6 | 6 |
7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts | 7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
8 for more details about the presubmit API built into gcl. | 8 for more details about the presubmit API built into gcl. |
9 """ | 9 """ |
10 | 10 |
11 | |
11 _EXCLUDED_PATHS = ( | 12 _EXCLUDED_PATHS = ( |
12 r"^breakpad[\\\/].*", | 13 r"^breakpad[\\\/].*", |
13 r"^net/tools/spdyshark/[\\\/].*", | 14 r"^net/tools/spdyshark/[\\\/].*", |
14 r"^skia[\\\/].*", | 15 r"^skia[\\\/].*", |
15 r"^v8[\\\/].*", | 16 r"^v8[\\\/].*", |
16 r".*MakeFile$", | 17 r".*MakeFile$", |
17 ) | 18 ) |
18 | 19 |
19 | 20 |
21 _TEST_ONLY_WARNING = ( | |
22 'You might be calling functions intended only for testing from\n' | |
23 'production code. It is OK to ignore this warning if you know what\n' | |
24 'you are doing, as the heuristics used to detect the situation are\n' | |
25 'not perfect. The commit queue will not block on this warning.\n' | |
26 'Email joi@chromium.org if you have questions.') | |
27 | |
28 | |
29 | |
20 def _CheckNoInterfacesInBase(input_api, output_api): | 30 def _CheckNoInterfacesInBase(input_api, output_api): |
21 """Checks to make sure no files in libbase.a have |@interface|.""" | 31 """Checks to make sure no files in libbase.a have |@interface|.""" |
22 pattern = input_api.re.compile(r'^\s*@interface', input_api.re.MULTILINE) | 32 pattern = input_api.re.compile(r'^\s*@interface', input_api.re.MULTILINE) |
23 files = [] | 33 files = [] |
24 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): | 34 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): |
25 if (f.LocalPath().startswith('base/') and | 35 if (f.LocalPath().startswith('base/') and |
26 not f.LocalPath().endswith('_unittest.mm')): | 36 not f.LocalPath().endswith('_unittest.mm')): |
27 contents = input_api.ReadFile(f) | 37 contents = input_api.ReadFile(f) |
28 if pattern.search(contents): | 38 if pattern.search(contents): |
29 files.append(f) | 39 files.append(f) |
30 | 40 |
31 if len(files): | 41 if len(files): |
32 return [ output_api.PresubmitError( | 42 return [ output_api.PresubmitError( |
33 'Objective-C interfaces or categories are forbidden in libbase. ' + | 43 'Objective-C interfaces or categories are forbidden in libbase. ' + |
34 'See http://groups.google.com/a/chromium.org/group/chromium-dev/' + | 44 'See http://groups.google.com/a/chromium.org/group/chromium-dev/' + |
35 'browse_thread/thread/efb28c10435987fd', | 45 'browse_thread/thread/efb28c10435987fd', |
36 files) ] | 46 files) ] |
37 return [] | 47 return [] |
38 | 48 |
39 | 49 |
40 def _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, output_api): | 50 def _CheckNoProductionCodeUsingTestOnlyFunctions(input_api, |
M-A Ruel
2011/11/18 11:26:49
Not necessary. :)
| |
51 output_api): | |
41 """Attempts to prevent use of functions intended only for testing in | 52 """Attempts to prevent use of functions intended only for testing in |
42 non-testing code. For now this is just a best-effort implementation | 53 non-testing code. For now this is just a best-effort implementation |
43 that ignores header files and may have some false positives. A | 54 that ignores header files and may have some false positives. A |
44 better implementation would probably need a proper C++ parser. | 55 better implementation would probably need a proper C++ parser. |
45 """ | 56 """ |
46 # We only scan .cc files and the like, as the declaration of | 57 # We only scan .cc files and the like, as the declaration of |
47 # for-testing functions in header files are hard to distinguish from | 58 # for-testing functions in header files are hard to distinguish from |
48 # calls to such functions without a proper C++ parser. | 59 # calls to such functions without a proper C++ parser. |
49 source_extensions = r'\.(cc|cpp|cxx|mm)$' | 60 source_extensions = r'\.(cc|cpp|cxx|mm)$' |
50 file_inclusion_pattern = r'.+%s' % source_extensions | 61 file_inclusion_pattern = r'.+%s' % source_extensions |
(...skipping 29 matching lines...) Expand all Loading... | |
80 lines = input_api.ReadFile(f).splitlines() | 91 lines = input_api.ReadFile(f).splitlines() |
81 line_number = 0 | 92 line_number = 0 |
82 for line in lines: | 93 for line in lines: |
83 if (inclusion_pattern.search(line) and | 94 if (inclusion_pattern.search(line) and |
84 not exclusion_pattern.search(line)): | 95 not exclusion_pattern.search(line)): |
85 problems.append( | 96 problems.append( |
86 '%s:%d\n %s' % (local_path, line_number, line.strip())) | 97 '%s:%d\n %s' % (local_path, line_number, line.strip())) |
87 line_number += 1 | 98 line_number += 1 |
88 | 99 |
89 if problems: | 100 if problems: |
90 return [output_api.PresubmitPromptWarning( | 101 if not input_api.is_committing: |
91 'You might be calling functions intended only for testing from\n' | 102 return [output_api.PresubmitPromptWarning(_TEST_ONLY_WARNING, problems)] |
92 'production code. Please verify that the following usages are OK,\n' | 103 else: |
93 'and email joi@chromium.org if you are seeing false positives:', | 104 # We don't warn on commit, to avoid stopping commits going through CQ. |
94 problems)] | 105 return [output_api.PresubmitNotifyResult(_TEST_ONLY_WARNING, problems)] |
95 else: | 106 else: |
96 return [] | 107 return [] |
97 | 108 |
98 | 109 |
99 def _CheckNoIOStreamInHeaders(input_api, output_api): | 110 def _CheckNoIOStreamInHeaders(input_api, output_api): |
100 """Checks to make sure no .h files include <iostream>.""" | 111 """Checks to make sure no .h files include <iostream>.""" |
101 files = [] | 112 files = [] |
102 pattern = input_api.re.compile(r'^#include\s*<iostream>', | 113 pattern = input_api.re.compile(r'^#include\s*<iostream>', |
103 input_api.re.MULTILINE) | 114 input_api.re.MULTILINE) |
104 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): | 115 for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
266 results.extend(_CheckSubversionConfig(input_api, output_api)) | 277 results.extend(_CheckSubversionConfig(input_api, output_api)) |
267 return results | 278 return results |
268 | 279 |
269 | 280 |
270 def GetPreferredTrySlaves(project, change): | 281 def GetPreferredTrySlaves(project, change): |
271 only_objc_files = all( | 282 only_objc_files = all( |
272 f.LocalPath().endswith(('.mm', '.m')) for f in change.AffectedFiles()) | 283 f.LocalPath().endswith(('.mm', '.m')) for f in change.AffectedFiles()) |
273 if only_objc_files: | 284 if only_objc_files: |
274 return ['mac'] | 285 return ['mac'] |
275 return ['win', 'linux', 'mac'] | 286 return ['win', 'linux', 'mac'] |
OLD | NEW |