OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Generic presubmit checks that can be reused by other presubmit checks.""" | 6 """Generic presubmit checks that can be reused by other presubmit checks.""" |
7 | 7 |
8 | 8 |
9 ### Description checks | 9 ### Description checks |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
60 keyword = 'DO NOT ' + 'SUBMIT' | 60 keyword = 'DO NOT ' + 'SUBMIT' |
61 # We want to check every text files, not just source files. | 61 # We want to check every text files, not just source files. |
62 for f, line_num, line in input_api.RightHandSideLines(lambda x: x): | 62 for f, line_num, line in input_api.RightHandSideLines(lambda x: x): |
63 if keyword in line: | 63 if keyword in line: |
64 text = 'Found ' + keyword + ' in %s, line %s' % (f.LocalPath(), line_num) | 64 text = 'Found ' + keyword + ' in %s, line %s' % (f.LocalPath(), line_num) |
65 return [output_api.PresubmitError(text)] | 65 return [output_api.PresubmitError(text)] |
66 return [] | 66 return [] |
67 | 67 |
68 | 68 |
69 def CheckChangeHasNoCR(input_api, output_api, source_file_filter=None): | 69 def CheckChangeHasNoCR(input_api, output_api, source_file_filter=None): |
70 """Checks that there are no \r, \r\n (CR or CRLF) characters in any of the | 70 """Checks no '\r' (CR) character is in any source files.""" |
71 source files to be submitted. | 71 cr_files = [] |
72 """ | |
73 outputs = [] | |
74 for f in input_api.AffectedSourceFiles(source_file_filter): | 72 for f in input_api.AffectedSourceFiles(source_file_filter): |
75 if '\r' in input_api.ReadFile(f, 'rb'): | 73 if '\r' in input_api.ReadFile(f, 'rb'): |
76 outputs.append(output_api.PresubmitPromptWarning( | 74 cr_files.append(f.LocalPath()) |
77 "Found a CR character in %s" % f.LocalPath())) | 75 if cr_files: |
76 return [output_api.PresubmitPromptWarning( | |
77 "Found a CR character in these files:", items=cr_files)] | |
78 return [] | |
79 | |
80 | |
81 def CheckChangeHasOnlyOneEol(input_api, output_api, source_file_filter=None): | |
82 """Checks the files ends with one and only one \n (LF).""" | |
83 eof_files = [] | |
84 for f in input_api.AffectedSourceFiles(source_file_filter): | |
85 contents = input_api.ReadFile(f, 'rb') | |
86 # Check that the file ends in one and only one newline character. | |
87 if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): | |
88 eof_files.append(f.LocalPath()) | |
89 | |
90 if eof_files: | |
91 return [output_api.PresubmitPromptWarning( | |
92 'These files should end in one (and only one) newline character:', | |
93 items=eof_files)] | |
94 return [] | |
95 | |
96 | |
97 def CheckChangeHasNoCrAndHasOnlyOneEol(input_api, output_api, | |
98 source_file_filter=None): | |
99 """Runs both CheckChangeHasNoCR and CheckChangeHasOnlyOneEOL in one pass. | |
100 | |
101 It is faster because it is reading the file only once. | |
Jói Sigurðsson
2009/06/10 18:02:33
this makes me think perhaps in the future we shoul
| |
102 """ | |
103 cr_files = [] | |
104 eof_files = [] | |
105 for f in input_api.AffectedSourceFiles(source_file_filter): | |
106 contents = input_api.ReadFile(f, 'rb') | |
107 if '\r' in contents: | |
108 cr_files.append(f.LocalPath()) | |
109 # Check that the file ends in one and only one newline character. | |
110 if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): | |
111 eof_files.append(f.LocalPath()) | |
112 outputs = [] | |
113 if cr_files: | |
114 outputs.append(output_api.PresubmitPromptWarning( | |
115 "Found a CR character in these files:", items=cr_files)) | |
116 if eof_files: | |
117 outputs.append(output_api.PresubmitPromptWarning( | |
118 'These files should end in one (and only one) newline character:', | |
119 items=eof_files)) | |
78 return outputs | 120 return outputs |
79 | 121 |
80 | 122 |
81 def CheckChangeHasNoTabs(input_api, output_api, source_file_filter=None): | 123 def CheckChangeHasNoTabs(input_api, output_api, source_file_filter=None): |
82 """Checks that there are no tab characters in any of the text files to be | 124 """Checks that there are no tab characters in any of the text files to be |
83 submitted. | 125 submitted. |
84 """ | 126 """ |
127 tabs = [] | |
85 for f, line_num, line in input_api.RightHandSideLines(source_file_filter): | 128 for f, line_num, line in input_api.RightHandSideLines(source_file_filter): |
86 if '\t' in line: | 129 if '\t' in line: |
87 return [output_api.PresubmitPromptWarning( | 130 tabs.append("%s, line %s" % (f.LocalPath(), line_num)) |
88 "Found a tab character in %s, line %s" % | 131 if tabs: |
89 (f.LocalPath(), line_num))] | 132 return [output_api.PresubmitPromptWarning("Found a tab character in:", |
133 long_text="\n".join(tabs))] | |
90 return [] | 134 return [] |
91 | 135 |
92 | 136 |
93 def CheckLongLines(input_api, output_api, maxlen=80, source_file_filter=None): | 137 def CheckLongLines(input_api, output_api, maxlen=80, source_file_filter=None): |
94 """Checks that there aren't any lines longer than maxlen characters in any of | 138 """Checks that there aren't any lines longer than maxlen characters in any of |
95 the text files to be submitted. | 139 the text files to be submitted. |
96 """ | 140 """ |
97 bad = [] | 141 bad = [] |
98 for f, line_num, line in input_api.RightHandSideLines(source_file_filter): | 142 for f, line_num, line in input_api.RightHandSideLines(source_file_filter): |
99 # Allow lines with http://, https:// and #define/#pragma/#include/#if/#endif | 143 # Allow lines with http://, https:// and #define/#pragma/#include/#if/#endif |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 long_text=input_api.traceback.format_exc())) | 224 long_text=input_api.traceback.format_exc())) |
181 | 225 |
182 buffer = input_api.cStringIO.StringIO() | 226 buffer = input_api.cStringIO.StringIO() |
183 results = input_api.unittest.TextTestRunner(stream=buffer, verbosity=0).run( | 227 results = input_api.unittest.TextTestRunner(stream=buffer, verbosity=0).run( |
184 input_api.unittest.TestSuite(tests_suite)) | 228 input_api.unittest.TestSuite(tests_suite)) |
185 if not results.wasSuccessful(): | 229 if not results.wasSuccessful(): |
186 outputs.append(message_type("%d unit tests failed." % | 230 outputs.append(message_type("%d unit tests failed." % |
187 (len(results.failures) + len(results.errors)), | 231 (len(results.failures) + len(results.errors)), |
188 long_text=buffer.getvalue())) | 232 long_text=buffer.getvalue())) |
189 return outputs | 233 return outputs |
OLD | NEW |