OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 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 """Enables directory-specific presubmit checks to run at upload and/or commit. | 6 """Enables directory-specific presubmit checks to run at upload and/or commit. |
7 """ | 7 """ |
8 | 8 |
9 __version__ = '1.6.1' | 9 __version__ = '1.6.1' |
10 | 10 |
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 rietveld: rietveld object. | 1028 rietveld: rietveld object. |
1029 | 1029 |
1030 Warning: | 1030 Warning: |
1031 If may_prompt is true, output_stream SHOULD be sys.stdout and input_stream | 1031 If may_prompt is true, output_stream SHOULD be sys.stdout and input_stream |
1032 SHOULD be sys.stdin. | 1032 SHOULD be sys.stdin. |
1033 | 1033 |
1034 Return: | 1034 Return: |
1035 A PresubmitOutput object. Use output.should_continue() to figure out | 1035 A PresubmitOutput object. Use output.should_continue() to figure out |
1036 if there were errors or warnings and the caller should abort. | 1036 if there were errors or warnings and the caller should abort. |
1037 """ | 1037 """ |
1038 output = PresubmitOutput(input_stream, output_stream) | 1038 old_environ = os.environ |
1039 if committing: | 1039 try: |
1040 output.write("Running presubmit commit checks ...\n") | 1040 # Make sure python subprocesses won't generate .pyc files. |
1041 else: | 1041 os.environ = os.environ.copy() |
1042 output.write("Running presubmit upload checks ...\n") | 1042 os.environ['PYTHONDONTWRITEBYTECODE'] = '1' |
1043 start_time = time.time() | |
1044 presubmit_files = ListRelevantPresubmitFiles(change.AbsoluteLocalPaths(True), | |
1045 change.RepositoryRoot()) | |
1046 if not presubmit_files and verbose: | |
1047 output.write("Warning, no presubmit.py found.\n") | |
1048 results = [] | |
1049 executer = PresubmitExecuter(change, committing, tbr, rietveld, verbose) | |
1050 if default_presubmit: | |
1051 if verbose: | |
1052 output.write("Running default presubmit script.\n") | |
1053 fake_path = os.path.join(change.RepositoryRoot(), 'PRESUBMIT.py') | |
1054 results += executer.ExecPresubmitScript(default_presubmit, fake_path) | |
1055 for filename in presubmit_files: | |
1056 filename = os.path.abspath(filename) | |
1057 if verbose: | |
1058 output.write("Running %s\n" % filename) | |
1059 # Accept CRLF presubmit script. | |
1060 presubmit_script = gclient_utils.FileRead(filename, 'rU') | |
1061 results += executer.ExecPresubmitScript(presubmit_script, filename) | |
1062 | 1043 |
1063 errors = [] | 1044 output = PresubmitOutput(input_stream, output_stream) |
1064 notifications = [] | 1045 if committing: |
1065 warnings = [] | 1046 output.write("Running presubmit commit checks ...\n") |
1066 for result in results: | |
1067 if result.fatal: | |
1068 errors.append(result) | |
1069 elif result.should_prompt: | |
1070 warnings.append(result) | |
1071 else: | 1047 else: |
1072 notifications.append(result) | 1048 output.write("Running presubmit upload checks ...\n") |
| 1049 start_time = time.time() |
| 1050 presubmit_files = ListRelevantPresubmitFiles( |
| 1051 change.AbsoluteLocalPaths(True), change.RepositoryRoot()) |
| 1052 if not presubmit_files and verbose: |
| 1053 output.write("Warning, no presubmit.py found.\n") |
| 1054 results = [] |
| 1055 executer = PresubmitExecuter(change, committing, tbr, rietveld, verbose) |
| 1056 if default_presubmit: |
| 1057 if verbose: |
| 1058 output.write("Running default presubmit script.\n") |
| 1059 fake_path = os.path.join(change.RepositoryRoot(), 'PRESUBMIT.py') |
| 1060 results += executer.ExecPresubmitScript(default_presubmit, fake_path) |
| 1061 for filename in presubmit_files: |
| 1062 filename = os.path.abspath(filename) |
| 1063 if verbose: |
| 1064 output.write("Running %s\n" % filename) |
| 1065 # Accept CRLF presubmit script. |
| 1066 presubmit_script = gclient_utils.FileRead(filename, 'rU') |
| 1067 results += executer.ExecPresubmitScript(presubmit_script, filename) |
1073 | 1068 |
1074 output.write('\n') | 1069 errors = [] |
1075 for name, items in (('Messages', notifications), | 1070 notifications = [] |
1076 ('Warnings', warnings), | 1071 warnings = [] |
1077 ('ERRORS', errors)): | 1072 for result in results: |
1078 if items: | 1073 if result.fatal: |
1079 output.write('** Presubmit %s **\n' % name) | 1074 errors.append(result) |
1080 for item in items: | 1075 elif result.should_prompt: |
1081 item.handle(output) | 1076 warnings.append(result) |
1082 output.write('\n') | 1077 else: |
| 1078 notifications.append(result) |
1083 | 1079 |
1084 total_time = time.time() - start_time | 1080 output.write('\n') |
1085 if total_time > 1.0: | 1081 for name, items in (('Messages', notifications), |
1086 output.write("Presubmit checks took %.1fs to calculate.\n\n" % total_time) | 1082 ('Warnings', warnings), |
| 1083 ('ERRORS', errors)): |
| 1084 if items: |
| 1085 output.write('** Presubmit %s **\n' % name) |
| 1086 for item in items: |
| 1087 item.handle(output) |
| 1088 output.write('\n') |
1087 | 1089 |
1088 if not errors: | 1090 total_time = time.time() - start_time |
1089 if not warnings: | 1091 if total_time > 1.0: |
1090 output.write('Presubmit checks passed.\n') | 1092 output.write("Presubmit checks took %.1fs to calculate.\n\n" % total_time) |
1091 elif may_prompt: | |
1092 output.prompt_yes_no('There were presubmit warnings. ' | |
1093 'Are you sure you wish to continue? (y/N): ') | |
1094 else: | |
1095 output.fail() | |
1096 | 1093 |
1097 global _ASKED_FOR_FEEDBACK | 1094 if not errors: |
1098 # Ask for feedback one time out of 5. | 1095 if not warnings: |
1099 if (len(results) and random.randint(0, 4) == 0 and not _ASKED_FOR_FEEDBACK): | 1096 output.write('Presubmit checks passed.\n') |
1100 output.write("Was the presubmit check useful? Please send feedback " | 1097 elif may_prompt: |
1101 "& hate mail to maruel@chromium.org!\n") | 1098 output.prompt_yes_no('There were presubmit warnings. ' |
1102 _ASKED_FOR_FEEDBACK = True | 1099 'Are you sure you wish to continue? (y/N): ') |
1103 return output | 1100 else: |
| 1101 output.fail() |
| 1102 |
| 1103 global _ASKED_FOR_FEEDBACK |
| 1104 # Ask for feedback one time out of 5. |
| 1105 if (len(results) and random.randint(0, 4) == 0 and not _ASKED_FOR_FEEDBACK): |
| 1106 output.write("Was the presubmit check useful? Please send feedback " |
| 1107 "& hate mail to maruel@chromium.org!\n") |
| 1108 _ASKED_FOR_FEEDBACK = True |
| 1109 return output |
| 1110 finally: |
| 1111 os.environ = old_environ |
1104 | 1112 |
1105 | 1113 |
1106 def ScanSubDirs(mask, recursive): | 1114 def ScanSubDirs(mask, recursive): |
1107 if not recursive: | 1115 if not recursive: |
1108 return [x for x in glob.glob(mask) if '.svn' not in x and '.git' not in x] | 1116 return [x for x in glob.glob(mask) if '.svn' not in x and '.git' not in x] |
1109 else: | 1117 else: |
1110 results = [] | 1118 results = [] |
1111 for root, dirs, files in os.walk('.'): | 1119 for root, dirs, files in os.walk('.'): |
1112 if '.svn' in dirs: | 1120 if '.svn' in dirs: |
1113 dirs.remove('.svn') | 1121 dirs.remove('.svn') |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 except PresubmitFailure, e: | 1213 except PresubmitFailure, e: |
1206 print >> sys.stderr, e | 1214 print >> sys.stderr, e |
1207 print >> sys.stderr, 'Maybe your depot_tools is out of date?' | 1215 print >> sys.stderr, 'Maybe your depot_tools is out of date?' |
1208 print >> sys.stderr, 'If all fails, contact maruel@' | 1216 print >> sys.stderr, 'If all fails, contact maruel@' |
1209 return 2 | 1217 return 2 |
1210 | 1218 |
1211 | 1219 |
1212 if __name__ == '__main__': | 1220 if __name__ == '__main__': |
1213 fix_encoding.fix_encoding() | 1221 fix_encoding.fix_encoding() |
1214 sys.exit(Main(None)) | 1222 sys.exit(Main(None)) |
OLD | NEW |