X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=daklib%2Farchive.py;h=04c55c0ae8f45ba0e7b4f63870b24a627fe191e5;hb=2b8e14db14a20525fc6bb4b38fee86d99e4d382c;hp=372ab8a947b67c3cb0f8eefad470ae31fafd6866;hpb=1eeb90f6bf381e10fcd8f0a04437883b443855d5;p=dak.git diff --git a/daklib/archive.py b/daklib/archive.py index 372ab8a9..04c55c0a 100644 --- a/daklib/archive.py +++ b/daklib/archive.py @@ -33,6 +33,7 @@ from datetime import datetime import os import shutil from sqlalchemy.orm.exc import NoResultFound +from sqlalchemy.orm import object_session import sqlalchemy.exc import tempfile import traceback @@ -540,6 +541,34 @@ class ArchiveTransaction(object): self.rollback() return None +def source_component_from_package_list(package_list, suite): + """Get component for a source package + + This function will look at the Package-List field to determine the + component the source package belongs to. This is the first component + the source package provides binaries for (first with respect to the + ordering of components). + + It the source package has no Package-List field, None is returned. + + @type package_list: L{daklib.packagelist.PackageList} + @param package_list: package list of the source to get the override for + + @type suite: L{daklib.dbconn.Suite} + @param suite: suite to consider for binaries produced + + @rtype: L{daklib.dbconn.Component} or C{None} + @return: component for the given source or C{None} + """ + if package_list.fallback: + return None + session = object_session(suite) + packages = package_list.packages_for_suite(suite) + components = set(p.component for p in packages) + query = session.query(Component).order_by(Component.ordering) \ + .filter(Component.component_name.in_(components)) + return query.first() + class ArchiveUpload(object): """handle an upload @@ -739,6 +768,23 @@ class ArchiveUpload(object): suites = session.query(Suite).filter(Suite.suite_name.in_(suite_names)) return suites + def _check_new_binary_overrides(self, suite): + new = False + + binaries = self.changes.binaries + source = self.changes.source + if source is not None and not source.package_list.fallback: + packages = source.package_list.packages_for_suite(suite) + binaries = [ entry for entry in packages ] + + for b in binaries: + override = self._binary_override(suite, b) + if override is None: + self.warnings.append('binary:{0} is NEW.'.format(b.name)) + new = True + + return new + def _check_new(self, suite): """Check if upload is NEW @@ -753,12 +799,8 @@ class ArchiveUpload(object): new = False # Check for missing overrides - for b in self.changes.binaries: - override = self._binary_override(suite, b) - if override is None: - self.warnings.append('binary:{0} is NEW.'.format(b.control['Package'])) - new = True - + if self._check_new_binary_overrides(suite): + new = True if self.changes.source is not None: override = self._source_override(suite, self.changes.source) if override is None: @@ -804,7 +846,7 @@ class ArchiveUpload(object): @type suite: L{daklib.dbconn.Suite} @param suite: suite to get override for - @type binary: L{daklib.upload.Binary} + @type binary: L{daklib.upload.Binary} or L{daklib.packagelist.PackageListEntry} @param binary: binary to get override for @rtype: L{daklib.dbconn.Override} or C{None} @@ -817,7 +859,7 @@ class ArchiveUpload(object): if mapped_component is None: return None - query = self.session.query(Override).filter_by(suite=suite, package=binary.control['Package']) \ + query = self.session.query(Override).filter_by(suite=suite, package=binary.name) \ .join(Component).filter(Component.component_name == mapped_component.component_name) \ .join(OverrideType).filter(OverrideType.overridetype == binary.type) @@ -841,10 +883,13 @@ class ArchiveUpload(object): if suite.overridesuite is not None: 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']) \ .join(OverrideType).filter(OverrideType.overridetype == 'dsc') + component = source_component_from_package_list(source.package_list, suite) + if component is not None: + query = query.filter(Override.component == component) + try: return query.one() except NoResultFound: @@ -889,6 +934,7 @@ class ArchiveUpload(object): # Validate signatures and hashes before we do any real work: for chk in ( checks.SignatureAndHashesCheck, + checks.SignatureTimestampCheck, checks.ChangesCheck, checks.ExternalHashesCheck, checks.SourceCheck,