[kernel] r5093 - patch-tracking/scripts

Dann Frazier dannf at costa.debian.org
Mon Dec 26 01:32:38 UTC 2005


Author: dannf
Date: Mon Dec 26 01:32:37 2005
New Revision: 5093

Added:
   patch-tracking/scripts/html-report   (contents, props changed)
Log:
initial commit


Added: patch-tracking/scripts/html-report
==============================================================================
--- (empty file)
+++ patch-tracking/scripts/html-report	Mon Dec 26 01:32:37 2005
@@ -0,0 +1,155 @@
+#!/usr/bin/python
+
+import os, os.path, sys
+import deb822, re
+
+TrackerDir = ".."
+
+## get an unsorted list of tracked issues
+def trackedIssues(dir):
+    ignores = [ re.compile('~$'),
+                re.compile('^#.*#$'),
+                re.compile('^00'),
+                re.compile('\.patch$')]
+               
+    validpaths = []
+    for f in os.listdir(dir):
+        nogood = False
+        for i in ignores:
+            if i.search(f):
+                nogood = True
+                break
+        if nogood:
+            continue
+        else:
+            validpaths.append(f)
+
+    issues = []
+    for f in validpaths:
+        path = os.path.join(dir, f)
+        if os.path.isfile(path):
+            issues.append(f)
+    return issues
+
+def trackedVersions(dir):
+    pkglist = os.path.join(dir, '00pkglist')
+    f = open(pkglist, 'r')
+    return f.read().split('\n')[:-1]
+
+def issueStatus(issue, version):
+    path = os.path.join(TrackerDir, issue)
+    i = deb822.deb822(open(path, 'r'))
+    if i.hasField(version):
+        return i.map[version]
+    else:
+        return None
+
+def statusMatrix(issues, versions):
+    Di = {}
+    for i in issues:
+        Dv = {}
+        for v in versions:
+            Dv[v] = issueStatus(i, v)
+        Di[i] = Dv
+    return Di
+
+## remaining functions create the HTML
+def htmlHeader():
+    sys.stdout.write('<html>\n')
+    sys.stdout.write('<head>\n')
+    sys.stdout.write('  <title>Debian Kernel Patch Tracker Status</title>\n')
+    sys.stdout.write('</head>\n')
+    sys.stdout.write('<body>\n')
+    sys.stdout.write('<h1><center>Debian Kernel Patch Tracker Status</center></h1>')
+    key = '''
+    <table border=1>
+      <tr>
+        <td>Key</td>
+      </tr>
+      <tr>
+        <td bgcolor="green">Fixed or N/A - version is listed if specified</td>
+      </tr>
+      <tr>
+        <td bgcolor="lightgreen">Pending - version is listed if specified</td>
+      </tr>
+      <tr>
+        <td bgcolor="yellow">Needed</td>
+      </tr>
+    </table>'''
+    sys.stdout.write(key)
+    sys.stdout.write('<BR>\n')
+      
+
+def htmlFooter():
+    sys.stdout.write('  </body>\n')
+    sys.stdout.write('</html>\n')
+                     
+def tableHeader(columns):
+    ## populateTable() will assume columns should be filled out
+    ## in sort() order, so make sure our column names match
+    columns.sort()
+    sys.stdout.write("<table border=1>\n")
+    sys.stdout.write("  <tr>\n")
+    sys.stdout.write("    <td> </td>\n")
+    for c in columns:
+        sys.stdout.write("    <td>"+c+"</td>\n")
+    sys.stdout.write("  </tr>\n")
+
+def tableFooter():
+    sys.stdout.write("</table>\n")
+
+## Parse a status string, and return an html table entry
+def statusCell(status):
+    if not status:
+        return '<td color="grey">Unknown</td>'
+
+    statusRe = re.compile("(?P<status>\S+)(\s*\((?P<ver>.*)\))?(\s*\[(?P<name>.*)\])?$")
+
+    m = statusRe.match(status)
+    if m:
+        d = m.groupdict()
+        ver = name = ""
+        if d.has_key('ver') and d['ver']:
+            ver = d['ver']
+        if d.has_key('name') and d['name']:
+            name = d['name']
+
+        if d['status'] == 'N/A':
+            return '<td bgcolor="green">N/A</td>'
+        elif d['status'] == "released":
+            return '<td bgcolor="green">' + ver + '</td>'
+        elif d['status'] == "pending":
+            return '<td bgcolor="lightgreen">' + ver + '</td>'
+        elif d['status'] == "needed":
+            return '<td bgcolor="yellow">' + ver + '</td>'
+    else:
+        return '<td bgcolor="grey">Unknown</td>'
+
+def populateTable(matrix):
+    issues = matrix.keys()
+    issues.sort()
+
+    for i in issues:
+        versions = matrix[i].keys()
+        versions.sort()
+        sys.stdout.write('  <tr>\n')
+        sys.stdout.write('    <td>' + i + '</td>\n')
+        for v in versions:
+            cell = statusCell(matrix[i][v])
+            if cell:
+                sys.stdout.write(cell)
+            else:
+                sys.stderr.write("Error in field: " + i + ", " + v + "\n")
+        sys.stdout.write('  </tr>\n')
+    
+if __name__ == '__main__':
+    ## Doing this in a separate stage means some unnecessary duplicate
+    ## opens & closes... but oh well - our data set isn't very large
+    issues = trackedIssues(TrackerDir)
+    versions = trackedVersions(TrackerDir)
+
+    htmlHeader()
+    tableHeader(versions)
+    populateTable(statusMatrix(issues, versions))
+    tableFooter()
+    htmlFooter()



More information about the Kernel-svn-changes mailing list