Merge branch 'crosshash'
authorHelmut Grohne <helmut@subdivi.de>
Mon, 25 Feb 2013 09:00:50 +0000 (10:00 +0100)
committerHelmut Grohne <helmut@subdivi.de>
Mon, 25 Feb 2013 09:00:50 +0000 (10:00 +0100)
Conflicts in webapp.py:
 * The fetchall -> fetchiter change caused big conflicts.
 * New hash combination (image_sha512, image_sha512) added.

1  2 
webapp.py

diff --cc webapp.py
+++ b/webapp.py
@@@ -9,6 -8,12 +9,13 @@@ from werkzeug.exceptions import HTTPExc
  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):
@@@ -173,18 -160,21 +184,21 @@@ 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 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)