]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/archive.py
daklib/archive.py, daklib/checks.py: implement upload blocks
[dak.git] / daklib / archive.py
index 2ee4d89b04cd970576f2dbcd6f7e6a9d5c0bf939..6024e3e8d930f68ffac7d7d76d044409c8f8ea2e 100644 (file)
@@ -382,8 +382,14 @@ class ArchiveTransaction(object):
         if archive.tainted:
             allow_tainted = True
 
-        # make sure built-using packages are present in target archive
         filename = db_binary.poolfile.filename
+
+        # make sure source is present in target archive
+        db_source = db_binary.source
+        if session.query(ArchiveFile).filter_by(archive=archive, file=db_source.poolfile).first() is None:
+            raise ArchiveException('{0}: cannot copy to {1}: source is not present in target archive'.format(filename, suite.suite_name))
+
+        # make sure built-using packages are present in target archive
         for db_source in db_binary.extra_sources:
             self._ensure_extra_source_exists(filename, db_source, archive, extra_archives=extra_archives)
 
@@ -629,6 +635,29 @@ class ArchiveUpload(object):
         suites = session.query(Suite).filter(Suite.suite_name.in_(suite_names))
         return suites
 
+    def _mapped_component(self, component_name):
+        """get component after mappings
+
+        Evaluate component mappings from ComponentMappings in dak.conf for the
+        given component name.
+
+        NOTE: ansgar wants to get rid of this. It's currently only used for
+        the security archive
+
+        Args:
+           component_name (str): component name
+
+        Returns:
+           `daklib.dbconn.Component` object
+        """
+        cnf = Config()
+        for m in cnf.value_list("ComponentMappings"):
+            (src, dst) = m.split()
+            if component_name == src:
+                component_name = dst
+        component = self.session.query(Component).filter_by(component_name=component_name).one()
+        return component
+
     def _check_new(self, suite):
         """Check if upload is NEW
 
@@ -693,7 +722,7 @@ class ArchiveUpload(object):
            daklib.dbconn.Override or None
         """
         if suite.overridesuite is not None:
-            suite = session.query(Suite).filter_by(suite_name=suite.overridesuite).one()
+            suite = self.session.query(Suite).filter_by(suite_name=suite.overridesuite).one()
 
         query = self.session.query(Override).filter_by(suite=suite, package=binary.control['Package']) \
                 .join(Component).filter(Component.component_name == binary.component) \
@@ -715,7 +744,7 @@ class ArchiveUpload(object):
            daklib.dbconn.Override or None
         """
         if suite.overridesuite is not None:
-            suite = session.query(Suite).filter_by(suite_name=suite.overridesuite).one()
+            suite = self.session.query(Suite).filter_by(suite_name=suite.overridesuite).one()
 
         # XXX: component for source?
         query = self.session.query(Override).filter_by(suite=suite, package=source.dsc['Source']) \
@@ -726,6 +755,30 @@ class ArchiveUpload(object):
         except NoResultFound:
             return None
 
+    def _binary_component(self, suite, binary, only_overrides=True):
+        """get component for a binary
+
+        By default this will only look at overrides to get the right component;
+        if `only_overrides` is False this method will also look at the Section field.
+
+        Args:
+           suite (daklib.dbconn.Suite)
+           binary (daklib.upload.Binary)
+
+        Kwargs:
+           only_overrides (bool): only use overrides to get the right component.
+               defaults to True.
+
+        Returns:
+           `daklib.dbconn.Component` object or None
+        """
+        override = self._binary_override(suite, binary)
+        if override is not None:
+            return override.component
+        if only_overrides:
+            return None
+        return self._mapped_component(binary.component)
+
     def check(self, force=False):
         """run checks against the upload
 
@@ -742,9 +795,11 @@ class ArchiveUpload(object):
             for chk in (
                     checks.SignatureCheck,
                     checks.ChangesCheck,
+                    checks.UploadBlockCheck,
                     checks.HashesCheck,
                     checks.SourceCheck,
                     checks.BinaryCheck,
+                    checks.BinaryTimestampCheck,
                     checks.ACLCheck,
                     checks.SingleDistributionCheck,
                     checks.NoSourceOnlyCheck,
@@ -899,7 +954,13 @@ class ArchiveUpload(object):
 
         remaining = []
         for f in byhand:
-            package, version, archext = f.filename.split('_', 2)
+            parts = f.filename.split('_', 2)
+            if len(parts) != 3:
+                print "W: unexpected byhand filename {0}. No automatic processing.".format(f.filename)
+                remaining.append(f)
+                continue
+
+            package, version, archext = parts
             arch, ext = archext.split('.', 1)
 
             rule = automatic_byhand_packages.get(package)
@@ -996,7 +1057,7 @@ class ArchiveUpload(object):
                 redirected_suite = suite.policy_queue.suite
 
             source_component_func = lambda source: self._source_override(overridesuite, source).component
-            binary_component_func = lambda binary: self._binary_override(overridesuite, binary).component
+            binary_component_func = lambda binary: self._binary_component(overridesuite, binary)
 
             (db_source, db_binaries) = self._install_to_suite(redirected_suite, source_component_func, binary_component_func, extra_source_archives=[suite.archive])
 
@@ -1038,12 +1099,7 @@ class ArchiveUpload(object):
         suite = suites[0]
 
         def binary_component_func(binary):
-            override = self._binary_override(suite, binary)
-            if override is not None:
-                return override.component
-            component_name = binary.component
-            component = self.session.query(Component).filter_by(component_name=component_name).one()
-            return component
+            return self._binary_component(suite, binary, only_overrides=False)
 
         # guess source component
         # XXX: should be moved into an extra method
@@ -1052,7 +1108,8 @@ class ArchiveUpload(object):
             component = binary_component_func(binary)
             binary_component_names.add(component.component_name)
         source_component_name = None
-        for guess in ('main', 'contrib', 'non-free'):
+        for c in self.session.query(Component).order_by(Component.component_id):
+            guess = c.component_name
             if guess in binary_component_names:
                 source_component_name = guess
                 break