OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 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 """\ | 6 """\ |
7 Wrapper script around Rietveld's upload.py that simplifies working with groups | 7 Wrapper script around Rietveld's upload.py that simplifies working with groups |
8 of files. | 8 of files. |
9 """ | 9 """ |
10 | 10 |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 def GenerateDiff(files, root=None): | 756 def GenerateDiff(files, root=None): |
757 return SVN.GenerateDiff(files, root=root) | 757 return SVN.GenerateDiff(files, root=root) |
758 | 758 |
759 | 759 |
760 def OptionallyDoPresubmitChecks(change_info, committing, args): | 760 def OptionallyDoPresubmitChecks(change_info, committing, args): |
761 if FilterFlag(args, "--no_presubmit") or FilterFlag(args, "--force"): | 761 if FilterFlag(args, "--no_presubmit") or FilterFlag(args, "--force"): |
762 return presubmit_support.PresubmitOutput() | 762 return presubmit_support.PresubmitOutput() |
763 return DoPresubmitChecks(change_info, committing, True) | 763 return DoPresubmitChecks(change_info, committing, True) |
764 | 764 |
765 | 765 |
766 def suggest_reviewers(change_info, affected_files): | |
767 owners_db = owners.Database(change_info.GetLocalRoot(), fopen=file, | |
768 os_path=os.path) | |
769 return owners_db.reviewers_for([f[1] for f in affected_files]) | |
770 | |
771 | |
772 def defer_attributes(a, b): | 766 def defer_attributes(a, b): |
773 """Copy attributes from an object (like a function) to another.""" | 767 """Copy attributes from an object (like a function) to another.""" |
774 for x in dir(a): | 768 for x in dir(a): |
775 if not getattr(b, x, None): | 769 if not getattr(b, x, None): |
776 setattr(b, x, getattr(a, x)) | 770 setattr(b, x, getattr(a, x)) |
777 | 771 |
778 | 772 |
779 def need_change(function): | 773 def need_change(function): |
780 """Converts args -> change_info.""" | 774 """Converts args -> change_info.""" |
781 # pylint: disable=W0612,W0621 | 775 # pylint: disable=W0612,W0621 |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 description = change_info.description | 1085 description = change_info.description |
1092 | 1086 |
1093 other_files = GetFilesNotInCL() | 1087 other_files = GetFilesNotInCL() |
1094 | 1088 |
1095 # Edited files (as opposed to files with only changed properties) will have | 1089 # Edited files (as opposed to files with only changed properties) will have |
1096 # a letter for the first character in the status string. | 1090 # a letter for the first character in the status string. |
1097 file_re = re.compile(r"^[a-z].+\Z", re.IGNORECASE) | 1091 file_re = re.compile(r"^[a-z].+\Z", re.IGNORECASE) |
1098 affected_files = [x for x in other_files if file_re.match(x[0])] | 1092 affected_files = [x for x in other_files if file_re.match(x[0])] |
1099 unaffected_files = [x for x in other_files if not file_re.match(x[0])] | 1093 unaffected_files = [x for x in other_files if not file_re.match(x[0])] |
1100 | 1094 |
1101 if not change_info.reviewers: | |
1102 files_for_review = affected_files[:] | |
1103 files_for_review.extend(change_info.GetFiles()) | |
1104 suggested_reviewers = suggest_reviewers(change_info, files_for_review) | |
1105 if suggested_reviewers: | |
1106 reviewers_re = re.compile(REVIEWERS_REGEX) | |
1107 if not any(reviewers_re.match(l) for l in description.splitlines()): | |
1108 description += '\n\nR=' + ','.join(suggested_reviewers) | |
1109 | |
1110 description = description.rstrip() + '\n' | 1095 description = description.rstrip() + '\n' |
1111 | 1096 |
1112 separator1 = ("\n---All lines above this line become the description.\n" | 1097 separator1 = ("\n---All lines above this line become the description.\n" |
1113 "---Repository Root: " + change_info.GetLocalRoot() + "\n" | 1098 "---Repository Root: " + change_info.GetLocalRoot() + "\n" |
1114 "---Paths in this changelist (" + change_info.name + "):\n") | 1099 "---Paths in this changelist (" + change_info.name + "):\n") |
1115 separator2 = "\n\n---Paths modified but not in any changelist:\n\n" | 1100 separator2 = "\n\n---Paths modified but not in any changelist:\n\n" |
1116 text = (description + separator1 + '\n' + | 1101 text = (description + separator1 + '\n' + |
1117 '\n'.join([f[0] + f[1] for f in change_info.GetFiles()])) | 1102 '\n'.join([f[0] + f[1] for f in change_info.GetFiles()])) |
1118 | 1103 |
1119 if change_info.Exists(): | 1104 if change_info.Exists(): |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1467 if e.code != 500: | 1452 if e.code != 500: |
1468 raise | 1453 raise |
1469 print >> sys.stderr, ( | 1454 print >> sys.stderr, ( |
1470 'AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' | 1455 'AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' |
1471 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)) | 1456 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)) |
1472 return 1 | 1457 return 1 |
1473 | 1458 |
1474 | 1459 |
1475 if __name__ == "__main__": | 1460 if __name__ == "__main__": |
1476 sys.exit(main(sys.argv[1:])) | 1461 sys.exit(main(sys.argv[1:])) |
OLD | NEW |