From 947358442ce048038a2e1a0bcd02399a9be38786 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Fri, 22 Feb 2013 14:12:33 +0100 Subject: webapp: support matching sha512 against gzip_sha512 This covers only the /binary page. The comparison may still be empty. --- webapp.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/webapp.py b/webapp.py index df8cba7..10e526f 100755 --- a/webapp.py +++ b/webapp.py @@ -8,6 +8,12 @@ from werkzeug.exceptions import HTTPException, NotFound from werkzeug.routing import Map, Rule, RequestRedirect from werkzeug.wrappers import Request, Response +hash_functions = [ + ("sha512", "sha512"), + ("gzip_sha512", "gzip_sha512"), + ("sha512", "gzip_sha512"), + ("gzip_sha512", "sha512")] + jinjaenv = jinja2.Environment(loader=jinja2.FileSystemLoader(".")) def format_size(size): @@ -40,7 +46,7 @@ package_template = jinjaenv.from_string(

Total size: {{ total_size|format_size }}

{%- if shared -%} {%- for function, sharing in shared.items() -%} -

sharing with respect to {{ function }}

+

sharing with respect to {{ function|e }}

{%- for entry in sharing|sort(attribute="savable", reverse=true) -%} @@ -63,7 +69,7 @@ detail_template = jinjaenv.from_string(
packagefiles shareddata shared
{%- for entry in shared|sort(attribute="size", reverse=true) -%} + {%- for function, hashvalue in entry.functions.items() %}{{ function|e }} {% endfor %} {%- endfor -%}
sizefilename in {{ details1.package|e }}filename in {{ details2.package|e }}hash functions
{{ entry.size|format_size }}{{ entry.filename1 }}{{ entry.filename2 }} - {%- for function, hashvalue in entry.functions.items() %}{{ function|e }} {% endfor %}
{%- endif -%} @@ -150,27 +156,30 @@ class Application(object): params = self.get_details(package) params["dependencies"] = self.get_dependencies(package) - shared = dict() - self.cur.execute("SELECT a.filename, a.function, a.hash, a.size, b.package FROM content AS a JOIN content AS b ON a.function = b.function AND a.hash = b.hash WHERE a.package = ? AND (a.filename != b.filename OR b.package != ?);", - (package, package)) - for afile, function, hashval, size, bpkg in self.cur.fetchall(): - pkgdict = shared.setdefault(function, dict()) - hashdict = pkgdict.setdefault(bpkg, dict()) - fileset = hashdict.setdefault(hashval, (size, set()))[1] - fileset.add(afile) sharedstats = {} - if shared: - for function, sharing in shared.items(): - sharedstats[function] = list() + for func1, func2 in hash_functions: + self.cur.execute("SELECT a.filename, a.hash, a.size, b.package FROM content AS a JOIN content AS b ON a.hash = b.hash WHERE a.package = ? AND a.function = ? AND b.function = ? AND (a.filename != b.filename OR b.package != ?);", + (package, func1, func2, package)) + sharing = dict() + for afile, hashval, size, bpkg in self.cur.fetchall(): + hashdict = sharing.setdefault(bpkg, dict()) + fileset = hashdict.setdefault(hashval, (size, set()))[1] + fileset.add(afile) + if sharing: + curstats = list() + if func1 == func2: + sharedstats[func1] = curstats + else: + sharedstats["%s -> %s" % (func1, func2)] = curstats mapping = sharing.pop(package, dict()) if mapping: duplicate = sum(len(files) for _, files in mapping.values()) savable = sum(size * (len(files) - 1) for size, files in mapping.values()) - sharedstats[function].append(dict(package=None, duplicate=duplicate, savable=savable)) + curstats.append(dict(package=None, duplicate=duplicate, savable=savable)) for pkg, mapping in sharing.items(): duplicate = sum(len(files) for _, files in mapping.values()) savable = sum(size * len(files) for size, files in mapping.values()) - sharedstats[function].append(dict(package=pkg, duplicate=duplicate, savable=savable)) + curstats.append(dict(package=pkg, duplicate=duplicate, savable=savable)) params["shared"] = sharedstats return Response(package_template.render(**params).encode("utf8"), -- cgit v1.2.3