169
169
"""Write out the merge status page."""
170
170
status_file = "%s/merges/%s.html" % (ROOT, component)
171
171
with open(status_file + ".new", "w") as status:
172
print >>status, "<html>"
174
print >>status, "<head>"
175
print >>status, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
176
print >>status, "<title>Ubuntu Merge-o-Matic: %s</title>" % component
177
print >>status, "<style>"
178
print >>status, "img#ubuntu {"
179
print >>status, " border: 0;"
181
print >>status, "h1 {"
182
print >>status, " padding-top: 0.5em;"
183
print >>status, " font-family: sans-serif;"
184
print >>status, " font-size: 2.0em;"
185
print >>status, " font-weight: bold;"
187
print >>status, "h2 {"
188
print >>status, " padding-top: 0.5em;"
189
print >>status, " font-family: sans-serif;"
190
print >>status, " font-size: 1.5em;"
191
print >>status, " font-weight: bold;"
193
print >>status, "p, td {"
194
print >>status, " font-family: sans-serif;"
195
print >>status, " margin-bottom: 0;"
197
print >>status, "li {"
198
print >>status, " font-family: sans-serif;"
199
print >>status, " margin-bottom: 1em;"
201
print >>status, "tr.first td {"
202
print >>status, " border-top: 2px solid white;"
204
print >>status, "</style>"
205
print >>status, "<% from momlib import * %>"
206
print >>status, "</head>"
207
print >>status, "<body>"
208
print >>status, "<img src=\".img/ubuntulogo-100.png\" id=\"ubuntu\">"
209
print >>status, "<h1>Ubuntu Merge-o-Matic: %s</h1>" % component
211
for section in SECTIONS:
212
section_merges = [ m for m in merges if m[0] == section ]
213
print >>status, ("<p><a href=\"#%s\">%s %s merges</a></p>"
214
% (section, len(section_merges), section))
216
print >>status, "<ul>"
217
print >>status, ("<li>If you are not the previous uploader, ask the "
218
"previous uploader before doing the merge. This "
219
"prevents two people from doing the same work.</li>")
220
print >>status, ("<li>Before uploading, update the changelog to "
221
"have your name and a list of the outstanding "
222
"Ubuntu changes.</li>")
223
print >>status, ("<li>Try and keep the diff small, this may involve "
224
"manually tweaking <tt>po</tt> files and the "
226
print >>status, "</ul>"
228
print >>status, "<% comment = get_comments() %>"
230
for section in SECTIONS:
231
section_merges = [ m for m in merges if m[0] == section ]
233
print >>status, ("<h2 id=\"%s\">%s Merges</h2>"
234
% (section, section.title()))
172
print("<html>", file=status)
174
print("<head>", file=status)
175
print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">", file=status)
176
print("<title>Ubuntu Merge-o-Matic: %s</title>" % component,
178
print("<style>", file=status)
179
print("img#ubuntu {", file=status)
180
print(" border: 0;", file=status)
181
print("}", file=status)
182
print("h1 {", file=status)
183
print(" padding-top: 0.5em;", file=status)
184
print(" font-family: sans-serif;", file=status)
185
print(" font-size: 2.0em;", file=status)
186
print(" font-weight: bold;", file=status)
187
print("}", file=status)
188
print("h2 {", file=status)
189
print(" padding-top: 0.5em;", file=status)
190
print(" font-family: sans-serif;", file=status)
191
print(" font-size: 1.5em;", file=status)
192
print(" font-weight: bold;", file=status)
193
print("}", file=status)
194
print("p, td {", file=status)
195
print(" font-family: sans-serif;", file=status)
196
print(" margin-bottom: 0;", file=status)
197
print("}", file=status)
198
print("li {", file=status)
199
print(" font-family: sans-serif;", file=status)
200
print(" margin-bottom: 1em;", file=status)
201
print("}", file=status)
202
print("tr.first td {", file=status)
203
print(" border-top: 2px solid white;", file=status)
204
print("}", file=status)
205
print("</style>", file=status)
206
print("<% from momlib import * %>", file=status)
207
print("</head>", file=status)
208
print("<body>", file=status)
209
print("<img src=\".img/ubuntulogo-100.png\" id=\"ubuntu\">",
211
print("<h1>Ubuntu Merge-o-Matic: %s</h1>" % component, file=status)
213
for section in SECTIONS:
214
section_merges = [ m for m in merges if m[0] == section ]
215
print("<p><a href=\"#%s\">%s %s merges</a></p>"
216
% (section, len(section_merges), section), file=status)
218
print("<ul>", file=status)
219
print("<li>If you are not the previous uploader, ask the "
220
"previous uploader before doing the merge. This "
221
"prevents two people from doing the same work.</li>",
223
print("<li>Before uploading, update the changelog to "
224
"have your name and a list of the outstanding "
225
"Ubuntu changes.</li>", file=status)
226
print("<li>Try and keep the diff small, this may involve "
227
"manually tweaking <tt>po</tt> files and the "
228
"like.</li>", file=status)
229
print("</ul>", file=status)
231
print("<% comment = get_comments() %>", file=status)
233
for section in SECTIONS:
234
section_merges = [ m for m in merges if m[0] == section ]
236
print("<h2 id=\"%s\">%s Merges</h2>" % (section, section.title()),
236
239
do_table(status, section_merges, left_distro, right_distro, component)
238
print >>status, "<h2 id=stats>Statistics</h2>"
239
print >>status, ("<img src=\"%s-now.png\" title=\"Current stats\">"
241
print >>status, ("<img src=\"%s-trend.png\" title=\"Six month trend\">"
243
print >>status, "</body>"
244
print >>status, "</html>"
241
print("<h2 id=stats>Statistics</h2>", file=status)
242
print("<img src=\"%s-now.png\" title=\"Current stats\">" % component,
244
print("<img src=\"%s-trend.png\" title=\"Six month trend\">"
245
% component, file=status)
246
print("</body>", file=status)
247
print("</html>", file=status)
246
249
os.rename(status_file + ".new", status_file)
248
251
def do_table(status, merges, left_distro, right_distro, component):
249
252
"""Output a table."""
250
print >>status, "<table cellspacing=0>"
251
print >>status, "<tr bgcolor=#d0d0d0>"
252
print >>status, "<td rowspan=2><b>Package</b></td>"
253
print >>status, "<td colspan=3><b>Last Uploader</b></td>"
254
print >>status, "<td rowspan=2><b>Comment</b></td>"
255
print >>status, "<td rowspan=2><b>Bug</b></td>"
256
print >>status, "</tr>"
257
print >>status, "<tr bgcolor=#d0d0d0>"
258
print >>status, "<td><b>%s Version</b></td>" % left_distro.title()
259
print >>status, "<td><b>%s Version</b></td>" % right_distro.title()
260
print >>status, "<td><b>Base Version</b></td>"
261
print >>status, "</tr>"
253
print("<table cellspacing=0>", file=status)
254
print("<tr bgcolor=#d0d0d0>", file=status)
255
print("<td rowspan=2><b>Package</b></td>", file=status)
256
print("<td colspan=3><b>Last Uploader</b></td>", file=status)
257
print("<td rowspan=2><b>Comment</b></td>", file=status)
258
print("<td rowspan=2><b>Bug</b></td>", file=status)
259
print("</tr>", file=status)
260
print("<tr bgcolor=#d0d0d0>", file=status)
261
print("<td><b>%s Version</b></td>" % left_distro.title(), file=status)
262
print("<td><b>%s Version</b></td>" % right_distro.title(), file=status)
263
print("<td><b>Base Version</b></td>", file=status)
264
print("</tr>", file=status)
263
266
for uploaded, priority, package, user, uploader, source, \
264
267
base_version, left_version, right_version in merges:
286
print >>status, "<tr bgcolor=%s class=first>" % COLOURS[priority]
287
print >>status, "<td><tt><a href=\"%s/%s/REPORT\">" \
288
"%s</a></tt>" % (pathhash(package), package, package)
289
print >>status, " <sup><a href=\"https://launchpad.net/ubuntu/" \
290
"+source/%s\">LP</a></sup>" % package
291
print >>status, " <sup><a href=\"http://packages.qa.debian.org/" \
292
"%s\">PTS</a></sup></td>" % package
293
print >>status, "<td colspan=3>%s</td>" % who
294
print >>status, "<td rowspan=2><form method=\"get\" action=\"addcomment.py\"><br />"
295
print >>status, "<input type=\"hidden\" name=\"component\" value=\"%s\" />" % component
296
print >>status, "<input type=\"hidden\" name=\"package\" value=\"%s\" />" % package
297
print >>status, "<%%\n\
289
print("<tr bgcolor=%s class=first>" % COLOURS[priority], file=status)
290
print("<td><tt><a href=\"%s/%s/REPORT\">" \
291
"%s</a></tt>" % (pathhash(package), package, package),
293
print(" <sup><a href=\"https://launchpad.net/ubuntu/" \
294
"+source/%s\">LP</a></sup>" % package, file=status)
295
print(" <sup><a href=\"http://packages.qa.debian.org/" \
296
"%s\">PTS</a></sup></td>" % package, file=status)
297
print("<td colspan=3>%s</td>" % who, file=status)
298
print("<td rowspan=2><form method=\"get\" action=\"addcomment.py\"><br />", file=status)
299
print("<input type=\"hidden\" name=\"component\" value=\"%s\" />" % component, file=status)
300
print("<input type=\"hidden\" name=\"package\" value=\"%s\" />" % package, file=status)
298
302
the_comment = \"\"\n\
299
303
if \"%s\" in comment:\n\
300
304
the_comment = comment[\"%s\"]\n\
301
305
req.write(\"<input type=\\\"text\\\" style=\\\"border-style: none; background-color: %s\\\" name=\\\"comment\\\" value=\\\"%%s\\\" title=\\\"%%s\\\" />\" %% (the_comment, the_comment))\n\
302
%%>" % (package, package, COLOURS[priority])
303
print >>status, "</form></td>"
304
print >>status, "<td rowspan=2>"
305
print >>status, "<%%\n\
306
%%>" % (package, package, COLOURS[priority]), file=status)
307
print("</form></td>", file=status)
308
print("<td rowspan=2>", file=status)
306
310
if \"%s\" in comment:\n\
307
311
req.write(\"%%s\" %% gen_buglink_from_comment(comment[\"%s\"]))\n\
309
313
req.write(\" \")\n\
311
%%>" % (package, package)
312
print >>status, "</td>"
313
print >>status, "</tr>"
314
print >>status, "<tr bgcolor=%s>" % COLOURS[priority]
315
print >>status, "<td><small>%s</small></td>" % source["Binary"]
316
print >>status, "<td>%s</td>" % left_version
317
print >>status, "<td>%s</td>" % right_version
318
print >>status, "<td>%s</td>" % base_version
319
print >>status, "</tr>"
315
%%>" % (package, package), file=status)
316
print("</td>", file=status)
317
print("</tr>", file=status)
318
print("<tr bgcolor=%s>" % COLOURS[priority], file=status)
319
print("<td><small>%s</small></td>" % source["Binary"], file=status)
320
print("<td>%s</td>" % left_version, file=status)
321
print("<td>%s</td>" % right_version, file=status)
322
print("<td>%s</td>" % base_version, file=status)
323
print("</tr>", file=status)
321
print >>status, "</table>"
325
print("</table>", file=status)
324
328
def write_status_json(component, merges, left_distro, right_distro):
327
331
with open(status_file + ".new", "w") as status:
328
332
# No json module available on merges.ubuntu.com right now, but it's
329
333
# not that hard to do it ourselves.
334
print('[', file=status)
332
336
for uploaded, priority, package, user, uploader, source, \
333
337
base_version, left_version, right_version in merges:
334
print >>status, ' {',
338
print(' {', end=' ', file=status)
335
339
# source_package, short_description, and link are for
336
340
# Harvest (http://daniel.holba.ch/blog/?p=838).
337
print >>status, '"source_package": "%s",' % package,
338
print >>status, '"short_description": "merge %s",' % right_version,
339
print >>status, '"link": "https://merges.ubuntu.com/%s/%s/",' % (pathhash(package), package),
340
print >>status, '"uploaded": "%s",' % uploaded,
341
print >>status, '"priority": "%s",' % priority,
341
print('"source_package": "%s",' % package, end=' ', file=status)
342
print('"short_description": "merge %s",' % right_version,
343
end=' ', file=status)
344
print('"link": "https://merges.ubuntu.com/%s/%s/",' %
345
(pathhash(package), package), end=' ', file=status)
346
print('"uploaded": "%s",' % uploaded, end=' ', file=status)
347
print('"priority": "%s",' % priority, end=' ', file=status)
342
348
if user is not None:
344
350
who = who.replace('\\', '\\\\')
345
351
who = who.replace('"', '\\"')
346
print >>status, '"user": "%s",' % who,
352
print('"user": "%s",' % who, end=' ', file=status)
347
353
if uploader is not None:
348
354
(usr_name, usr_mail) = parseaddr(user)
349
355
(upl_name, upl_mail) = parseaddr(uploader)