X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fchecks.py;h=9916cc755fab492a35e7763692f1ccc6cdde416d;hb=391f5ec09a119131dc846b796ca791f4cecc69e4;hp=70e1f5e398dd3b17e4e5d1f9127f15e4dfb84abb;hpb=f09f34fc963fd7eeb3c4f1992aad66ac0b1777b1;p=dak.git diff --git a/daklib/checks.py b/daklib/checks.py index 70e1f5e3..9916cc75 100644 --- a/daklib/checks.py +++ b/daklib/checks.py @@ -286,13 +286,41 @@ class ExternalHashesCheck(Check): class BinaryCheck(Check): """Check binary packages for syntax errors.""" def check(self, upload): + debug_deb_name_postfix = "-dbgsym" + # XXX: Handle dynamic debug section name here + for binary in upload.changes.binaries: self.check_binary(upload, binary) - binary_names = set([ binary.control['Package'] for binary in upload.changes.binaries ]) - for bn in binary_names: - if bn not in upload.changes.binary_names: - raise Reject('Package {0} is not mentioned in Binary field in changes'.format(bn)) + binaries = {binary.control['Package']: binary + for binary in upload.changes.binaries} + + for name, binary in binaries.items(): + if name in upload.changes.binary_names: + # Package is listed in Binary field. Everything is good. + pass + elif daklib.utils.is_in_debug_section(binary.control): + # If we have a binary package in the debug section, we + # can allow it to not be present in the Binary field + # in the .changes file, so long as its name (without + # -dbgsym) is present in the Binary list. + if not name.endswith(debug_deb_name_postfix): + raise Reject('Package {0} is in the debug section, but ' + 'does not end in {1}.'.format(name, debug_deb_name_postfix)) + + # Right, so, it's named properly, let's check that + # the corresponding package is in the Binary list + origin_package_name = name[:-len(debug_deb_name_postfix)] + if origin_package_name not in upload.changes.binary_names: + raise Reject( + "Debug package {debug}'s corresponding binary package " + "{origin} is not present in the Binary field.".format( + debug=name, origin=origin_package_name)) + else: + # Someone was a nasty little hacker and put a package + # into the .changes that isn't in debian/control. Bad, + # bad person. + raise Reject('Package {0} is not mentioned in Binary field in changes'.format(name)) return True @@ -690,11 +718,23 @@ class NoSourceOnlyCheck(Check): if not allow_no_arch_indep_uploads \ and 'all' not in changes.architectures \ and 'experimental' not in changes.distributions \ + and 'unstable' not in changes.distributions \ + and 'sid' not in changes.distributions \ and changes.source.package_list.has_arch_indep_packages(): raise Reject('Uploads not including architecture-independent packages are not allowed.') return True +class ArchAllBinNMUCheck(Check): + """Check for arch:all binNMUs""" + def check(self, upload): + changes = upload.changes + + if 'all' in changes.architectures and changes.changes.get('Binary-Only') == 'yes': + raise Reject('arch:all binNMUs are not allowed.') + + return True + class LintianCheck(Check): """Check package using lintian""" def check(self, upload): @@ -769,6 +809,14 @@ class SourceFormatCheck(Check): if query.first() is None: raise Reject('source format {0} is not allowed in suite {1}'.format(source_format, suite.suite_name)) +class SuiteCheck(Check): + def per_suite_check(self, upload, suite): + if not suite.accept_source_uploads and upload.changes.source is not None: + raise Reject('The suite "{0}" does not accept source uploads.'.format(suite.suite_name)) + if not suite.accept_binary_uploads and len(upload.changes.binaries) != 0: + raise Reject('The suite "{0}" does not accept binary uploads.'.format(suite.suite_name)) + return True + class SuiteArchitectureCheck(Check): def per_suite_check(self, upload, suite): session = upload.session