Merge lp:~brian-murray/merge-o-matic/sort-by-age into lp:merge-o-matic
- sort-by-age
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Core Development Team | Pending | ||
Review via email: mp+264653@code.launchpad.net |
Commit message
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 = " " |
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 = " " |
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 += " " |
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 |