OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """Get stats about your activity. | 6 """Get stats about your activity. |
7 | 7 |
8 Example: | 8 Example: |
9 - my_activity.py for stats for the current week (last week on mondays). | 9 - my_activity.py for stats for the current week (last week on mondays). |
10 - my_activity.py -Q for stats for last quarter. | 10 - my_activity.py -Q for stats for last quarter. |
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
790 except ImportError: | 790 except ImportError: |
791 print "Failed to import WebKit committer list, skipping WebKit checks." | 791 print "Failed to import WebKit committer list, skipping WebKit checks." |
792 self.webkit_repo = None | 792 self.webkit_repo = None |
793 return | 793 return |
794 | 794 |
795 if not webkit_account(self.user): | 795 if not webkit_account(self.user): |
796 email = self.user + "@chromium.org" | 796 email = self.user + "@chromium.org" |
797 print "No %s in committers.py, skipping WebKit checks." % email | 797 print "No %s in committers.py, skipping WebKit checks." % email |
798 self.webkit_repo = None | 798 self.webkit_repo = None |
799 | 799 |
800 def print_heading(self, heading): | |
801 print | |
802 print self.options.output_format_heading.format(heading=heading) | |
803 | |
800 def print_change(self, change): | 804 def print_change(self, change): |
801 optional_values = { | 805 optional_values = { |
802 'reviewers': ', '.join(change['reviewers']) | 806 'reviewers': ', '.join(change['reviewers']) |
803 } | 807 } |
804 self.print_generic(self.options.output_format, | 808 self.print_generic(self.options.output_format, |
805 self.options.output_format_changes, | 809 self.options.output_format_changes, |
806 change['header'], | 810 change['header'], |
807 change['review_url'], | 811 change['review_url'], |
808 change['author'], | 812 change['author'], |
809 optional_values) | 813 optional_values) |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
887 self.changes += self.rietveld_search(instance, owner=self.user) | 891 self.changes += self.rietveld_search(instance, owner=self.user) |
888 | 892 |
889 for instance in gerrit_instances: | 893 for instance in gerrit_instances: |
890 self.changes += self.gerrit_search(instance, owner=self.user) | 894 self.changes += self.gerrit_search(instance, owner=self.user) |
891 | 895 |
892 for instance in git_instances: | 896 for instance in git_instances: |
893 self.changes += self.git_search(instance, owner=self.user) | 897 self.changes += self.git_search(instance, owner=self.user) |
894 | 898 |
895 def print_changes(self): | 899 def print_changes(self): |
896 if self.changes: | 900 if self.changes: |
897 print '\nChanges:' | 901 self.print_heading('Changes') |
898 for change in self.changes: | 902 for change in self.changes: |
899 self.print_change(change) | 903 self.print_change(change) |
900 | 904 |
901 def get_reviews(self): | 905 def get_reviews(self): |
902 for instance in rietveld_instances: | 906 for instance in rietveld_instances: |
903 self.reviews += self.rietveld_search(instance, reviewer=self.user) | 907 self.reviews += self.rietveld_search(instance, reviewer=self.user) |
904 | 908 |
905 for instance in gerrit_instances: | 909 for instance in gerrit_instances: |
906 reviews = self.gerrit_search(instance, reviewer=self.user) | 910 reviews = self.gerrit_search(instance, reviewer=self.user) |
907 reviews = filter(lambda r: not username(r['owner']) == self.user, reviews) | 911 reviews = filter(lambda r: not username(r['owner']) == self.user, reviews) |
908 self.reviews += reviews | 912 self.reviews += reviews |
909 | 913 |
910 for instance in git_instances: | 914 for instance in git_instances: |
911 self.reviews += self.git_search(instance, reviewer=self.user) | 915 self.reviews += self.git_search(instance, reviewer=self.user) |
912 | 916 |
913 def print_reviews(self): | 917 def print_reviews(self): |
914 if self.reviews: | 918 if self.reviews: |
915 print '\nReviews:' | 919 self.print_heading('Reviews') |
916 for review in self.reviews: | 920 for review in self.reviews: |
917 self.print_review(review) | 921 self.print_review(review) |
918 | 922 |
919 def get_issues(self): | 923 def get_issues(self): |
920 for project in google_code_projects: | 924 for project in google_code_projects: |
921 self.issues += self.google_code_issue_search(project) | 925 self.issues += self.google_code_issue_search(project) |
922 | 926 |
923 for instance in bugzilla_instances: | 927 for instance in bugzilla_instances: |
924 self.issues += self.bugzilla_issues(instance, self.user) | 928 self.issues += self.bugzilla_issues(instance, self.user) |
925 | 929 |
926 def print_issues(self): | 930 def print_issues(self): |
927 if self.issues: | 931 if self.issues: |
928 print '\nIssues:' | 932 self.print_heading('Issues') |
929 for issue in self.issues: | 933 for issue in self.issues: |
930 self.print_issue(issue) | 934 self.print_issue(issue) |
931 | 935 |
932 def process_activities(self): | 936 def process_activities(self): |
933 # If a webkit bug was a review, don't list it as an issue. | 937 # If a webkit bug was a review, don't list it as an issue. |
934 ids = {} | 938 ids = {} |
935 for review in self.reviews + self.changes: | 939 for review in self.reviews + self.changes: |
936 if 'webkit_bug_id' in review: | 940 if 'webkit_bug_id' in review: |
937 ids[review['webkit_bug_id']] = True | 941 ids[review['webkit_bug_id']] = True |
938 | 942 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1024 'additional variable {reviewers}') | 1028 'additional variable {reviewers}') |
1025 output_format_group.add_option( | 1029 output_format_group.add_option( |
1026 '--output-format-issues', metavar='<format>', | 1030 '--output-format-issues', metavar='<format>', |
1027 default=None, | 1031 default=None, |
1028 help='Specifies the format to use when printing issues. Supports the ' | 1032 help='Specifies the format to use when printing issues. Supports the ' |
1029 'additional variable {owner}.') | 1033 'additional variable {owner}.') |
1030 output_format_group.add_option( | 1034 output_format_group.add_option( |
1031 '--output-format-reviews', metavar='<format>', | 1035 '--output-format-reviews', metavar='<format>', |
1032 default=None, | 1036 default=None, |
1033 help='Specifies the format to use when printing reviews.') | 1037 help='Specifies the format to use when printing reviews.') |
1038 output_format_group.add_option( | |
1039 '--output-format-heading', metavar='<format>', | |
1040 default=u'{heading}:', | |
1041 help='Specifies the format to use when printing headings.') | |
1042 output_format_group.add_option( | |
1043 '--markdown', action='store_true', | |
deymo
2013/12/17 01:38:16
I'm up for a '-m' short option as well. It looks l
jsbell
2013/12/17 18:59:55
Done.
| |
1044 help='Use markdown-friendly output formats') | |
deymo
2013/12/17 01:38:16
hmm... I'd add a note about the fact that this ove
jsbell
2013/12/17 18:59:55
Done.
| |
1034 parser.add_option_group(output_format_group) | 1045 parser.add_option_group(output_format_group) |
1035 | 1046 |
1036 # Remove description formatting | 1047 # Remove description formatting |
1037 parser.format_description = ( | 1048 parser.format_description = ( |
1038 lambda _: parser.description) # pylint: disable=E1101 | 1049 lambda _: parser.description) # pylint: disable=E1101 |
1039 | 1050 |
1040 options, args = parser.parse_args() | 1051 options, args = parser.parse_args() |
1041 options.local_user = os.environ.get('USER') | 1052 options.local_user = os.environ.get('USER') |
1042 if args: | 1053 if args: |
1043 parser.error('Args unsupported') | 1054 parser.error('Args unsupported') |
(...skipping 12 matching lines...) Expand all Loading... | |
1056 else: | 1067 else: |
1057 begin, end = (get_week_of(datetime.today() - timedelta(days=1))) | 1068 begin, end = (get_week_of(datetime.today() - timedelta(days=1))) |
1058 else: | 1069 else: |
1059 begin = datetime.strptime(options.begin, '%m/%d/%y') | 1070 begin = datetime.strptime(options.begin, '%m/%d/%y') |
1060 if options.end: | 1071 if options.end: |
1061 end = datetime.strptime(options.end, '%m/%d/%y') | 1072 end = datetime.strptime(options.end, '%m/%d/%y') |
1062 else: | 1073 else: |
1063 end = datetime.today() | 1074 end = datetime.today() |
1064 options.begin, options.end = begin, end | 1075 options.begin, options.end = begin, end |
1065 | 1076 |
1077 if options.markdown: | |
1078 options.output_format = ' * [{title}]({url})' | |
1079 options.output_format_heading = '## {heading} ##' | |
deymo
2013/12/17 01:38:16
I think that ## is too high. When the snippets are
jsbell
2013/12/17 18:59:55
Done.
| |
1080 | |
1066 print 'Searching for activity by %s' % options.user | 1081 print 'Searching for activity by %s' % options.user |
1067 print 'Using range %s to %s' % (options.begin, options.end) | 1082 print 'Using range %s to %s' % (options.begin, options.end) |
1068 | 1083 |
1069 my_activity = MyActivity(options) | 1084 my_activity = MyActivity(options) |
1070 | 1085 |
1071 if not (options.changes or options.reviews or options.issues): | 1086 if not (options.changes or options.reviews or options.issues): |
1072 options.changes = True | 1087 options.changes = True |
1073 options.issues = True | 1088 options.issues = True |
1074 options.reviews = True | 1089 options.reviews = True |
1075 | 1090 |
(...skipping 20 matching lines...) Expand all Loading... | |
1096 print '\n\n\n' | 1111 print '\n\n\n' |
1097 | 1112 |
1098 my_activity.print_changes() | 1113 my_activity.print_changes() |
1099 my_activity.print_reviews() | 1114 my_activity.print_reviews() |
1100 my_activity.print_issues() | 1115 my_activity.print_issues() |
1101 return 0 | 1116 return 0 |
1102 | 1117 |
1103 | 1118 |
1104 if __name__ == '__main__': | 1119 if __name__ == '__main__': |
1105 sys.exit(main()) | 1120 sys.exit(main()) |
OLD | NEW |