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
1=== modified file 'manual-status.py'
2--- manual-status.py 2015-07-08 16:40:05 +0000
3+++ manual-status.py 2015-07-14 20:35:53 +0000
4@@ -19,11 +19,12 @@
5
6 from __future__ import print_function, with_statement
7
8+import bz2
9 import os
10-import bz2
11 import re
12 import time
13
14+from datetime import datetime
15 from rfc822 import parseaddr
16 from momlib import *
17
18@@ -99,7 +100,13 @@
19 except IndexError:
20 pass
21
22- priority_idx = PRIORITY.index(adjusted_priority(our_source))
23+ date_superseded = get_date_superseded(source["Package"],
24+ base_version)
25+ if not date_superseded:
26+ age = datetime.datetime.utcnow() - datetime.datetime.utcnow()
27+ else:
28+ age = datetime.datetime.utcnow() - date_superseded.replace(tzinfo=None)
29+ days_old = age.days
30
31 filename = changes_file(our_distro, our_source)
32 if os.path.isfile(filename):
33@@ -114,7 +121,9 @@
34 multi_para=False, signed=False).para
35
36 user = info["Changed-By"]
37- uploaded = info["Distribution"] == OUR_DIST
38+ # not enough to determine if it is updated LP: #1474139
39+ # uploaded = info["Distribution"] == OUR_DIST
40+ uploaded = False
41 else:
42 user = None
43 uploaded = False
44@@ -126,7 +135,7 @@
45 else:
46 section = "new"
47
48- merges.append((section, priority_idx, package, user, uploader,
49+ merges.append((section, days_old, package, user, uploader,
50 our_source, our_version, src_version))
51
52 write_status_page(our_component, merges, our_distro, src_distro)
53@@ -139,7 +148,7 @@
54
55 def write_status_page(component, merges, left_distro, right_distro):
56 """Write out the manual merge status page."""
57- merges.sort()
58+ merges.sort(reverse=True)
59
60 status_file = "%s/merges/%s-manual.html" % (ROOT, component)
61 with open(status_file + ".new", "w") as status:
62@@ -235,14 +244,16 @@
63 print("<td colspan=2><b>Last Uploader</b></td>", file=status)
64 print("<td rowspan=2><b>Comment</b></td>", file=status)
65 print("<td rowspan=2><b>Bug</b></td>", file=status)
66+ print("<td rowspan=2><b>Days Old</b></td>", file=status)
67 print("</tr>", file=status)
68 print("<tr bgcolor=#d0d0d0>", file=status)
69 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)
70 print("<td><b>%s Version</b></td>" % right_distro.title(), file=status)
71 print("</tr>", file=status)
72
73- for uploaded, priority, package, user, uploader, source, \
74+ for uploaded, age, package, user, uploader, source, \
75 left_version, right_version in merges:
76+ colour_idx = get_importance(age)
77 if user is not None:
78 (usr_name, usr_mail) = parseaddr(user)
79 user_lp_page = get_person_lp_page(usr_mail)
80@@ -272,7 +283,7 @@
81 else:
82 who = "&nbsp;"
83
84- print("<tr bgcolor=%s class=first>" % COLOURS[priority], file=status)
85+ print("<tr bgcolor=%s class=first>" % COLOURS[colour_idx], file=status)
86 print("<td><tt><a href=\"https://patches.ubuntu.com/" \
87 "%s/%s/%s_%s.patch\">%s</a></tt>" \
88 % (pathhash(package), package, package, left_version, package),
89@@ -293,7 +304,7 @@
90 if \"%s\" in comment:\n\
91 the_comment = comment[\"%s\"]\n\
92 req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\
93-%%>" % (package, package, COLOURS[priority]), file=status)
94+%%>" % (package, package, COLOURS[colour_idx]), file=status)
95 print("</form></td>", file=status)
96 print("<td rowspan=2>", file=status)
97 print("<%%\n\
98@@ -304,8 +315,11 @@
99 \n\
100 %%>" % (package, package), file=status)
101 print("</td>", file=status)
102+ print("<td rowspan=2>", file=status)
103+ print("%s" % age, file=status)
104+ print("</td>", file=status)
105 print("</tr>", file=status)
106- print("<tr bgcolor=%s>" % COLOURS[priority], file=status)
107+ print("<tr bgcolor=%s>" % COLOURS[colour_idx], file=status)
108 print("<td><small>%s</small></td>" % source["Binary"], file=status)
109 print("<td>%s</td>" % left_version, file=status)
110 print("<td>%s</td>" % right_version, file=status)
111@@ -322,7 +336,7 @@
112 # not that hard to do it ourselves.
113 print('[', file=status)
114 cur_merge = 0
115- for uploaded, priority, package, user, uploader, source, \
116+ for uploaded, age, package, user, uploader, source, \
117 left_version, right_version in merges:
118 print(' {', end=' ', file=status)
119 # source_package, short_description, and link are for
120@@ -333,7 +347,7 @@
121 print('"link": "https://merges.ubuntu.com/%s/%s/",' %
122 (pathhash(package), package), end=' ', file=status)
123 print('"uploaded": "%s",' % uploaded, end=' ', file=status)
124- print('"priority": "%s",' % priority, end=' ', file=status)
125+ print('"age": "%s",' % age, end=' ', file=status)
126 if user is not None:
127 who = user
128 who = who.replace('\\', '\\\\')
129@@ -367,10 +381,10 @@
130 def write_status_file(status_file, merges):
131 """Write out the merge status file."""
132 with open(status_file + ".new", "w") as status:
133- for uploaded, priority, package, user, uploader, source, \
134+ for uploaded, age, package, user, uploader, source, \
135 left_version, right_version in merges:
136 print("%s %s %s %s, %s, %s, %s"
137- % (package, priority,
138+ % (package, age,
139 left_version, right_version, user, uploader, uploaded),
140 file=status)
141
142
143=== modified file 'merge-status.py'
144--- merge-status.py 2015-07-08 16:40:05 +0000
145+++ merge-status.py 2015-07-14 20:35:53 +0000
146@@ -19,11 +19,12 @@
147
148 from __future__ import print_function, with_statement
149
150+import bz2
151 import os
152-import bz2
153 import re
154 import time
155
156+from datetime import datetime
157 from rfc822 import parseaddr
158 from momlib import *
159
160@@ -90,8 +91,13 @@
161 our_distro, src_distro)
162 except ValueError:
163 continue
164-
165- priority_idx = PRIORITY.index(adjusted_priority(source))
166+ date_superseded = get_date_superseded(source["Package"],
167+ base_version)
168+ if not date_superseded:
169+ age = datetime.datetime.utcnow() - datetime.datetime.utcnow()
170+ else:
171+ age = datetime.datetime.utcnow() - date_superseded.replace(tzinfo=None)
172+ days_old = age.days
173
174 filename = changes_file(our_distro, source)
175 if os.path.isfile(filename):
176@@ -110,7 +116,13 @@
177 except KeyError:
178 user = None
179 try:
180- uploaded = info["Distribution"] == OUR_DIST
181+ uploaded = False
182+ # not enough to determine if it is updated LP: #1474139
183+ # uploaded = info["Distribution"] == OUR_DIST
184+ # better but not sufficient
185+ # if info["Distribution"] == OUR_DIST:
186+ # if base_version.upstream == left_version.upstream:
187+ # uploaded = True
188 except KeyError:
189 uploaded = False
190 else:
191@@ -128,11 +140,10 @@
192 else:
193 section = "new"
194
195- merges.append((section, priority_idx, source["Package"], user,
196+ merges.append((section, days_old, source["Package"], user,
197 uploader, source, base_version,
198 left_version, right_version))
199-
200- merges.sort()
201+ merges.sort(reverse=True)
202
203 write_status_page(our_component, merges, our_distro, src_distro)
204 write_status_json(our_component, merges, our_distro, src_distro)
205@@ -256,6 +267,7 @@
206 print("<td colspan=3><b>Last Uploader</b></td>", file=status)
207 print("<td rowspan=2><b>Comment</b></td>", file=status)
208 print("<td rowspan=2><b>Bug</b></td>", file=status)
209+ print("<td rowspan=2><b>Days Old</b></td>", file=status)
210 print("</tr>", file=status)
211 print("<tr bgcolor=#d0d0d0>", file=status)
212 print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)
213@@ -263,8 +275,9 @@
214 print("<td><b>Base Version</b></td>", file=status)
215 print("</tr>", file=status)
216
217- for uploaded, priority, package, user, uploader, source, \
218+ for uploaded, age, package, user, uploader, source, \
219 base_version, left_version, right_version in merges:
220+ colour_idx = get_importance(age)
221 if user is not None:
222 (usr_name, usr_mail) = parseaddr(user)
223 user_lp_page = get_person_lp_page(usr_mail)
224@@ -294,7 +307,7 @@
225 else:
226 who = "&nbsp;"
227
228- print("<tr bgcolor=%s class=first>" % COLOURS[priority], file=status)
229+ print("<tr bgcolor=%s class=first>" % COLOURS[colour_idx], file=status)
230 print("<td><tt><a href=\"%s/%s/REPORT\">" \
231 "%s</a></tt>" % (pathhash(package), package, package),
232 file=status)
233@@ -311,7 +324,7 @@
234 if \"%s\" in comment:\n\
235 the_comment = comment[\"%s\"]\n\
236 req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\
237-%%>" % (package, package, COLOURS[priority]), file=status)
238+%%>" % (package, package, COLOURS[colour_idx]), file=status)
239 print("</form></td>", file=status)
240 print("<td rowspan=2>", file=status)
241 print("<%%\n\
242@@ -322,8 +335,11 @@
243 \n\
244 %%>" % (package, package), file=status)
245 print("</td>", file=status)
246+ print("<td rowspan=2>", file=status)
247+ print("%s" % age, file=status)
248+ print("</td>", file=status)
249 print("</tr>", file=status)
250- print("<tr bgcolor=%s>" % COLOURS[priority], file=status)
251+ print("<tr bgcolor=%s>" % COLOURS[colour_idx], file=status)
252 print("<td><small>%s</small></td>" % source["Binary"], file=status)
253 print("<td>%s</td>" % left_version, file=status)
254 print("<td>%s</td>" % right_version, file=status)
255@@ -341,7 +357,7 @@
256 # not that hard to do it ourselves.
257 print('[', file=status)
258 cur_merge = 0
259- for uploaded, priority, package, user, uploader, source, \
260+ for uploaded, age, package, user, uploader, source, \
261 base_version, left_version, right_version in merges:
262 print(' {', end=' ', file=status)
263 # source_package, short_description, and link are for
264@@ -352,7 +368,7 @@
265 print('"link": "https://merges.ubuntu.com/%s/%s/",' %
266 (pathhash(package), package), end=' ', file=status)
267 print('"uploaded": "%s",' % uploaded, end=' ', file=status)
268- print('"priority": "%s",' % priority, end=' ', file=status)
269+ print('"age": "%s",' % age, end=' ', file=status)
270 if user is not None:
271 who = user
272 who = who.replace('\\', '\\\\')
273@@ -387,10 +403,10 @@
274 def write_status_file(status_file, merges):
275 """Write out the merge status file."""
276 with open(status_file + ".new", "w") as status:
277- for uploaded, priority, package, user, uploader, source, \
278+ for uploaded, age, package, user, uploader, source, \
279 base_version, left_version, right_version in merges:
280 print("%s %s %s %s %s %s, %s, %s"
281- % (package, priority, base_version,
282+ % (package, age, base_version,
283 left_version, right_version, user, uploader, uploaded),
284 file=status)
285
286
287=== modified file 'momlib.py'
288--- momlib.py 2015-07-08 16:40:05 +0000
289+++ momlib.py 2015-07-14 20:35:53 +0000
290@@ -4,6 +4,7 @@
291 #
292 # Copyright © 2008 Canonical Ltd.
293 # Author: Scott James Remnant <scott@ubuntu.com>.
294+# Brian Murray <brian@ubuntu.com>
295 #
296 # This program is free software: you can redistribute it and/or modify
297 # it under the terms of version 3 of the GNU General Public License as
298@@ -36,6 +37,7 @@
299 import json
300
301 from cgi import escape
302+from launchpadlib.launchpad import Launchpad
303 from optparse import OptionParser
304 from urllib import quote
305 from urllib2 import urlopen
306@@ -113,6 +115,9 @@
307 # mapping of uploader emails to Launchpad pages
308 person_lp_page_mapping = {}
309
310+# Launchpad connection
311+LAUNCHPAD = Launchpad.login_anonymously('merge-o-matic', 'production',
312+ '/tmp/lplib-cache')
313
314 # --------------------------------------------------------------------------- #
315 # Command-line tool functions
316@@ -196,6 +201,19 @@
317 person_lp_page_mapping[person_email] = data[0]["web_link"]
318 return person_lp_page_mapping[person_email]
319
320+def get_importance(days):
321+ "Return an int representing the importance of an item."
322+ if days <= 30:
323+ return 5
324+ elif days <= 60:
325+ return 4
326+ elif days <= 90:
327+ return 3
328+ elif days <= 180:
329+ return 2
330+ elif days <= 365:
331+ return 1
332+ return 0
333
334 # --------------------------------------------------------------------------- #
335 # Location functions
336@@ -731,7 +749,7 @@
337
338 def get_comments():
339 """Extract the comments from file, and return a dictionary
340- containing comments corresponding to packages"""
341+ containing comments corresponding to packages"""
342 comments = {}
343
344 with open(comments_file(), "r") as file_comments:
345@@ -796,3 +814,29 @@
346 html += "&nbsp;"
347
348 return html
349+
350+# --------------------------------------------------------------------------- #
351+# Launchpadlib functions
352+# --------------------------------------------------------------------------- #
353+def get_date_superseded(package, base_version):
354+ from debian.debian_support import Version
355+ base_version = Version(base_version)
356+
357+ src_distro = LAUNCHPAD.projects[SRC_DISTRO]
358+ src_archive = src_distro.main_archive
359+
360+ date_superseded = None
361+ ver_superseded = None
362+ for spph in src_archive.getPublishedSources(source_name=package,
363+ exact_match=True,
364+ pocket='Release'):
365+ version = Version(spph.source_package_version)
366+ if version <= base_version:
367+ break
368+ date_superseded = spph.date_created
369+ ver_superseded = version
370+ else:
371+ if False:
372+ print("Base version %s of %s never published in Debian." %
373+ (base_version, package))
374+ return date_superseded

Subscribers

People subscribed via source and target branches

to status/vote changes: