From 41e8f1876e400de116dea8aa20cfebe4c10f9692 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 25 Sep 2013 15:28:03 -0400 Subject: [PATCH] Add script for mapping reviews to bugs and their milestones Change-Id: Iaca8ee0e0bdd353e28ab819b561b550b58e075e2 --- genresults-openreviews.sh | 1 + reviews_for_bugs.py | 86 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100755 reviews_for_bugs.py diff --git a/genresults-openreviews.sh b/genresults-openreviews.sh index 07f3cde..0327574 100755 --- a/genresults-openreviews.sh +++ b/genresults-openreviews.sh @@ -18,6 +18,7 @@ for project in ${projects} ; do (date -u && echo && ./openreviews.py -p ${project}) > results/${project_base}-openreviews.txt ./openreviews.py -p ${project} --html > results/${project_base}-openreviews.html (date -u && echo && ./openapproved.py -p ${project}) > results/${project_base}-openapproved.txt + (date -u && echo && ./reviews_for_bugs.py -p ${project}) > results/${project_base}-reviews-for-bugs.txt done if [ "${all}" = "1" ] ; then diff --git a/reviews_for_bugs.py b/reviews_for_bugs.py new file mode 100755 index 0000000..e707cfa --- /dev/null +++ b/reviews_for_bugs.py @@ -0,0 +1,86 @@ +#!/usr/bin/python +# +# Copyright 2013 Russell Bryant +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from argparse import ArgumentParser +import getpass +from launchpadlib.launchpad import Launchpad +import re +import sys + +import utils + + +def main(): + parser = ArgumentParser( + description="Get reviews for open bugs against a milestone") + parser.add_argument('-p', '--project', default='projects/nova.json', + help='JSON file describing the project to generate stats for') + parser.add_argument('-u', '--user', default=getpass.getuser(), + help='gerrit user') + parser.add_argument('-k', '--key', default=None, help='ssh key for gerrit') + + args = parser.parse_args() + + projects = utils.get_projects_info(args.project, False) + project_name = projects[0]['name'] + + if not projects: + print "Please specify a project." + return 1 + + launchpad = Launchpad.login_with('openstack-releasing', 'production') + proj = launchpad.projects[project_name] + statuses = ['New', 'Incomplete', 'Confirmed', 'Triaged', 'In Progress'] + bugtasks = proj.searchTasks(status=statuses) + bugs_by_id = {} + for bt in bugtasks: + bugs_by_id[str(bt.bug.id)] = bt + + milestones = {} + + changes = utils.get_changes(projects, args.user, args.key, only_open=True) + bug_regex = re.compile('bug/(\d+)') + for change in changes: + if 'topic' not in change: + continue + match = bug_regex.match(change['topic']) + if not match: + continue + bugid = match.group(1) + try: + bugtask = bugs_by_id[bugid] + milestone = str(bugtask.milestone).split('/')[-1] + if milestone == 'None': + milestone = 'Untargeted' + except KeyError: + milestone = 'Bug does not exist for this project' + + milestones.setdefault(milestone, []) + milestones[milestone].append((change['url'], bugid)) + + print 'Reviews for bugs grouped by milestone for project: %s\n' % ( + project_name) + + for milestone, reviews in milestones.items(): + print 'Milestone: %s' % milestone + for review, bugid in reviews: + print '--> %s -- https://bugs.launchpad.net/%s/+bug/%s' % (review, + project_name, bugid) + print + +if __name__ == '__main__': + sys.exit(main())