Chromium Code Reviews| Index: presubmit_canned_checks.py | 
| diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py | 
| index 84d7f8e0c13eb8f07a82a33227b75e16ca792dde..d484c76af1888cd145c547544d4f67229c3d9c3b 100755 | 
| --- a/presubmit_canned_checks.py | 
| +++ b/presubmit_canned_checks.py | 
| @@ -67,14 +67,56 @@ def CheckDoNotSubmitInFiles(input_api, output_api): | 
| def CheckChangeHasNoCR(input_api, output_api, source_file_filter=None): | 
| - """Checks that there are no \r, \r\n (CR or CRLF) characters in any of the | 
| - source files to be submitted. | 
| - """ | 
| - outputs = [] | 
| + """Checks no '\r' (CR) character is in any source files.""" | 
| + cr_files = [] | 
| for f in input_api.AffectedSourceFiles(source_file_filter): | 
| if '\r' in input_api.ReadFile(f, 'rb'): | 
| - outputs.append(output_api.PresubmitPromptWarning( | 
| - "Found a CR character in %s" % f.LocalPath())) | 
| + cr_files.append(f.LocalPath()) | 
| + if cr_files: | 
| + return [output_api.PresubmitPromptWarning( | 
| + "Found a CR character in these files:", items=cr_files)] | 
| + return [] | 
| + | 
| + | 
| +def CheckChangeHasOnlyOneEol(input_api, output_api, source_file_filter=None): | 
| + """Checks the files ends with one and only one \n (LF).""" | 
| + eof_files = [] | 
| + for f in input_api.AffectedSourceFiles(source_file_filter): | 
| + contents = input_api.ReadFile(f, 'rb') | 
| + # Check that the file ends in one and only one newline character. | 
| + if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): | 
| + eof_files.append(f.LocalPath()) | 
| + | 
| + if eof_files: | 
| + return [output_api.PresubmitPromptWarning( | 
| + 'These files should end in one (and only one) newline character:', | 
| + items=eof_files)] | 
| + return [] | 
| + | 
| + | 
| +def CheckChangeHasNoCrAndHasOnlyOneEol(input_api, output_api, | 
| + source_file_filter=None): | 
| + """Runs both CheckChangeHasNoCR and CheckChangeHasOnlyOneEOL in one pass. | 
| + | 
| + 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
 
 | 
| + """ | 
| + cr_files = [] | 
| + eof_files = [] | 
| + for f in input_api.AffectedSourceFiles(source_file_filter): | 
| + contents = input_api.ReadFile(f, 'rb') | 
| + if '\r' in contents: | 
| + cr_files.append(f.LocalPath()) | 
| + # Check that the file ends in one and only one newline character. | 
| + if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): | 
| + eof_files.append(f.LocalPath()) | 
| + outputs = [] | 
| + if cr_files: | 
| + outputs.append(output_api.PresubmitPromptWarning( | 
| + "Found a CR character in these files:", items=cr_files)) | 
| + if eof_files: | 
| + outputs.append(output_api.PresubmitPromptWarning( | 
| + 'These files should end in one (and only one) newline character:', | 
| + items=eof_files)) | 
| return outputs | 
| @@ -82,11 +124,13 @@ def CheckChangeHasNoTabs(input_api, output_api, source_file_filter=None): | 
| """Checks that there are no tab characters in any of the text files to be | 
| submitted. | 
| """ | 
| + tabs = [] | 
| for f, line_num, line in input_api.RightHandSideLines(source_file_filter): | 
| if '\t' in line: | 
| - return [output_api.PresubmitPromptWarning( | 
| - "Found a tab character in %s, line %s" % | 
| - (f.LocalPath(), line_num))] | 
| + tabs.append("%s, line %s" % (f.LocalPath(), line_num)) | 
| + if tabs: | 
| + return [output_api.PresubmitPromptWarning("Found a tab character in:", | 
| + long_text="\n".join(tabs))] | 
| return [] |