from werkzeug.routing import Map, Rule, RequestRedirect
from werkzeug.wrappers import Request, Response
+ hash_functions = [
+ ("sha512", "sha512"),
++ ("image_sha512", "image_sha512"),
+ ("gzip_sha512", "gzip_sha512"),
+ ("sha512", "gzip_sha512"),
+ ("gzip_sha512", "sha512")]
+
jinjaenv = jinja2.Environment(loader=jinja2.FileSystemLoader("."))
def format_size(size):
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 fetchiter(self.cur):
- 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():
++ for afile, hashval, size, bpkg in fetchiter(self.cur):
+ 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())
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"),
- content_type="text/html")
+ return html_response(package_template.render(params))
def show_detail(self, package1, package2):
if package1 == package2:
(package1, package2))
shared = dict()
- for filename1, filename2, size, function, hashvalue in fetchiter(self.cur):
- shared.setdefault((filename1, filename2, size), dict())[function] = hashvalue
- shared = [dict(filename1=filename1, filename2=filename2, size=size,
- functions=functions)
- for (filename1, filename2, size), functions in shared.items()]
- for filename1, size1, func1, filename2, size2, func2, hashvalue in self.cur.fetchall():
++ for filename1, size1, func1, filename2, size2, func2, hashvalue in fetchiter(self.cur):
+ funccomb = (func1, func2)
+ if funccomb not in hash_functions:
+ continue
+ funcdict = shared.setdefault((filename1, filename2),
+ (size1, size2, dict()))[2]
+ funcdict[(func1, func2)] = hashvalue
+ shared = [dict(filename1=filename1, filename2=filename2, size1=size1,
+ size2=size2, functions=functions)
+ for (filename1, filename2), (size1, size2, functions)
+ in shared.items()]
params = dict(
details1=details1,
details2=details2,
shared=shared)
- return Response(detail_template.render(**params).encode("utf8"),
- content_type="text/html")
+ return html_response(detail_template.render(params))
def show_hash(self, function, hashvalue):
- self.cur.execute("SELECT package, filename, size FROM content WHERE function = ? AND hash = ?;",
- (function, hashvalue))
- entries = [dict(package=package, filename=filename, size=size)
- for package, filename, size in fetchiter(self.cur)]
+ self.cur.execute("SELECT package, filename, size, function FROM content WHERE hash = ?;",
+ (hashvalue,))
+ entries = [dict(package=package, filename=filename, size=size,
+ function=otherfunc)
- for package, filename, size, otherfunc in self.cur.fetchall()
++ for package, filename, size, otherfunc in fetchiter(self.cur)
+ if (function, otherfunc) in hash_functions]
if not entries:
raise NotFound()
params = dict(function=function, hashvalue=hashvalue, entries=entries)