X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Farchive.py;h=b96b98924b837035e83b7f1e107157bbc174fcb2;hb=25d2c2a5adf89a13412d48ae2908bf0a104a6799;hp=d6f8f2f6155c944e5c40483ffa62726159a5b624;hpb=6db70697649dd1a30d085d78643e1d6e9f3b8d5b;p=dak.git diff --git a/daklib/archive.py b/daklib/archive.py index d6f8f2f6..b96b9892 100644 --- a/daklib/archive.py +++ b/daklib/archive.py @@ -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 @@ -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 @@ -745,6 +798,7 @@ class ArchiveUpload(object): checks.HashesCheck, checks.SourceCheck, checks.BinaryCheck, + checks.BinaryTimestampCheck, checks.ACLCheck, checks.SingleDistributionCheck, checks.NoSourceOnlyCheck, @@ -899,7 +953,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 +1056,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 +1098,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 +1107,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