]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/checks.py
Improve error message for uploads that miss files.
[dak.git] / daklib / checks.py
index 8111ef7555e1198729a7f7cf1fbda4b009245f78..7298026208a82a8f231812b253a581f7c9b5d2f0 100644 (file)
@@ -34,6 +34,7 @@ import daklib.utils as utils
 import apt_inst
 import apt_pkg
 from apt_pkg import version_compare
+import errno
 import os
 import time
 import yaml
@@ -45,6 +46,12 @@ class Reject(Exception):
     """exception raised by failing checks"""
     pass
 
+class RejectStupidMaintainerException(Exception):
+    """exception raised by failing the external hashes check"""
+
+    def __str__(self):
+        return "'%s' has mismatching %s from the external files db ('%s' [current] vs '%s' [external])" % self.args[:4]
+
 class Check(object):
     """base class for checks
 
@@ -159,13 +166,60 @@ class ChangesCheck(Check):
 class HashesCheck(Check):
     """Check hashes in .changes and .dsc are valid."""
     def check(self, upload):
+        what = None
+        try:
+            changes = upload.changes
+            what = changes.filename
+            for f in changes.files.itervalues():
+                f.check(upload.directory)
+            source = changes.source
+            what = source.filename
+            if source is not None:
+                for f in source.files.itervalues():
+                    f.check(upload.directory)
+        except IOError as e:
+            if e.errno == errno.ENOENT:
+                raise Reject('{0} refers to non-existing file: {1}\n'
+                             'Perhaps you need to include it in your upload?'
+                             .format(what, os.path.basename(e.filename)))
+            raise
+
+class ExternalHashesCheck(Check):
+    """Checks hashes in .changes and .dsc against an external database."""
+    def check_single(self, session, f):
+        q = session.execute("SELECT size, md5sum, sha1sum, sha256sum FROM external_files WHERE filename LIKE '%%/%s'" % f.filename)
+        (ext_size, ext_md5sum, ext_sha1sum, ext_sha256sum) = q.fetchone() or (None, None, None, None)
+
+        if not ext_size:
+            return
+
+        if ext_size != f.size:
+            raise RejectStupidMaintainerException(f.filename, 'size', f.size, ext_size)
+
+        if ext_md5sum != f.md5sum:
+            raise RejectStupidMaintainerException(f.filename, 'md5sum', f.md5sum, ext_md5sum)
+
+        if ext_sha1sum != f.sha1sum:
+            raise RejectStupidMaintainerException(f.filename, 'sha1sum', f.sha1sum, ext_sha1sum)
+
+        if ext_sha256sum != f.sha256sum:
+            raise RejectStupidMaintainerException(f.filename, 'sha256sum', f.sha256sum, ext_sha256sum)
+
+    def check(self, upload):
+        cnf = Config()
+
+        if not cnf.use_extfiles:
+            return
+
+        session = upload.session
         changes = upload.changes
+
         for f in changes.files.itervalues():
-            f.check(upload.directory)
-            source = changes.source
+            self.check_single(session, f)
+        source = changes.source
         if source is not None:
             for f in source.files.itervalues():
-                f.check(upload.directory)
+                self.check_single(session, f)
 
 class BinaryCheck(Check):
     """Check binary packages for syntax errors."""