[Collab-qa-commits] r2113 - udd/web/cgi-bin
Luca Falavigna
dktrkranz at alioth.debian.org
Tue Dec 27 23:07:31 UTC 2011
Author: dktrkranz
Date: 2011-12-27 23:07:30 +0000 (Tue, 27 Dec 2011)
New Revision: 2113
Modified:
udd/web/cgi-bin/buildd.cgi
Log:
buildd.cgi: refactorize, dramatically increase speed
Modified: udd/web/cgi-bin/buildd.cgi
===================================================================
--- udd/web/cgi-bin/buildd.cgi 2011-12-27 13:06:27 UTC (rev 2112)
+++ udd/web/cgi-bin/buildd.cgi 2011-12-27 23:07:30 UTC (rev 2113)
@@ -1,4 +1,5 @@
-#!/usr/bin/python
+#!/usr/bin/python
+#-*- coding: utf8
#
# Copyright (C) 2011 Luca Falavigna <dktrkranz at debian.org>
#
@@ -17,130 +18,102 @@
#
# Display buildd status for your packages
+from __future__ import print_function
from cgi import FieldStorage
from psycopg2 import connect
from re import split, sub
from urllib import urlopen
-packages = {}
+packages = {'sid': {'maintained': {}, 'team': {}, 'NMUed': {},
+ 'QA/other': {}, 'sponsored': {}},
+ 'experimental': {'maintained': {}, 'team': {}, 'NMUed': {},
+ 'QA/other': {}, 'sponsored': {}}}
+architectures = set()
suites = ('sid', 'experimental')
-roles = ('maintained', 'team', 'NMUed', 'sponsored', 'QA/other')
-conn = connect(database='udd', port=5441, host='localhost', user='guest')
-cur = conn.cursor()
+roles = ('maintained', 'team', 'NMUed', 'QA/other', 'sponsored')
name = FieldStorage().getvalue('maint')
+wbstatus = {'BD-Uninstallable': ('bduninstallable', 'BD-Uninstallable', '∉'),
+ 'Build-Attempted': ('buildattempted', 'Build-Attempted', '∿'),
+ 'Building': ('building', 'Building', '⚒'),
+ 'Maybe-Failed': ('maybefailed', 'Maybe-Failed', '(✘)'),
+ 'Successful': ('maybesuccessful', 'Maybe-Successful', '(✔)'),
+ 'Built': ('built', 'Built', '☺'),
+ 'Failed': ('failed', 'Failed', '✘'),
+ 'Failed-Removed': ('failed', 'Failed', '✘'),
+ 'Dep-Wait': ('depwait', 'Dep-Wait', '⌚'),
+ 'Installed': ('installed', 'Installed', '✔'),
+ 'Needs-Build': ('needsbuild', 'Needs-Build', '⌂'),
+ 'Uploaded': ('uploaded', 'Uploaded', '♐'),
+ 'Not-For-Us': ('notforus', 'Not-For-Us', '⎇'),
+ 'Auto-Not-For-Us': ('', '', '')}
-for suite in suites:
- if not name:
- break
- if not packages.has_key(suite):
- packages[suite] = {}
-
- query = """WITH last_sources AS (
- SELECT source, max(version) AS version, maintainer
+query = '''WITH last_sources AS (
+ SELECT source, max(version) AS version,
+ maintainer, uploaders, release
FROM sources_uniq
- WHERE release = '%s'
+ WHERE release IN ('sid', 'experimental')
AND architecture != 'all'
- GROUP BY source, maintainer )
- SELECT s.source
+ GROUP BY source, maintainer, uploaders, release )
+ SELECT s.source, s.maintainer, s.uploaders,
+ u.changed_by, u.signed_by, u.nmu, s.release,
+ w.architecture, w.state
FROM last_sources s
- WHERE s.maintainer LIKE '%%%s%%'
- ORDER BY s.source""" % (suite, name)
- cur.execute(query)
- rows = cur.fetchall()
- if len(rows):
- packages[suite][roles[0]] = rows
-
- query = """WITH last_sources AS (
- SELECT source, max(version) AS version, uploaders
- FROM sources_uniq
- WHERE release = '%s'
- AND architecture != 'all'
- GROUP BY source, uploaders )
- SELECT s.source
- FROM last_sources s
- WHERE s.uploaders LIKE '%%%s%%'
- ORDER BY s.source""" % (suite, name)
- cur.execute(query)
- rows = cur.fetchall()
- if len(rows):
- packages[suite][roles[1]] = rows
-
- query = """WITH last_sources AS (
- SELECT source, max(version) AS version
- FROM sources_uniq
- WHERE release = '%s'
- AND architecture != 'all'
- GROUP BY source )
- SELECT s.source
- FROM last_sources s
JOIN upload_history u
ON u.source = s.source
AND u.version = s.version
- WHERE u.signed_by LIKE '%%%s%%'
- AND u.nmu = True
- ORDER BY s.source""" % (suite, name)
- cur.execute(query)
- rows = cur.fetchall()
- if len(rows):
- packages[suite][roles[2]] = rows
+ JOIN wannabuild w
+ ON w.source = s.source
+ AND w.distribution = s.release
+ WHERE s.maintainer LIKE '%%%(name)s%%'
+ OR s.uploaders LIKE '%%%(name)s%%'
+ OR u.changed_by LIKE '%%%(name)s%%'
+ OR u.signed_by LIKE '%%%(name)s%%'
+ ORDER BY s.source''' % {'name': name}
- query = """WITH last_sources AS (
- SELECT source, max(version) AS version, maintainer, uploaders
- FROM sources_uniq
- WHERE release = '%(suite)s'
- AND architecture != 'all'
- GROUP BY source, maintainer, uploaders )
- SELECT s.source
- FROM last_sources s
- JOIN upload_history u
- ON u.source = s.source
- AND u.version = s.version
- WHERE u.signed_by LIKE '%%%(name)s%%'
- AND u.nmu = False
- AND s.maintainer NOT LIKE '%%%(name)s%%'
- AND(
- s.uploaders NOT LIKE '%%%(name)s%%'
- OR s.uploaders IS NULL )
- ORDER BY s.source""" % {'suite': suite, 'name': name}
- cur.execute(query)
- rows = cur.fetchall()
- if len(rows):
- packages[suite][roles[3]] = rows
-
- query = """WITH last_sources AS (
- SELECT source, max(version) AS version, maintainer, uploaders
- FROM sources_uniq
- WHERE release = '%(suite)s'
- AND architecture != 'all'
- GROUP BY source, maintainer, uploaders )
- SELECT s.source
- FROM last_sources s
- JOIN upload_history u
- ON u.source = s.source
- AND u.version = s.version
- WHERE u.changed_by LIKE '%%%(name)s%%'
- AND u.nmu = False
- AND s.maintainer NOT LIKE '%%%(name)s%%'
- AND(
- s.uploaders NOT LIKE '%%%(name)s%%'
- OR s.uploaders IS NULL )
- ORDER BY s.source""" % {'suite': suite, 'name': name}
- cur.execute(query)
- rows = cur.fetchall()
- if len(rows):
- packages[suite][roles[4]] = rows
-
+conn = connect(database='udd', port=5441, host='localhost', user='guest')
+cur = conn.cursor()
+cur.execute(query)
+rows = cur.fetchall()
cur.close()
conn.close()
-print """Content-Type: text/html\n\n
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+for row in rows:
+ if name in row[1]:
+ if not row[0] in packages[row[6]]['maintained']:
+ packages[row[6]]['maintained'][row[0]] = {}
+ packages[row[6]]['maintained'][row[0]][row[7]] = row[8]
+ elif row[2] and name in row[2]:
+ if not row[0] in packages[row[6]]['team']:
+ packages[row[6]]['team'][row[0]] = {}
+ packages[row[6]]['team'][row[0]][row[7]] = row[8]
+ elif name in row[4]:
+ if row[5]:
+ if not row[0] in packages[row[6]]['NMUed']:
+ packages[row[6]]['NMUed'][row[0]] = {}
+ packages[row[6]]['NMUed'][row[0]][row[7]] = row[8]
+ else:
+ if name not in row[1] and (not row[2] or name not in row[2]):
+ if name in row[3]:
+ if not row[0] in packages[row[6]]['QA/other']:
+ packages[row[6]]['QA/other'][row[0]] = {}
+ packages[row[6]]['QA/other'][row[0]][row[7]] = row[8]
+ else:
+ if not row[0] in packages[row[6]]['sponsored']:
+ packages[row[6]]['sponsored'][row[0]] = {}
+ packages[row[6]]['sponsored'][row[0]][row[7]] = row[8]
+ architectures.add(row[7])
+
+print('''Content-Type: text/html\n\n
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Maintainer's buildd status</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-<link rel="StyleSheet" type="text/css" href="https://buildd.debian.org/status/media/pkg.css" />
-<link rel="StyleSheet" type="text/css" href="https://buildd.debian.org/status/media/status.css" >
+<link rel="StyleSheet" type="text/css"
+href="https://buildd.debian.org/status/media/pkg.css" />
+<link rel="StyleSheet" type="text/css"
+href="https://buildd.debian.org/status/media/status.css" />
<style type="text/css">
#header {
height:90px;
@@ -153,6 +126,7 @@
}
</style>
<script type="text/javascript">
+//<![CDATA[
function toggleBuildd(suite) {
var children = document.getElementsByTagName("*");
for (var i = 0; i < children.length; i++) {
@@ -168,42 +142,58 @@
}
}
}
+//]]>
</script>
</head>
<body>
<table id="header" width="100%%">
<tr>
-<td><img src="http://www.debian.org/logos/openlogo.svg" alt="Debian Logo" height="60" /></td>
+<td><img src="http://www.debian.org/logos/openlogo.svg"
+alt="Debian Logo" height="60" /></td>
<td><h1 class="header">Maintainer's buildd status</h1></td>
</tr>
</table>
-<hr>"""
+<hr/>''')
if name:
for suite in suites:
for role in roles:
- if not packages[suite].has_key(role):
+ if not len(packages[suite][role]):
continue
- print '<h3>Buildd status for %s packages in %s</h3>' % (role, suite)
- url = 'https://buildd.debian.org/status/package.php?p='
- for row in packages[suite][role]:
- url += "%s%%2C" % row[0].replace('+', '%2B')
- url += '&suite=%s&compact=compact' % suite
- data = urlopen(url).read()
- data = ''.join(split('(<table class="data">)', data)[1:])
- data = split('</div><div id="footer">', data)[0]
- data = split('(</table>)', data, 1)
- print sub(r'<a href="([aflp])', r'<a href="https://buildd.debian.org/status/\1', "".join(data[:-1]))
- if "".join(data[2:]).startswith('<p>'):
- print '<h5 onclick="toggleBuildd(\'%s%s\')"> show/hide details</h5>' % (suite, role)
- print '<div class="%s%s" style="display: none">' % (suite, role)
- print "".join(data[2:])
- print '</div>'
- print '<hr>'
+ print('<h3>Buildd status for %s packages in %s</h3>' %
+ (role, suite))
+ print('<table class="data"><tr><th>Package</th>')
+ for architecture in sorted(architectures):
+ print('<th><a href="https://buildd.debian.org', sep='', end='')
+ print('/status/architecture.php?a=%s&suite=%s">%s' %
+ (architecture, suite, architecture))
+ print('</a></th>')
+ print('</tr>')
+ for package in sorted(packages[suite][role]):
+ print('<tr>')
+ print('<td><a href="https://buildd.debian.org', sep='', end='')
+ print('/status/package.php?p=%s&suite=%s">%s</a></td>' %
+ (package, suite, package))
+ for architecture in sorted(architectures):
+ if architecture in packages[suite][role][package]:
+ wbstate = packages[suite][role][package][architecture]
+ status = '<td class="status compact status-%s" ' % \
+ wbstatus[wbstate][0]
+ status += 'title="%s">%s</td>' % \
+ (wbstatus[wbstate][1], wbstatus[wbstate][2])
+ else:
+ status = '<td> </td>'
+ print(status)
+ print('</tr>')
+ print('</table>')
else:
- print '<form method="post" action="buildd.cgi">'
- print '<p>Maintainer name: <input type="text" name="maint"/>'
- print '<input type="submit" value="Submit"/></p></form>'
+ print('<form method="post" action="buildd.cgi">')
+ print('<p>Maintainer name: <input type="text" name="maint"/>')
+ print('<input type="submit" value="Submit"/></p></form>')
-print '</body></html>'
-
+print('''<hr/><p><a href="http://validator.w3.org/check?uri=referer"><img
+src="http://www.w3.org/Icons/valid-xhtml11" alt="Valid XHTML 1.1" height="31"
+width="88"/></a><a href="http://jigsaw.w3.org/css-validator/check/referer">
+<img src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"
+height="31" width="88" /></a></p>''')
+print('</body></html>')
More information about the Collab-qa-commits
mailing list