[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