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
- 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
- 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
- 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
import commands
import shutil
import textwrap
+import tempfile
from types import *
import yaml
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()