Added time-based score for patches

Based on the number of days since the last patch was posted

Also added a tooltip to explain scores

Change-Id: I1f13a97ddd8714297a331be91146f9742bbb9766
This commit is contained in:
Bob Ball 2013-07-26 17:26:56 +01:00 committed by Dan Prince
parent e2c0efd86f
commit 0dfad93f30
4 changed files with 39 additions and 19 deletions

View File

@ -1,6 +1,7 @@
#!/usr/bin/env python
from datetime import datetime
from time import time
from reviewday.gerrit import reviews as gerrit_reviews
from reviewday.util import create_report
from reviewday.launchpad import LaunchPad
@ -21,13 +22,14 @@ smoker = SmokeStack('https://smokestack.openstack.org/jobs.json?limit=10000')
projects = {}
for project in ['nova', 'glance', 'keystone', 'swift', 'neutron', 'cinder',
cur_timestamp = time()
for project in ['nova', 'glance', 'keystone', 'swift', 'quantum', 'cinder',
'tempest', 'heat', 'ceilometer']:
if project not in projects:
projects[project] = []
for review in gerrit_reviews(project):
try:
mp = MergeProp(lp, smoker, review)
mp = MergeProp(lp, smoker, review, cur_timestamp)
projects[project].append(mp)
except:
print 'Error creating merge prop %s' % review

View File

@ -22,7 +22,11 @@ def fail_status(job_data, token):
def review_feedback(mp):
return '&#13'.join(mp.feedback)
return '
'.join(mp.feedback)
def review_score(mp):
return '
'.join(mp.reason)
def display_feedback(mp):

View File

@ -1,22 +1,22 @@
class MergeProp(object):
def _calc_score(self, lp, project, topic):
def _calc_score(self, lp, cur_timestamp):
cause = 'No link'
try:
if topic.find('bug/') == 0:
bug = lp.bug(topic[4:])
if self.topic.find('bug/') == 0:
bug = lp.bug(self.topic[4:])
#FIXME: bug.importance doesn't seem to work but it should?
cause = '%s bugfix' % bug.bug_tasks[0].importance
elif topic.find('bp/') == 0:
spec = lp.specification(project, topic[3:])
elif self.topic.find('bp/') == 0:
spec = lp.specification(self.project, self.topic[3:])
if spec:
cause = '%s feature' % spec.priority
else:
spec = lp.specification(project, topic)
spec = lp.specification(self.project, self.topic)
if spec:
cause = '%s feature' % spec.priority
except:
print 'WARNING: unable to find cause for %s' % topic
print 'WARNING: unable to find cause for %s' % self.topic
cause = 'No link'
cause_score = {
@ -37,11 +37,22 @@ class MergeProp(object):
}
if cause not in cause_score:
print 'WARNING: unable to find score for (%s, %s)' % (topic, cause)
return ("Unknown cause: " + cause, 0)
return (cause, cause_score[cause])
print 'WARNING: unable to find score for ' \
'(%s, %s)' % (self.topic, cause)
return ("No link", "Unknown cause: " + cause, 0)
score = cause_score[cause]
reason = [cause + " (+%d)" % (score)]
# Add a score based on the time the patch has been waiting for approval
days_old = int((cur_timestamp - self.revisionCreatedOn) / 86400)
if ((days_old > 0) and (self.lowest_feedback != -2)):
# A medium bugfix will have to be around for 10 days before it is
# ranked higher than a low feature.
days_old_score = 3 * days_old
reason.append("%d days old (+%d)" % (days_old, days_old_score))
score = score + days_old_score
return (cause, reason, score)
def __init__(self, lp, smoker, review):
def __init__(self, lp, smoker, review, cur_timestamp):
self.owner_name = review['owner']['name']
self.url = '%s/#change,%s' % tuple(review['url'].rsplit('/', 1))
self.subject = review['subject']
@ -52,10 +63,8 @@ class MergeProp(object):
self.topic = ''
self.revision = review['currentPatchSet']['revision']
self.refspec = review['currentPatchSet']['ref']
self.revisionCreatedOn = review['currentPatchSet']['createdOn']
self.number = review['number']
cause, score = self._calc_score(lp, self.project, self.topic)
self.score = score
self.cause = cause
self.jobs = smoker.jobs(self.revision[:7])
self.feedback = []
@ -69,3 +78,9 @@ class MergeProp(object):
self.lowest_feedback = min(self.lowest_feedback, value) or value
self.highest_feedback = max(self.highest_feedback, value) or value
# Make use of the feedback in calculating the score
cause, reason, score = self._calc_score(lp, cur_timestamp)
self.score = score
self.reason = reason
self.cause = cause

View File

@ -93,8 +93,7 @@
$mp.owner_name
</td>
<td>
<span class="sortkey">$mp.score</span>
$mp.score
<a title="$helper.review_score($mp)">$mp.score</a>
</td>
<td>
<a title="$helper.review_feedback($mp)">$helper.display_feedback($mp)</a>