[dak/master 02/16] autoreject
add a lintian autoreject function
Signed-off-by: Joerg Jaspert <joerg@debian.org>
---
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 ee82653..1c05410 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 cabdbf3..331540b 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 aca1b8a..3e2e6ef 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
@@ -1207,6 +1208,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()
if self.pkg.changes["architecture"].has_key("source"):
diff --git a/daklib/regexes.py b/daklib/regexes.py
index d1f0d38..7560511 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): (.*?): (.*?) (.*)$")
--
1.6.3.3
Reply to: