]> git.decadent.org.uk Git - dak.git/commitdiff
autoreject
authorJoerg Jaspert <joerg@debian.org>
Tue, 27 Oct 2009 14:08:09 +0000 (15:08 +0100)
committerJoerg Jaspert <joerg@debian.org>
Tue, 27 Oct 2009 14:08:09 +0000 (15:08 +0100)
add a lintian autoreject function

Signed-off-by: Joerg Jaspert <joerg@debian.org>
config/debian/lintian.tags
dak/process_unchecked.py
daklib/queue.py
daklib/regexes.py

index ee826530d71446006d98b33476f7f67308ece2d5..1c05410ce2b63a3066c078f1d8e4186fb2854362 100644 (file)
@@ -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
index cabdbf3f6f914738f2ad4bf0a6f14d9bf28578e4..331540b7646f6e80fbc56f06737406921af08648 100755 (executable)
@@ -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()
index aca1b8a07f702d9f2756cf70c455031860180fbd..3e2e6ef58d56458ca2a7114a4cda5da006eaa674 100755 (executable)
@@ -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()
index d1f0d38136afcc9616bcd82e3ab50106b4bfa861..7560511f6edd6cae9fa2a52d204d8785f6076bab 100755 (executable)
@@ -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): (.*?): (.*?) (.*)$")