From 98711aaaba0f4e55e7c92cf91149df0db5d412a6 Mon Sep 17 00:00:00 2001 From: Joerg Jaspert Date: Tue, 27 Oct 2009 15:08:09 +0100 Subject: [PATCH] autoreject add a lintian autoreject function Signed-off-by: Joerg Jaspert --- config/debian/lintian.tags | 26 +++++++------- dak/process_unchecked.py | 1 + daklib/queue.py | 72 ++++++++++++++++++++++++++++++++++++++ daklib/regexes.py | 1 + 4 files changed, 86 insertions(+), 14 deletions(-) diff --git a/config/debian/lintian.tags b/config/debian/lintian.tags index ee826530..1c05410c 100644 --- a/config/debian/lintian.tags +++ b/config/debian/lintian.tags @@ -1,21 +1,23 @@ lintian: - wayout: + warning: - statically-linked-binary - nowayout: - - copyright-lists-upstream-authors-with-dh_make-boilerplate - - section-is-dh_make-template - arch-independent-package-contains-binary-or-object - arch-dependent-file-in-usr-share - - usr-share-doc-symlink-without-dependency - missing-build-dependency - - package-installs-python-pyc - - library-in-debug-or-profile-should-not-be-stripped - arch-dependent-file-in-usr-share - - binary-in-etc - - binary-file-compressed-with-upx - - binary-with-bad-dynamic-table - missing-dependency-on-libc + - usr-share-doc-symlink-without-dependency + - binary-with-bad-dynamic-table + - usr-share-doc-symlink-without-dependency + - mknod-in-maintainer-script + error: + - binary-in-etc - missing-dependency-on-perlapi + - copyright-lists-upstream-authors-with-dh_make-boilerplate + - section-is-dh_make-template + - package-installs-python-pyc + - library-in-debug-or-profile-should-not-be-stripped + - binary-file-compressed-with-upx - html-changelog-without-text-version - file-in-usr-marked-as-conffile - build-info-in-binary-control-file-section @@ -27,7 +29,6 @@ lintian: - copyright-refers-to-old-directory - copyright-file-compressed - copyright-file-is-symlink - - usr-share-doc-symlink-without-dependency - usr-share-doc-symlink-to-foreign-package - old-style-copyright-file - copyright-refers-to-incorrect-directory @@ -52,7 +53,6 @@ lintian: - maintainer-address-malformed - maintainer-address-is-on-localhost - uploader-name-missing - - uploader-address-missing - uploader-address-malformed - uploader-address-is-on-localhost - no-source-field @@ -63,11 +63,9 @@ lintian: - build-depends-on-build-essential - executable-in-usr-share-doc - symlink-has-too-many-up-segments - - patch-modifying-debian-files - debian-rules-is-symlink - debian-rules-not-a-makefile - debian-rules-missing-required-target - - mknod-in-maintainer-script - maintainer-script-removes-device-files - no-standards-version-field - invalid-standards-version diff --git a/dak/process_unchecked.py b/dak/process_unchecked.py index cabdbf3f..331540b7 100755 --- a/dak/process_unchecked.py +++ b/dak/process_unchecked.py @@ -508,6 +508,7 @@ def process_it(changes_file): valid_dsc_p = u.check_dsc(not Options["No-Action"]) if valid_dsc_p: u.check_source() + u.check_lintian() u.check_hashes() u.check_urgency() u.check_timestamps() diff --git a/daklib/queue.py b/daklib/queue.py index aca1b8a0..3e2e6ef5 100755 --- a/daklib/queue.py +++ b/daklib/queue.py @@ -39,6 +39,7 @@ import utils import commands import shutil import textwrap +import tempfile from types import * import yaml @@ -1206,6 +1207,77 @@ class Upload(object): self.ensure_hashes() + ########################################################################### + def check_lintian(self): + cnf = Config() + tagfile = cnf("Dinstall::LintianTags") + # Parse the yaml file + sourcefile = file(tagfile, 'r') + sourcecontent = sourcefile.read() + try: + lintiantags = yaml.load(sourcecontent) + except yaml.YAMLError, msg: + utils.fubar("Can not read the lintian tags file %s, YAML error: %s." % (tagfile, msg)) + return + + # Now setup the input file for lintian. lintian wants "one tag per line" only, + # so put it together like it. We put all types of tags in one file and then sort + # through lintians output later to see if its a fatal tag we detected, or not. + # So we only run lintian once on all tags, even if we might reject on some, but not + # reject on others. + # Additionally built up a hash of tags + tags = {} + (fd, temp_filename) = utils.temp_filename() + temptagfile = os.fdopen(fd, 'w') + for tagtype in lintiantags: + for tag in lintiantags[tagtype]: + temptagfile.write(tag) + tags[tag]=1 + temptagfile.close() + + # So now we should look at running lintian at the .changes file, capturing output + # to then parse it. + command = "lintian --show-overrides --tags-from-file %s %s" % (temp_filename, self.pkg.changes_file) + (result, output) = commands.getstatusoutput(cmd) + # We are done with lintian, remove our tempfile + os.unlink(temp_filename) + if (result != 0): + self.rejects.append("lintian failed for %s [return code: %s]." % (self.pkg.changes_file, result)) + self.rejects.append(utils.prefix_multi_line_string(output, " [possible output:] "), "") + return + + if len(output) > 0: + # We have output of lintian, this package isn't clean. Lets parse it and see if we + # are having a victim for a reject. + # W: tzdata: binary-without-manpage usr/sbin/tzconfig + for line in output.split('\n'): + m = re_parse_lintian.match(line) + if m: + etype = m.group(1) + epackage = m.group(2) + etag = m.group(3) + etext = m.group(4) + + # So lets check if we know the tag at all. + if tags.has_key(etag): + if etype == 'O': + # We know it and it is overriden. Check that override is allowed. + if lintiantags['warning'][etag]: + # The tag is overriden, and it is allowed to be overriden. + # Continue as if it isnt there. + next + elif lintiantags['error'][etag]: + # The tag is overriden - but is not allowed to be + self.rejects.append("%s: Overriden tag %s found, but this tag may not be overwritten." % (epackage, etag)) + return + else: + # Tag is known, it is not overriden, direct reject. + self.rejects.append("%s: Found lintian output: '%s %s', automatically rejected package." % (epackage, etag, etext)) + # Now tell if they *might* override it. + if lintiantags['wayout'][etag]: + self.rejects.append("%s: If you have a good reason, you may override this lintian tag. Laziness to fix your crap is NOT A GOOD REASON, sod off" % (epackage)) + return + ########################################################################### def check_urgency(self): cnf = Config() diff --git a/daklib/regexes.py b/daklib/regexes.py index d1f0d381..7560511f 100755 --- a/daklib/regexes.py +++ b/daklib/regexes.py @@ -108,3 +108,4 @@ re_user_mails = re.compile(r"^(pub|uid):[^rdin].*<(.*@.*)>.*$", re.MULTILINE); re_user_name = re.compile(r"^pub:.*:(.*)<.*$", re.MULTILINE); re_re_mark = re.compile(r'^RE:') +re_parse_lintian = re.compile(r"^(W|E|O): (.*?): (.*?) (.*)$") -- 2.39.5