summaryrefslogtreecommitdiffstatshomepage
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/minimaws/lib/dbaccess.py14
-rw-r--r--scripts/minimaws/lib/htmltmpl.py39
-rw-r--r--scripts/minimaws/lib/lxparse.py3
-rw-r--r--scripts/minimaws/lib/wsgiserve.py42
4 files changed, 97 insertions, 1 deletions
diff --git a/scripts/minimaws/lib/dbaccess.py b/scripts/minimaws/lib/dbaccess.py
index f81dad66b83..d5fe557ff91 100644
--- a/scripts/minimaws/lib/dbaccess.py
+++ b/scripts/minimaws/lib/dbaccess.py
@@ -644,6 +644,20 @@ class QueryCursor(object):
'ORDER BY ramoption.size',
(machine, ))
+ def get_softwarelists(self, pattern):
+ if pattern is not None:
+ return self.dbcurs.execute(
+ 'SELECT softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(*) AS total, COUNT(CASE software.supported WHEN 0 THEN 1 ELSE NULL END) AS supported, COUNT(CASE software.supported WHEN 1 THEN 1 ELSE NULL END) AS partiallysupported, COUNT(CASE software.supported WHEN 2 THEN 1 ELSE NULL END) AS unsupported ' \
+ 'FROM softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \
+ 'WHERE softwarelist.shortname GLOB ? ' \
+ 'GROUP BY softwarelist.id',
+ (pattern, ))
+ else:
+ return self.dbcurs.execute(
+ 'SELECT softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(*) AS total, COUNT(CASE software.supported WHEN 0 THEN 1 ELSE NULL END) AS supported, COUNT(CASE software.supported WHEN 1 THEN 1 ELSE NULL END) AS partiallysupported, COUNT(CASE software.supported WHEN 2 THEN 1 ELSE NULL END) AS unsupported ' \
+ 'FROM softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \
+ 'GROUP BY softwarelist.id')
+
def get_rom_dumps(self, crc, sha1):
return self.dbcurs.execute(
'SELECT machine.shortname AS shortname, machine.description AS description, romdump.name AS label, romdump.bad AS bad ' \
diff --git a/scripts/minimaws/lib/htmltmpl.py b/scripts/minimaws/lib/htmltmpl.py
index 55034b0d079..627de7de2bc 100644
--- a/scripts/minimaws/lib/htmltmpl.py
+++ b/scripts/minimaws/lib/htmltmpl.py
@@ -164,6 +164,45 @@ SOURCEFILE_LIST_ROW = string.Template(
' <td style="text-align: right">${machines}</td>\n' \
' </tr>\n')
+
+SOFTWARELIST_LIST_PROLOGUE = string.Template(
+ '<!DOCTYPE html>\n' \
+ '<html>\n' \
+ '<head>\n' \
+ ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n' \
+ ' <meta http-equiv="Content-Style-Type" content="text/css">\n' \
+ ' <meta http-equiv="Content-Script-Type" content="text/javascript">\n' \
+ ' <link rel="stylesheet" type="text/css" href="${assets}/style.css">\n' \
+ ' <script type="text/javascript">var assetsurl="${assets}"</script>\n' \
+ ' <script type="text/javascript" src="${assets}/common.js"></script>\n' \
+ ' <title>${title}</title>\n' \
+ '</head>\n' \
+ '<body>\n' \
+ '<h1>${heading}</h1>\n' \
+ '<table id="tbl-softwarelists">\n' \
+ ' <thead>\n' \
+ ' <tr>\n' \
+ ' <th>Short name</th>\n' \
+ ' <th>Description</th>\n' \
+ ' <th class="numeric">Total</th>\n' \
+ ' <th class="numeric">Supported</th>\n' \
+ ' <th class="numeric">Partially supported</th>\n' \
+ ' <th class="numeric">Unsupported</th>\n' \
+ ' </tr>\n' \
+ ' </thead>\n' \
+ ' <tbody>\n')
+
+SOFTWARELIST_LIST_ROW = string.Template(
+ ' <tr>\n' \
+ ' <td><a href="${href}">${shortname}</a></td>\n' \
+ ' <td><a href="${href}">${description}</a></td>\n' \
+ ' <td style="text-align: right">${total}</td>\n' \
+ ' <td style="text-align: right">${supported}</td>\n' \
+ ' <td style="text-align: right">${partiallysupported}</td>\n' \
+ ' <td style="text-align: right">${unsupported}</td>\n' \
+ ' </tr>\n')
+
+
ROMIDENT_PAGE = string.Template(
'<!DOCTYPE html>\n' \
'<html>\n' \
diff --git a/scripts/minimaws/lib/lxparse.py b/scripts/minimaws/lib/lxparse.py
index 746cba33fe8..91208eb7fb1 100644
--- a/scripts/minimaws/lib/lxparse.py
+++ b/scripts/minimaws/lib/lxparse.py
@@ -406,7 +406,8 @@ def load_info(options):
if options.softwarepath:
parser.setContentHandler(SoftwareListHandler(dbconn))
for path in options.softwarepath:
- for filename in [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')]:
+ files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')]
+ for filename in files:
parser.parse(filename)
dbconn.finalise_load()
diff --git a/scripts/minimaws/lib/wsgiserve.py b/scripts/minimaws/lib/wsgiserve.py
index da9cbed0f36..7ea3823bb02 100644
--- a/scripts/minimaws/lib/wsgiserve.py
+++ b/scripts/minimaws/lib/wsgiserve.py
@@ -103,6 +103,9 @@ class QueryPageHandler(HandlerBase):
def sourcefile_href(self, sourcefile):
return cgi.escape(urlparse.urljoin(self.application_uri, 'sourcefile/%s' % (urlquote(sourcefile), )), True)
+ def softwarelist_href(self, softwarelist):
+ return cgi.escape(urlparse.urljoin(self.application_uri, 'softwarelist/%s' % (urlquote(softwarelist), )), True)
+
class MachineRpcHandlerBase(QueryPageHandler):
def __init__(self, app, application_uri, environ, start_response, **kwargs):
@@ -426,6 +429,43 @@ class SourceFileHandler(QueryPageHandler):
parent=cgi.escape(machine_info['cloneof'] or '')).encode('utf-8')
+class SoftwareListHandler(QueryPageHandler):
+ def __init__(self, app, application_uri, environ, start_response, **kwargs):
+ super(SoftwareListHandler, self).__init__(app=app, application_uri=application_uri, environ=environ, start_response=start_response, **kwargs)
+
+ def __iter__(self):
+ self.filename = self.environ['PATH_INFO']
+ if self.filename and (self.filename[0] == '/'):
+ self.filename = self.filename[1:]
+ if (not self.filename) or ('*' in self.filename) or ('?' in self.filename):
+ if self.environ['REQUEST_METHOD'] != 'GET':
+ self.start_response('405 %s' % (self.STATUS_MESSAGE[405], ), [('Content-type', 'text/html; charset=utf-8'), ('Accept', 'GET, HEAD, OPTIONS'), ('Cache-Control', 'public, max-age=3600')])
+ return self.error_page(405)
+ else:
+ self.start_response('200 OK', [('Content-type', 'text/html; chearset=utf-8'), ('Cache-Control', 'public, max-age=3600')])
+ return self.softwarelist_listing_page(self.filename if self.filename else None)
+
+ def softwarelist_listing_page(self, pattern):
+ if not pattern:
+ title = heading = 'All Software Lists'
+ else:
+ title = heading = 'Software Lists: ' + cgi.escape(pattern)
+ yield htmltmpl.SOFTWARELIST_LIST_PROLOGUE.substitute(
+ assets=cgi.escape(urlparse.urljoin(self.application_uri, 'static'), True),
+ title=title,
+ heading=heading).encode('utf-8')
+ for shortname, description, total, supported, partiallysupported, unsupported in self.dbcurs.get_softwarelists(pattern):
+ yield htmltmpl.SOFTWARELIST_LIST_ROW.substitute(
+ href=self.softwarelist_href(shortname),
+ shortname=cgi.escape(shortname),
+ description=cgi.escape(description),
+ total=cgi.escape('%d' % total),
+ supported=cgi.escape('%d' % supported),
+ partiallysupported=cgi.escape('%d' % partiallysupported),
+ unsupported=cgi.escape('%d' % unsupported)).encode('utf-8')
+ yield ' </tbody>\n</table>\n<script>make_table_sortable(document.getElementById("tbl-softwarelists"));</script>\n</body>\n</html>\n'.encode('utf-8')
+
+
class RomIdentHandler(QueryPageHandler):
def __init__(self, app, application_uri, environ, start_response, **kwargs):
super(QueryPageHandler, self).__init__(app=app, application_uri=application_uri, environ=environ, start_response=start_response, **kwargs)
@@ -598,6 +638,8 @@ class MiniMawsApp(object):
return MachineHandler(self, application_uri, environ, start_response)
elif module == 'sourcefile':
return SourceFileHandler(self, application_uri, environ, start_response)
+ elif module == 'softwarelist':
+ return SoftwareListHandler(self, application_uri, environ, start_response)
elif module == 'romident':
return RomIdentHandler(self, application_uri, environ, start_response)
elif module == 'static':