~brian-murray/merge-o-matic/linkify-uploader

« back to all changes in this revision

Viewing changes to merge-status.py

  • Committer: Colin Watson
  • Date: 2012-05-22 14:32:34 UTC
  • Revision ID: cjwatson@canonical.com-20120522143234-u20m4o4717lp4h3x
Use Python 3-compatible print functions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# You should have received a copy of the GNU General Public License
18
18
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
 
from __future__ import with_statement
 
20
from __future__ import print_function, with_statement
21
21
 
22
22
import os
23
23
import bz2
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>"
173
 
        print >>status
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;"
180
 
        print >>status, "}"
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;"
186
 
        print >>status, "}"
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;"
192
 
        print >>status, "}"
193
 
        print >>status, "p, td {"
194
 
        print >>status, "    font-family: sans-serif;"
195
 
        print >>status, "    margin-bottom: 0;"
196
 
        print >>status, "}"
197
 
        print >>status, "li {"
198
 
        print >>status, "    font-family: sans-serif;"
199
 
        print >>status, "    margin-bottom: 1em;"
200
 
        print >>status, "}"
201
 
        print >>status, "tr.first td {"
202
 
        print >>status, "    border-top: 2px solid white;"
203
 
        print >>status, "}"
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
210
 
 
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))
215
 
 
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 "
225
 
                         "like.</li>")
226
 
        print >>status, "</ul>"
227
 
 
228
 
        print >>status, "<% comment = get_comments() %>"
229
 
 
230
 
        for section in SECTIONS:
231
 
            section_merges = [ m for m in merges if m[0] == section ]
232
 
 
233
 
            print >>status, ("<h2 id=\"%s\">%s Merges</h2>"
234
 
                             % (section, section.title()))
 
172
        print("<html>", file=status)
 
173
        print(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,
 
177
              file=status)
 
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\">",
 
210
              file=status)
 
211
        print("<h1>Ubuntu Merge-o-Matic: %s</h1>" % component, file=status)
 
212
 
 
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)
 
217
 
 
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>",
 
222
              file=status)
 
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)
 
230
 
 
231
        print("<% comment = get_comments() %>", file=status)
 
232
 
 
233
        for section in SECTIONS:
 
234
            section_merges = [ m for m in merges if m[0] == section ]
 
235
 
 
236
            print("<h2 id=\"%s\">%s Merges</h2>" % (section, section.title()),
 
237
                  file=status)
235
238
 
236
239
            do_table(status, section_merges, left_distro, right_distro, component)
237
240
 
238
 
        print >>status, "<h2 id=stats>Statistics</h2>"
239
 
        print >>status, ("<img src=\"%s-now.png\" title=\"Current stats\">"
240
 
                         % component)
241
 
        print >>status, ("<img src=\"%s-trend.png\" title=\"Six month trend\">"
242
 
                         % component)
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,
 
243
              file=status)
 
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)
245
248
 
246
249
    os.rename(status_file + ".new", status_file)
247
250
 
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)
262
265
 
263
266
    for uploaded, priority, package, user, uploader, source, \
264
267
            base_version, left_version, right_version in merges:
283
286
        else:
284
287
            who = "&nbsp;"
285
288
 
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),
 
292
              file=status)
 
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)
 
301
        print("<%%\n\
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)
 
309
        print("<%%\n\
306
310
if \"%s\" in comment:\n\
307
311
    req.write(\"%%s\" %% gen_buglink_from_comment(comment[\"%s\"]))\n\
308
312
else:\n\
309
313
    req.write(\"&nbsp;\")\n\
310
314
\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)
320
324
 
321
 
    print >>status, "</table>"
 
325
    print("</table>", file=status)
322
326
 
323
327
 
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.
330
 
        print >>status, '['
 
334
        print('[', file=status)
331
335
        cur_merge = 0
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:
343
349
                who = user
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)
351
357
                        u_who = uploader
352
358
                        u_who = u_who.replace('\\', '\\\\')
353
359
                        u_who = u_who.replace('"', '\\"')
354
 
                        print >>status, '"uploader": "%s",' % u_who,
 
360
                        print('"uploader": "%s",' % u_who, end=' ', file=status)
355
361
            binaries = re.split(', *', source["Binary"].replace('\n', ''))
356
 
            print >>status, '"binaries": [ %s ],' % \
357
 
                            ', '.join(['"%s"' % b for b in binaries]),
358
 
            print >>status, '"base_version": "%s",' % base_version,
359
 
            print >>status, '"left_version": "%s",' % left_version,
360
 
            print >>status, '"right_version": "%s"' % right_version,
 
362
            print('"binaries": [ %s ],' %
 
363
                  ', '.join(['"%s"' % b for b in binaries]),
 
364
                  end=' ', file=status)
 
365
            print('"base_version": "%s",' % base_version, end=' ', file=status)
 
366
            print('"left_version": "%s",' % left_version, end=' ', file=status)
 
367
            print('"right_version": "%s"' % right_version,
 
368
                  end=' ', file=status)
361
369
            cur_merge += 1
362
370
            if cur_merge < len(merges):
363
 
                print >>status, '},'
 
371
                print('},', file=status)
364
372
            else:
365
 
                print >>status, '}'
366
 
        print >>status, ']'
 
373
                print('}', file=status)
 
374
        print(']', file=status)
367
375
 
368
376
    os.rename(status_file + ".new", status_file)
369
377
 
373
381
    with open(status_file + ".new", "w") as status:
374
382
        for uploaded, priority, package, user, uploader, source, \
375
383
                base_version, left_version, right_version in merges:
376
 
            print >>status, "%s %s %s %s %s %s, %s, %s" \
 
384
            print("%s %s %s %s %s %s, %s, %s"
377
385
                  % (package, priority, base_version,
378
 
                     left_version, right_version, user, uploader, uploaded)
 
386
                     left_version, right_version, user, uploader, uploaded),
 
387
                  file=status)
379
388
 
380
389
    os.rename(status_file + ".new", status_file)
381
390