OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 """Generic presubmit checks that can be reused by other presubmit checks.""" | 5 """Generic presubmit checks that can be reused by other presubmit checks.""" |
6 | 6 |
7 import os as _os | 7 import os as _os |
8 _HERE = _os.path.dirname(_os.path.abspath(__file__)) | 8 _HERE = _os.path.dirname(_os.path.abspath(__file__)) |
9 | 9 |
10 # Justifications for each filter: | 10 # Justifications for each filter: |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 continue | 413 continue |
414 if not license_re.search(contents): | 414 if not license_re.search(contents): |
415 bad_files.append(f.LocalPath()) | 415 bad_files.append(f.LocalPath()) |
416 if bad_files: | 416 if bad_files: |
417 return [output_api.PresubmitPromptWarning( | 417 return [output_api.PresubmitPromptWarning( |
418 'License must match:\n%s\n' % license_re.pattern + | 418 'License must match:\n%s\n' % license_re.pattern + |
419 'Found a bad license header in these files:', items=bad_files)] | 419 'Found a bad license header in these files:', items=bad_files)] |
420 return [] | 420 return [] |
421 | 421 |
422 | 422 |
423 def CheckChangeSvnEolStyle(input_api, output_api, source_file_filter=None): | |
424 """Checks that the source files have svn:eol-style=LF.""" | |
425 return CheckSvnProperty(input_api, output_api, | |
426 'svn:eol-style', 'LF', | |
427 input_api.AffectedSourceFiles(source_file_filter)) | |
428 | |
429 | |
430 def CheckSvnForCommonMimeTypes(input_api, output_api): | |
431 """Checks that common binary file types have the correct svn:mime-type.""" | |
432 output = [] | |
433 files = input_api.AffectedFiles(include_deletes=False) | |
434 def IsExts(x, exts): | |
435 path = x.LocalPath() | |
436 for extension in exts: | |
437 if path.endswith(extension): | |
438 return True | |
439 return False | |
440 def FilterFiles(extension): | |
441 return filter(lambda x: IsExts(x, extension), files) | |
442 def RunCheck(mime_type, files): | |
443 output.extend(CheckSvnProperty(input_api, output_api, 'svn:mime-type', | |
444 mime_type, files)) | |
445 RunCheck('application/pdf', FilterFiles(['.pdf'])) | |
446 RunCheck('image/bmp', FilterFiles(['.bmp'])) | |
447 RunCheck('image/gif', FilterFiles(['.gif'])) | |
448 RunCheck('image/png', FilterFiles(['.png'])) | |
449 RunCheck('image/jpeg', FilterFiles(['.jpg', '.jpeg', '.jpe'])) | |
450 RunCheck('image/vnd.microsoft.icon', FilterFiles(['.ico'])) | |
451 return output | |
452 | |
453 | |
454 def CheckSvnProperty(input_api, output_api, prop, expected, affected_files): | |
455 """Checks that affected_files files have prop=expected.""" | |
456 if input_api.change.scm != 'svn': | |
457 return [] | |
458 | |
459 bad = filter(lambda f: f.Property(prop) != expected, affected_files) | |
460 if bad: | |
461 if input_api.is_committing: | |
462 res_type = output_api.PresubmitError | |
463 else: | |
464 res_type = output_api.PresubmitNotifyResult | |
465 message = 'Run the command: svn pset %s %s \\' % (prop, expected) | |
466 return [res_type(message, items=bad)] | |
467 return [] | |
468 | |
469 | |
470 ### Other checks | 423 ### Other checks |
471 | 424 |
472 def CheckDoNotSubmit(input_api, output_api): | 425 def CheckDoNotSubmit(input_api, output_api): |
473 return ( | 426 return ( |
474 CheckDoNotSubmitInDescription(input_api, output_api) + | 427 CheckDoNotSubmitInDescription(input_api, output_api) + |
475 CheckDoNotSubmitInFiles(input_api, output_api) | 428 CheckDoNotSubmitInFiles(input_api, output_api) |
476 ) | 429 ) |
477 | 430 |
478 | 431 |
479 def CheckTreeIsOpen(input_api, output_api, | 432 def CheckTreeIsOpen(input_api, output_api, |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 input_api, output_api, maxlen, source_file_filter=sources)) | 1070 input_api, output_api, maxlen, source_file_filter=sources)) |
1118 snapshot( "checking tabs") | 1071 snapshot( "checking tabs") |
1119 results.extend(input_api.canned_checks.CheckChangeHasNoTabs( | 1072 results.extend(input_api.canned_checks.CheckChangeHasNoTabs( |
1120 input_api, output_api, source_file_filter=sources)) | 1073 input_api, output_api, source_file_filter=sources)) |
1121 snapshot( "checking stray whitespace") | 1074 snapshot( "checking stray whitespace") |
1122 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( | 1075 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace( |
1123 input_api, output_api, source_file_filter=sources)) | 1076 input_api, output_api, source_file_filter=sources)) |
1124 snapshot("checking nsobjects") | 1077 snapshot("checking nsobjects") |
1125 results.extend(_CheckConstNSObject( | 1078 results.extend(_CheckConstNSObject( |
1126 input_api, output_api, source_file_filter=sources)) | 1079 input_api, output_api, source_file_filter=sources)) |
1127 snapshot("checking eol style") | |
1128 results.extend(input_api.canned_checks.CheckChangeSvnEolStyle( | |
1129 input_api, output_api, source_file_filter=text_files)) | |
1130 snapshot("checking license") | 1080 snapshot("checking license") |
1131 results.extend(input_api.canned_checks.CheckLicense( | 1081 results.extend(input_api.canned_checks.CheckLicense( |
1132 input_api, output_api, license_header, source_file_filter=sources)) | 1082 input_api, output_api, license_header, source_file_filter=sources)) |
1133 | 1083 |
1134 if input_api.is_committing: | 1084 if input_api.is_committing: |
1135 snapshot("checking svn mime types") | |
1136 results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes( | |
1137 input_api, output_api)) | |
1138 snapshot("checking was uploaded") | 1085 snapshot("checking was uploaded") |
1139 results.extend(input_api.canned_checks.CheckChangeWasUploaded( | 1086 results.extend(input_api.canned_checks.CheckChangeWasUploaded( |
1140 input_api, output_api)) | 1087 input_api, output_api)) |
1141 snapshot("checking description") | 1088 snapshot("checking description") |
1142 results.extend(input_api.canned_checks.CheckChangeHasDescription( | 1089 results.extend(input_api.canned_checks.CheckChangeHasDescription( |
1143 input_api, output_api)) | 1090 input_api, output_api)) |
1144 results.extend(input_api.canned_checks.CheckDoNotSubmitInDescription( | 1091 results.extend(input_api.canned_checks.CheckDoNotSubmitInDescription( |
1145 input_api, output_api)) | 1092 input_api, output_api)) |
1146 snapshot("checking do not submit in files") | 1093 snapshot("checking do not submit in files") |
1147 results.extend(input_api.canned_checks.CheckDoNotSubmitInFiles( | 1094 results.extend(input_api.canned_checks.CheckDoNotSubmitInFiles( |
(...skipping 30 matching lines...) Expand all Loading... |
1178 for f in affected_files: | 1125 for f in affected_files: |
1179 cmd = ['gn', 'format', '--dry-run', f.AbsoluteLocalPath()] | 1126 cmd = ['gn', 'format', '--dry-run', f.AbsoluteLocalPath()] |
1180 rc = gn.main(cmd) | 1127 rc = gn.main(cmd) |
1181 if rc == 2: | 1128 if rc == 2: |
1182 warnings.append(output_api.PresubmitPromptWarning( | 1129 warnings.append(output_api.PresubmitPromptWarning( |
1183 '%s requires formatting. Please run:\n gn format %s' % ( | 1130 '%s requires formatting. Please run:\n gn format %s' % ( |
1184 f.AbsoluteLocalPath(), f.LocalPath()))) | 1131 f.AbsoluteLocalPath(), f.LocalPath()))) |
1185 # It's just a warning, so ignore other types of failures assuming they'll be | 1132 # It's just a warning, so ignore other types of failures assuming they'll be |
1186 # caught elsewhere. | 1133 # caught elsewhere. |
1187 return warnings | 1134 return warnings |
OLD | NEW |