X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue.py;h=35b85a7de7c61a3d044bf3c59303eddd19682c08;hb=ce324ffde27b192a8e713b6e98368a3b00edaf27;hp=aca1b8a07f702d9f2756cf70c455031860180fbd;hpb=8e12b3256ebf21e07c6edeb296f5c3ccc848a661;p=dak.git diff --git a/daklib/queue.py b/daklib/queue.py index aca1b8a0..35b85a7d 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,81 @@ 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() + 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(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 lintiantags['warning'][etag]: + # The tag is overriden, and it is allowed to be overriden. + # Don't add a reject message. + 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)) + 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)) + ########################################################################### def check_urgency(self): cnf = Config()