| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 cr_files = [] | 81 cr_files = [] |
| 82 for f in input_api.AffectedSourceFiles(source_file_filter): | 82 for f in input_api.AffectedSourceFiles(source_file_filter): |
| 83 if '\r' in input_api.ReadFile(f, 'rb'): | 83 if '\r' in input_api.ReadFile(f, 'rb'): |
| 84 cr_files.append(f.LocalPath()) | 84 cr_files.append(f.LocalPath()) |
| 85 if cr_files: | 85 if cr_files: |
| 86 return [output_api.PresubmitPromptWarning( | 86 return [output_api.PresubmitPromptWarning( |
| 87 "Found a CR character in these files:", items=cr_files)] | 87 "Found a CR character in these files:", items=cr_files)] |
| 88 return [] | 88 return [] |
| 89 | 89 |
| 90 | 90 |
| 91 def CheckSvnModifiedDirectories(input_api, output_api, source_file_filter=None): |
| 92 """Checks for files in svn modified directories. |
| 93 |
| 94 They will get submitted on accident because svn commits recursively by |
| 95 default, and that's very dangerous. |
| 96 """ |
| 97 if input_api.change.scm != 'svn': |
| 98 return [] |
| 99 |
| 100 errors = [] |
| 101 current_cl_files = input_api.change.GetModifiedFiles() |
| 102 all_modified_files = input_api.change.GetAllModifiedFiles() |
| 103 # Filter out files in the current CL. |
| 104 modified_files = [f for f in all_modified_files if f not in current_cl_files] |
| 105 modified_abspaths = [input_api.os_path.abspath(f) for f in modified_files] |
| 106 |
| 107 for f in input_api.AffectedFiles(source_file_filter): |
| 108 if f.Action() == 'M' and f.IsDirectory(): |
| 109 curpath = f.AbsoluteLocalPath() |
| 110 bad_files = [] |
| 111 # Check if any of the modified files in other CLs are under curpath. |
| 112 for i in xrange(len(modified_files)): |
| 113 abspath = modified_abspaths[i] |
| 114 if input_api.os_path.commonprefix([curpath, abspath]) == curpath: |
| 115 bad_files.append(modified_files[i]) |
| 116 if bad_files: |
| 117 if input_api.is_committing: |
| 118 error_type = output_api.PresubmitPromptWarning |
| 119 else: |
| 120 error_type = output_api.PresubmitNotifyResult |
| 121 errors.append(error_type( |
| 122 "Potential accidental commits in changelist %s:" % f.LocalPath(), |
| 123 items=bad_files)) |
| 124 return errors |
| 125 |
| 126 |
| 91 def CheckChangeHasOnlyOneEol(input_api, output_api, source_file_filter=None): | 127 def CheckChangeHasOnlyOneEol(input_api, output_api, source_file_filter=None): |
| 92 """Checks the files ends with one and only one \n (LF).""" | 128 """Checks the files ends with one and only one \n (LF).""" |
| 93 eof_files = [] | 129 eof_files = [] |
| 94 for f in input_api.AffectedSourceFiles(source_file_filter): | 130 for f in input_api.AffectedSourceFiles(source_file_filter): |
| 95 contents = input_api.ReadFile(f, 'rb') | 131 contents = input_api.ReadFile(f, 'rb') |
| 96 # Check that the file ends in one and only one newline character. | 132 # Check that the file ends in one and only one newline character. |
| 97 if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): | 133 if len(contents) > 1 and (contents[-1:] != "\n" or contents[-2:-1] == "\n"): |
| 98 eof_files.append(f.LocalPath()) | 134 eof_files.append(f.LocalPath()) |
| 99 | 135 |
| 100 if eof_files: | 136 if eof_files: |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 RunCheck('image/bmp', FilterFiles(['.bmp'])) | 249 RunCheck('image/bmp', FilterFiles(['.bmp'])) |
| 214 RunCheck('image/gif', FilterFiles(['.gif'])) | 250 RunCheck('image/gif', FilterFiles(['.gif'])) |
| 215 RunCheck('image/png', FilterFiles(['.png'])) | 251 RunCheck('image/png', FilterFiles(['.png'])) |
| 216 RunCheck('image/jpeg', FilterFiles(['.jpg', '.jpeg', '.jpe'])) | 252 RunCheck('image/jpeg', FilterFiles(['.jpg', '.jpeg', '.jpe'])) |
| 217 RunCheck('image/vnd.microsoft.icon', FilterFiles(['.ico'])) | 253 RunCheck('image/vnd.microsoft.icon', FilterFiles(['.ico'])) |
| 218 return output | 254 return output |
| 219 | 255 |
| 220 | 256 |
| 221 def CheckSvnProperty(input_api, output_api, prop, expected, affected_files): | 257 def CheckSvnProperty(input_api, output_api, prop, expected, affected_files): |
| 222 """Checks that affected_files files have prop=expected.""" | 258 """Checks that affected_files files have prop=expected.""" |
| 223 bad = filter(lambda f: f.scm == 'svn' and f.Property(prop) != expected, | 259 if input_api.change.scm != 'svn': |
| 224 affected_files) | 260 return [] |
| 261 |
| 262 bad = filter(lambda f: f.Property(prop) != expected, affected_files) |
| 225 if bad: | 263 if bad: |
| 226 if input_api.is_committing: | 264 if input_api.is_committing: |
| 227 type = output_api.PresubmitError | 265 type = output_api.PresubmitError |
| 228 else: | 266 else: |
| 229 type = output_api.PresubmitNotifyResult | 267 type = output_api.PresubmitNotifyResult |
| 230 message = "Run `svn pset %s %s <item>` on these files:" % (prop, expected) | 268 message = "Run `svn pset %s %s <item>` on these files:" % (prop, expected) |
| 231 return [type(message, items=bad)] | 269 return [type(message, items=bad)] |
| 232 return [] | 270 return [] |
| 233 | 271 |
| 234 | 272 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 stderr=input_api.subprocess.PIPE) | 339 stderr=input_api.subprocess.PIPE) |
| 302 stdoutdata, stderrdata = subproc.communicate() | 340 stdoutdata, stderrdata = subproc.communicate() |
| 303 # Discard the output if returncode == 0 | 341 # Discard the output if returncode == 0 |
| 304 if subproc.returncode: | 342 if subproc.returncode: |
| 305 outputs.append("Test '%s' failed with code %d\n%s\n%s\n" % ( | 343 outputs.append("Test '%s' failed with code %d\n%s\n%s\n" % ( |
| 306 unit_test_name, subproc.returncode, stdoutdata, stderrdata)) | 344 unit_test_name, subproc.returncode, stdoutdata, stderrdata)) |
| 307 if outputs: | 345 if outputs: |
| 308 return [message_type("%d unit tests failed." % len(outputs), | 346 return [message_type("%d unit tests failed." % len(outputs), |
| 309 long_text='\n'.join(outputs))] | 347 long_text='\n'.join(outputs))] |
| 310 return [] | 348 return [] |
| OLD | NEW |