Merge lp:~brian-murray/merge-o-matic/sort-by-age into lp:merge-o-matic

Proposed by Brian Murray
Status: Merged
Merged at revision: 245
Proposed branch: lp:~brian-murray/merge-o-matic/sort-by-age
Merge into: lp:merge-o-matic
Diff against target: 374 lines (+103/-29)
3 files modified
manual-status.py (+27/-13)
merge-status.py (+31/-15)
momlib.py (+45/-1)
To merge this branch: bzr merge lp:~brian-murray/merge-o-matic/sort-by-age
Reviewer Review Type Date Requested Status
Ubuntu Core Development Team Pending
Review via email: mp+264653@code.launchpad.net

Description of the change

This resolve LP: #881487 regarding sorting the outstanding merges by their age with the oldest appearing first.

I've also disabled the updated section since it incorrectly included a large number of packages see LP: #1474139.

To post a comment you must log in.
250. By Brian Murray

rename set_priority to get_importance, add a docstring for it. rename priority_idx to colour_idx.

251. By Brian Murray

add bug reference to clarify disabling of updated section

252. By Brian Murray

remove unused launchpad items, resolve issue with print statement

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'manual-status.py'
--- manual-status.py 2015-07-08 16:40:05 +0000
+++ manual-status.py 2015-07-14 20:35:53 +0000
@@ -19,11 +19,12 @@
1919
20from __future__ import print_function, with_statement20from __future__ import print_function, with_statement
2121
22import bz2
22import os23import os
23import bz2
24import re24import re
25import time25import time
2626
27from datetime import datetime
27from rfc822 import parseaddr28from rfc822 import parseaddr
28from momlib import *29from momlib import *
2930
@@ -99,7 +100,13 @@
99 except IndexError:100 except IndexError:
100 pass101 pass
101102
102 priority_idx = PRIORITY.index(adjusted_priority(our_source))103 date_superseded = get_date_superseded(source["Package"],
104 base_version)
105 if not date_superseded:
106 age = datetime.datetime.utcnow() - datetime.datetime.utcnow()
107 else:
108 age = datetime.datetime.utcnow() - date_superseded.replace(tzinfo=None)
109 days_old = age.days
103110
104 filename = changes_file(our_distro, our_source)111 filename = changes_file(our_distro, our_source)
105 if os.path.isfile(filename):112 if os.path.isfile(filename):
@@ -114,7 +121,9 @@
114 multi_para=False, signed=False).para121 multi_para=False, signed=False).para
115122
116 user = info["Changed-By"]123 user = info["Changed-By"]
117 uploaded = info["Distribution"] == OUR_DIST124 # not enough to determine if it is updated LP: #1474139
125 # uploaded = info["Distribution"] == OUR_DIST
126 uploaded = False
118 else:127 else:
119 user = None128 user = None
120 uploaded = False129 uploaded = False
@@ -126,7 +135,7 @@
126 else:135 else:
127 section = "new"136 section = "new"
128137
129 merges.append((section, priority_idx, package, user, uploader,138 merges.append((section, days_old, package, user, uploader,
130 our_source, our_version, src_version))139 our_source, our_version, src_version))
131140
132 write_status_page(our_component, merges, our_distro, src_distro)141 write_status_page(our_component, merges, our_distro, src_distro)
@@ -139,7 +148,7 @@
139148
140def write_status_page(component, merges, left_distro, right_distro):149def write_status_page(component, merges, left_distro, right_distro):
141 """Write out the manual merge status page."""150 """Write out the manual merge status page."""
142 merges.sort()151 merges.sort(reverse=True)
143152
144 status_file = "%s/merges/%s-manual.html" % (ROOT, component)153 status_file = "%s/merges/%s-manual.html" % (ROOT, component)
145 with open(status_file + ".new", "w") as status:154 with open(status_file + ".new", "w") as status:
@@ -235,14 +244,16 @@
235 print("<td colspan=2><b>Last Uploader</b></td>", file=status)244 print("<td colspan=2><b>Last Uploader</b></td>", file=status)
236 print("<td rowspan=2><b>Comment</b></td>", file=status)245 print("<td rowspan=2><b>Comment</b></td>", file=status)
237 print("<td rowspan=2><b>Bug</b></td>", file=status)246 print("<td rowspan=2><b>Bug</b></td>", file=status)
247 print("<td rowspan=2><b>Days Old</b></td>", file=status)
238 print("</tr>", file=status)248 print("</tr>", file=status)
239 print("<tr bgcolor=#d0d0d0>", file=status)249 print("<tr bgcolor=#d0d0d0>", file=status)
240 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)250 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)
241 print("<td><b>%s Version</b></td>" % right_distro.title(), file=status)251 print("<td><b>%s Version</b></td>" % right_distro.title(), file=status)
242 print("</tr>", file=status)252 print("</tr>", file=status)
243253
244 for uploaded, priority, package, user, uploader, source, \254 for uploaded, age, package, user, uploader, source, \
245 left_version, right_version in merges:255 left_version, right_version in merges:
256 colour_idx = get_importance(age)
246 if user is not None:257 if user is not None:
247 (usr_name, usr_mail) = parseaddr(user)258 (usr_name, usr_mail) = parseaddr(user)
248 user_lp_page = get_person_lp_page(usr_mail)259 user_lp_page = get_person_lp_page(usr_mail)
@@ -272,7 +283,7 @@
272 else:283 else:
273 who = "&nbsp;"284 who = "&nbsp;"
274285
275 print("<tr bgcolor=%s class=first>" % COLOURS[priority], file=status)286 print("<tr bgcolor=%s class=first>" % COLOURS[colour_idx], file=status)
276 print("<td><tt><a href=\"https://patches.ubuntu.com/" \287 print("<td><tt><a href=\"https://patches.ubuntu.com/" \
277 "%s/%s/%s_%s.patch\">%s</a></tt>" \288 "%s/%s/%s_%s.patch\">%s</a></tt>" \
278 % (pathhash(package), package, package, left_version, package),289 % (pathhash(package), package, package, left_version, package),
@@ -293,7 +304,7 @@
293if \"%s\" in comment:\n\304if \"%s\" in comment:\n\
294 the_comment = comment[\"%s\"]\n\305 the_comment = comment[\"%s\"]\n\
295req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\306req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\
296%%>" % (package, package, COLOURS[priority]), file=status)307%%>" % (package, package, COLOURS[colour_idx]), file=status)
297 print("</form></td>", file=status)308 print("</form></td>", file=status)
298 print("<td rowspan=2>", file=status)309 print("<td rowspan=2>", file=status)
299 print("<%%\n\310 print("<%%\n\
@@ -304,8 +315,11 @@
304\n\315\n\
305%%>" % (package, package), file=status)316%%>" % (package, package), file=status)
306 print("</td>", file=status)317 print("</td>", file=status)
318 print("<td rowspan=2>", file=status)
319 print("%s" % age, file=status)
320 print("</td>", file=status)
307 print("</tr>", file=status)321 print("</tr>", file=status)
308 print("<tr bgcolor=%s>" % COLOURS[priority], file=status)322 print("<tr bgcolor=%s>" % COLOURS[colour_idx], file=status)
309 print("<td><small>%s</small></td>" % source["Binary"], file=status)323 print("<td><small>%s</small></td>" % source["Binary"], file=status)
310 print("<td>%s</td>" % left_version, file=status)324 print("<td>%s</td>" % left_version, file=status)
311 print("<td>%s</td>" % right_version, file=status)325 print("<td>%s</td>" % right_version, file=status)
@@ -322,7 +336,7 @@
322 # not that hard to do it ourselves.336 # not that hard to do it ourselves.
323 print('[', file=status)337 print('[', file=status)
324 cur_merge = 0338 cur_merge = 0
325 for uploaded, priority, package, user, uploader, source, \339 for uploaded, age, package, user, uploader, source, \
326 left_version, right_version in merges:340 left_version, right_version in merges:
327 print(' {', end=' ', file=status)341 print(' {', end=' ', file=status)
328 # source_package, short_description, and link are for342 # source_package, short_description, and link are for
@@ -333,7 +347,7 @@
333 print('"link": "https://merges.ubuntu.com/%s/%s/",' %347 print('"link": "https://merges.ubuntu.com/%s/%s/",' %
334 (pathhash(package), package), end=' ', file=status)348 (pathhash(package), package), end=' ', file=status)
335 print('"uploaded": "%s",' % uploaded, end=' ', file=status)349 print('"uploaded": "%s",' % uploaded, end=' ', file=status)
336 print('"priority": "%s",' % priority, end=' ', file=status)350 print('"age": "%s",' % age, end=' ', file=status)
337 if user is not None:351 if user is not None:
338 who = user352 who = user
339 who = who.replace('\\', '\\\\')353 who = who.replace('\\', '\\\\')
@@ -367,10 +381,10 @@
367def write_status_file(status_file, merges):381def write_status_file(status_file, merges):
368 """Write out the merge status file."""382 """Write out the merge status file."""
369 with open(status_file + ".new", "w") as status:383 with open(status_file + ".new", "w") as status:
370 for uploaded, priority, package, user, uploader, source, \384 for uploaded, age, package, user, uploader, source, \
371 left_version, right_version in merges:385 left_version, right_version in merges:
372 print("%s %s %s %s, %s, %s, %s"386 print("%s %s %s %s, %s, %s, %s"
373 % (package, priority,387 % (package, age,
374 left_version, right_version, user, uploader, uploaded),388 left_version, right_version, user, uploader, uploaded),
375 file=status)389 file=status)
376390
377391
=== modified file 'merge-status.py'
--- merge-status.py 2015-07-08 16:40:05 +0000
+++ merge-status.py 2015-07-14 20:35:53 +0000
@@ -19,11 +19,12 @@
1919
20from __future__ import print_function, with_statement20from __future__ import print_function, with_statement
2121
22import bz2
22import os23import os
23import bz2
24import re24import re
25import time25import time
2626
27from datetime import datetime
27from rfc822 import parseaddr28from rfc822 import parseaddr
28from momlib import *29from momlib import *
2930
@@ -90,8 +91,13 @@
90 our_distro, src_distro)91 our_distro, src_distro)
91 except ValueError:92 except ValueError:
92 continue93 continue
9394 date_superseded = get_date_superseded(source["Package"],
94 priority_idx = PRIORITY.index(adjusted_priority(source))95 base_version)
96 if not date_superseded:
97 age = datetime.datetime.utcnow() - datetime.datetime.utcnow()
98 else:
99 age = datetime.datetime.utcnow() - date_superseded.replace(tzinfo=None)
100 days_old = age.days
95101
96 filename = changes_file(our_distro, source)102 filename = changes_file(our_distro, source)
97 if os.path.isfile(filename):103 if os.path.isfile(filename):
@@ -110,7 +116,13 @@
110 except KeyError:116 except KeyError:
111 user = None117 user = None
112 try:118 try:
113 uploaded = info["Distribution"] == OUR_DIST119 uploaded = False
120 # not enough to determine if it is updated LP: #1474139
121 # uploaded = info["Distribution"] == OUR_DIST
122 # better but not sufficient
123 # if info["Distribution"] == OUR_DIST:
124 # if base_version.upstream == left_version.upstream:
125 # uploaded = True
114 except KeyError:126 except KeyError:
115 uploaded = False127 uploaded = False
116 else:128 else:
@@ -128,11 +140,10 @@
128 else:140 else:
129 section = "new"141 section = "new"
130142
131 merges.append((section, priority_idx, source["Package"], user,143 merges.append((section, days_old, source["Package"], user,
132 uploader, source, base_version,144 uploader, source, base_version,
133 left_version, right_version))145 left_version, right_version))
134146 merges.sort(reverse=True)
135 merges.sort()
136147
137 write_status_page(our_component, merges, our_distro, src_distro)148 write_status_page(our_component, merges, our_distro, src_distro)
138 write_status_json(our_component, merges, our_distro, src_distro)149 write_status_json(our_component, merges, our_distro, src_distro)
@@ -256,6 +267,7 @@
256 print("<td colspan=3><b>Last Uploader</b></td>", file=status)267 print("<td colspan=3><b>Last Uploader</b></td>", file=status)
257 print("<td rowspan=2><b>Comment</b></td>", file=status)268 print("<td rowspan=2><b>Comment</b></td>", file=status)
258 print("<td rowspan=2><b>Bug</b></td>", file=status)269 print("<td rowspan=2><b>Bug</b></td>", file=status)
270 print("<td rowspan=2><b>Days Old</b></td>", file=status)
259 print("</tr>", file=status)271 print("</tr>", file=status)
260 print("<tr bgcolor=#d0d0d0>", file=status)272 print("<tr bgcolor=#d0d0d0>", file=status)
261 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)273 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)
@@ -263,8 +275,9 @@
263 print("<td><b>Base Version</b></td>", file=status)275 print("<td><b>Base Version</b></td>", file=status)
264 print("</tr>", file=status)276 print("</tr>", file=status)
265277
266 for uploaded, priority, package, user, uploader, source, \278 for uploaded, age, package, user, uploader, source, \
267 base_version, left_version, right_version in merges:279 base_version, left_version, right_version in merges:
280 colour_idx = get_importance(age)
268 if user is not None:281 if user is not None:
269 (usr_name, usr_mail) = parseaddr(user)282 (usr_name, usr_mail) = parseaddr(user)
270 user_lp_page = get_person_lp_page(usr_mail)283 user_lp_page = get_person_lp_page(usr_mail)
@@ -294,7 +307,7 @@
294 else:307 else:
295 who = "&nbsp;"308 who = "&nbsp;"
296309
297 print("<tr bgcolor=%s class=first>" % COLOURS[priority], file=status)310 print("<tr bgcolor=%s class=first>" % COLOURS[colour_idx], file=status)
298 print("<td><tt><a href=\"%s/%s/REPORT\">" \311 print("<td><tt><a href=\"%s/%s/REPORT\">" \
299 "%s</a></tt>" % (pathhash(package), package, package),312 "%s</a></tt>" % (pathhash(package), package, package),
300 file=status)313 file=status)
@@ -311,7 +324,7 @@
311if \"%s\" in comment:\n\324if \"%s\" in comment:\n\
312 the_comment = comment[\"%s\"]\n\325 the_comment = comment[\"%s\"]\n\
313req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\326req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\
314%%>" % (package, package, COLOURS[priority]), file=status)327%%>" % (package, package, COLOURS[colour_idx]), file=status)
315 print("</form></td>", file=status)328 print("</form></td>", file=status)
316 print("<td rowspan=2>", file=status)329 print("<td rowspan=2>", file=status)
317 print("<%%\n\330 print("<%%\n\
@@ -322,8 +335,11 @@
322\n\335\n\
323%%>" % (package, package), file=status)336%%>" % (package, package), file=status)
324 print("</td>", file=status)337 print("</td>", file=status)
338 print("<td rowspan=2>", file=status)
339 print("%s" % age, file=status)
340 print("</td>", file=status)
325 print("</tr>", file=status)341 print("</tr>", file=status)
326 print("<tr bgcolor=%s>" % COLOURS[priority], file=status)342 print("<tr bgcolor=%s>" % COLOURS[colour_idx], file=status)
327 print("<td><small>%s</small></td>" % source["Binary"], file=status)343 print("<td><small>%s</small></td>" % source["Binary"], file=status)
328 print("<td>%s</td>" % left_version, file=status)344 print("<td>%s</td>" % left_version, file=status)
329 print("<td>%s</td>" % right_version, file=status)345 print("<td>%s</td>" % right_version, file=status)
@@ -341,7 +357,7 @@
341 # not that hard to do it ourselves.357 # not that hard to do it ourselves.
342 print('[', file=status)358 print('[', file=status)
343 cur_merge = 0359 cur_merge = 0
344 for uploaded, priority, package, user, uploader, source, \360 for uploaded, age, package, user, uploader, source, \
345 base_version, left_version, right_version in merges:361 base_version, left_version, right_version in merges:
346 print(' {', end=' ', file=status)362 print(' {', end=' ', file=status)
347 # source_package, short_description, and link are for363 # source_package, short_description, and link are for
@@ -352,7 +368,7 @@
352 print('"link": "https://merges.ubuntu.com/%s/%s/",' %368 print('"link": "https://merges.ubuntu.com/%s/%s/",' %
353 (pathhash(package), package), end=' ', file=status)369 (pathhash(package), package), end=' ', file=status)
354 print('"uploaded": "%s",' % uploaded, end=' ', file=status)370 print('"uploaded": "%s",' % uploaded, end=' ', file=status)
355 print('"priority": "%s",' % priority, end=' ', file=status)371 print('"age": "%s",' % age, end=' ', file=status)
356 if user is not None:372 if user is not None:
357 who = user373 who = user
358 who = who.replace('\\', '\\\\')374 who = who.replace('\\', '\\\\')
@@ -387,10 +403,10 @@
387def write_status_file(status_file, merges):403def write_status_file(status_file, merges):
388 """Write out the merge status file."""404 """Write out the merge status file."""
389 with open(status_file + ".new", "w") as status:405 with open(status_file + ".new", "w") as status:
390 for uploaded, priority, package, user, uploader, source, \406 for uploaded, age, package, user, uploader, source, \
391 base_version, left_version, right_version in merges:407 base_version, left_version, right_version in merges:
392 print("%s %s %s %s %s %s, %s, %s"408 print("%s %s %s %s %s %s, %s, %s"
393 % (package, priority, base_version,409 % (package, age, base_version,
394 left_version, right_version, user, uploader, uploaded),410 left_version, right_version, user, uploader, uploaded),
395 file=status)411 file=status)
396412
397413
=== modified file 'momlib.py'
--- momlib.py 2015-07-08 16:40:05 +0000
+++ momlib.py 2015-07-14 20:35:53 +0000
@@ -4,6 +4,7 @@
4#4#
5# Copyright © 2008 Canonical Ltd.5# Copyright © 2008 Canonical Ltd.
6# Author: Scott James Remnant <scott@ubuntu.com>.6# Author: Scott James Remnant <scott@ubuntu.com>.
7# Brian Murray <brian@ubuntu.com>
7#8#
8# This program is free software: you can redistribute it and/or modify9# This program is free software: you can redistribute it and/or modify
9# it under the terms of version 3 of the GNU General Public License as10# it under the terms of version 3 of the GNU General Public License as
@@ -36,6 +37,7 @@
36import json37import json
3738
38from cgi import escape39from cgi import escape
40from launchpadlib.launchpad import Launchpad
39from optparse import OptionParser41from optparse import OptionParser
40from urllib import quote42from urllib import quote
41from urllib2 import urlopen43from urllib2 import urlopen
@@ -113,6 +115,9 @@
113# mapping of uploader emails to Launchpad pages115# mapping of uploader emails to Launchpad pages
114person_lp_page_mapping = {}116person_lp_page_mapping = {}
115117
118# Launchpad connection
119LAUNCHPAD = Launchpad.login_anonymously('merge-o-matic', 'production',
120 '/tmp/lplib-cache')
116121
117# --------------------------------------------------------------------------- #122# --------------------------------------------------------------------------- #
118# Command-line tool functions123# Command-line tool functions
@@ -196,6 +201,19 @@
196 person_lp_page_mapping[person_email] = data[0]["web_link"]201 person_lp_page_mapping[person_email] = data[0]["web_link"]
197 return person_lp_page_mapping[person_email]202 return person_lp_page_mapping[person_email]
198203
204def get_importance(days):
205 "Return an int representing the importance of an item."
206 if days <= 30:
207 return 5
208 elif days <= 60:
209 return 4
210 elif days <= 90:
211 return 3
212 elif days <= 180:
213 return 2
214 elif days <= 365:
215 return 1
216 return 0
199217
200# --------------------------------------------------------------------------- #218# --------------------------------------------------------------------------- #
201# Location functions219# Location functions
@@ -731,7 +749,7 @@
731749
732def get_comments():750def get_comments():
733 """Extract the comments from file, and return a dictionary751 """Extract the comments from file, and return a dictionary
734 containing comments corresponding to packages"""752 containing comments corresponding to packages"""
735 comments = {}753 comments = {}
736754
737 with open(comments_file(), "r") as file_comments:755 with open(comments_file(), "r") as file_comments:
@@ -796,3 +814,29 @@
796 html += "&nbsp;"814 html += "&nbsp;"
797815
798 return html816 return html
817
818# --------------------------------------------------------------------------- #
819# Launchpadlib functions
820# --------------------------------------------------------------------------- #
821def get_date_superseded(package, base_version):
822 from debian.debian_support import Version
823 base_version = Version(base_version)
824
825 src_distro = LAUNCHPAD.projects[SRC_DISTRO]
826 src_archive = src_distro.main_archive
827
828 date_superseded = None
829 ver_superseded = None
830 for spph in src_archive.getPublishedSources(source_name=package,
831 exact_match=True,
832 pocket='Release'):
833 version = Version(spph.source_package_version)
834 if version <= base_version:
835 break
836 date_superseded = spph.date_created
837 ver_superseded = version
838 else:
839 if False:
840 print("Base version %s of %s never published in Debian." %
841 (base_version, package))
842 return date_superseded

Subscribers

People subscribed via source and target branches

to status/vote changes: