#!/usr/bin/env python import cgitb cgitb.enable() import cgi import sys import time import os.path basedir = os.path.dirname(__file__) dbdir = os.path.join(basedir, 'db') libdir = os.path.join(basedir, 'lib') sys.path.append(libdir) import dblib import distlib import versionlib address = 'tinuviel@sparcs.kaist.ac.kr' def dict_form(): result = {} form = cgi.FieldStorage() for key in form: result[key] = form[key].value return result def get_meta(): metafile = os.path.join(basedir, 'meta.txt') meta = dblib.DB(metafile).uindex('name') return meta def get_conf(name, form): meta = get_meta() info = meta[name] conf = {} for key in info: conf[key] = info[key] for key in form: conf[key] = form[key] return conf def print_header(title, css=None, charset='us-ascii'): http_header = 'Content-Type: text/html; charset=%s\r\n\r\n' % (charset,) sys.stdout.write(http_header) print ('') print '' print '' print '%s' % (title,) if css: print '' % (css,) print '' print '' def print_footer(): print '' print '' def list_available(): print_header('Available Tables') meta = get_meta() print '' print_footer() def main(conf): title = conf.get('title') title = 'Table of %s Packages' % (title,) filename = conf.get('file') filename = os.path.join(dbdir, filename) db = dblib.DB(filename) mtime = time.ctime(os.path.getmtime(filename)) order = conf.get('order') dists = distlib.get_dists(order) projects = db.index('project', 'dist') proj = 0 pkg = 0 xpkg = 0 dist_pkg = dict.fromkeys(dists, 0) dist_xpkg = dict.fromkeys(dists, 0) for project in projects: rows = projects[project] seen = False for dist in dists: if dist not in rows: continue assert len(rows[dist]) == 1 row = rows[dist][0] seen = True distobj = getattr(distlib, row.dist)() if (hasattr(distobj, 'is_testing') and distobj.is_testing(row.section)): xpkg += 1 dist_xpkg[row.dist] += 1 else: pkg += 1 dist_pkg[row.dist] += 1 if seen: proj += 1 else: del projects[project] version_view = conf.get('version') if version_view: versions = {} for project in projects: rows = projects[project] maxversion = () for dist in dists: if dist not in rows: continue assert len(rows[dist]) == 1 row = rows[dist][0] if not row.version: continue version = versionlib.key(row.dist, row.version) if version > maxversion: maxversion = version versions[project] = maxversion print_header(title, 'list.css') if not xpkg: stat = '%d' % (pkg,) else: stat = '%d(%d)' % (pkg, xpkg) print '

' print '%d projects and %s packages in total.
' % (proj, stat) print 'Last modified %s.' % (mtime,) print '

' mail = '%s' % (address, address) print '

Contact %s for suggestions.

''' % (mail,) name = conf.get('name') if version_view: url = '?name=%s' % (name,) print '

Normal view

' % (url,) else: url = '?name=%s&version=1' % (name,) print '

Version view

' % (url,) print '

' print 'packaged' print 'not packaged' print 'in progress' if version_view: print 'current' print 'outdated' print '

' stat_list = [] for dist in dists: pkg, xpkg = dist_pkg[dist], dist_xpkg[dist] if not xpkg: stat = '%s %d' % (dist, pkg) else: stat = '%s %d(%d)' % (dist, pkg, xpkg) stat_list.append(stat) stat_string = ', '.join(stat_list) print '

%s

' % (stat_string,) print '' print '' print '' for dist in dists: print '' % (dist,) print '' for project in projects: print '' print '' % (project,) rows = projects[project] for dist in dists: style = [] if dist not in rows: url = '' style.append('missing') else: assert len(rows[dist]) == 1 row = rows[dist][0] distobj = getattr(distlib, dist)() url = distobj.url(row.section, row.name) name = row.name version = row.version if hasattr(distobj, 'is_testing'): if distobj.is_testing(row.section): style.append('testing') if version_view: info = name text = version if version: maxversion = versions[project] if versionlib.key(dist, version) == maxversion: style.append('current') else: style.append('outdated') else: if distobj.has_version(row.section): text = '(unavailable)' else: text = '(link)' else: info = version text = name s = '' style = ' '.join(style) if url and info: s = '%s' % (url, info, text) elif url: s = '%s' % (url, text) if style: s = '' % (style, s) else: s = '' % (s,) print s print '' print '
%s
%s%s%s
' print_footer() if __name__ == '__main__': form = dict_form() name = form.get('name') if name: conf = get_conf(name, form) main(conf) else: list_available()