]> git.donarmstrong.com Git - dak.git/commitdiff
Merge branch 'master' of ries.debian.org:/srv/ftp.debian.org/git/dak
authorChris Lamb <lamby@debian.org>
Tue, 27 Oct 2009 21:04:44 +0000 (21:04 +0000)
committerChris Lamb <lamby@debian.org>
Tue, 27 Oct 2009 21:04:44 +0000 (21:04 +0000)
* 'master' of ries.debian.org:/srv/ftp.debian.org/git/dak:
  Disable check_lintian for now.
  clean-queues: Add proper logging
  Only lintian reject uploads to unstable or experimental
  Fix use of "wayout" name.
  dict[k] raises IndexError if does not exist - check with infix 'in' instead.
  Actually add a seperator to our --tags-from-file input.
  lintian YAML has a "lintian" root element.
  Close sourcefile.
  Dedent again by returning if lintian doesn't return any content.
  Return all the lintian-related rejections, not just the first one.
  It's called 'next', not 'continue'. =)
  Dedent again by using continue.
  Remove one level of indentation by using continue
  Simple check for lintian regex
  Use set() instead of Perlesque hash[key] = 1
  autoreject
  Add lintian tags file

1  2 
daklib/queue.py

diff --combined daklib/queue.py
index 8bb063079bb5f0cde30cde0b252f7218746f2d10,b3247ee1924c1f8188bfae42105eb77387efb41c..7bdff49f8216563ceb077b1d9e0e32c4cfb65f60
@@@ -26,6 -26,7 +26,6 @@@ Queue utility functions for da
  
  ###############################################################################
  
 -import cPickle
  import errno
  import os
  import pg
@@@ -38,6 -39,7 +38,7 @@@ import util
  import commands
  import shutil
  import textwrap
+ import tempfile
  from types import *
  
  import yaml
@@@ -1194,6 -1196,91 +1195,91 @@@ class Upload(object)
  
          self.ensure_hashes()
  
+     ###########################################################################
+     def check_lintian(self):
+         # Only check some distributions
+         valid_dist = False
+         for dist in ('unstable', 'experimental'):
+             if dist in self.pkg.changes['distribution']:
+                 valid_dist = True
+                 break
+         if not valid_dist:
+             return
+         cnf = Config()
+         tagfile = cnf("Dinstall::LintianTags")
+         # Parse the yaml file
+         sourcefile = file(tagfile, 'r')
+         sourcecontent = sourcefile.read()
+         sourcefile.close()
+         try:
+             lintiantags = yaml.load(sourcecontent)['lintian']
+         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 build up a set of tags
+         tags = set()
+         (fd, temp_filename) = utils.temp_filename()
+         temptagfile = os.fdopen(fd, 'w')
+         for tagtype in lintiantags:
+             for tag in lintiantags[tagtype]:
+                 temptagfile.write("%s\n" % tag)
+                 tags.add(tag)
+         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:
+             return
+         # 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 is None:
+                 continue
+             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 etag not in tags:
+                 continue
+             if etype == 'O':
+                 # We know it and it is overriden. Check that override is allowed.
+                 if etag in lintiantags['warning']:
+                     # The tag is overriden, and it is allowed to be overriden.
+                     # Don't add a reject message.
+                 elif etag in lintiantags['error']:
+                     # 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))
+             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 etag in lintiantags['warning']:
+                     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))
      ###########################################################################
      def check_urgency(self):
          cnf = Config()