]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/queue.py
Don't reject binary uploads. Sorry buildd maintainers.
[dak.git] / daklib / queue.py
index f64e8ae6bd9f3501668f225de8a904fef80f2555..a539e54788c3de15b3effdf65469191c7b5a73ef 100755 (executable)
@@ -1196,21 +1196,19 @@ class Upload(object):
         self.ensure_hashes()
 
     ###########################################################################
-    def check_lintian(self):
-        cnf = Config()
 
-        # Only check some distributions
-        valid_dist = False
-        for dist in ('unstable', 'experimental'):
-            if dist in self.pkg.changes['distribution']:
-                valid_dist = True
-                break
+    def ensure_orig(self, target_dir='.', session=None):
+        """
+        Ensures that all orig files mentioned in the changes file are present
+        in target_dir. If they do not exist, they are symlinked into place.
 
-        if not valid_dist:
-            return
+        An list containing the symlinks that were created are returned (so they
+        can be removed).
+        """
+
+        symlinked = []
+        cnf = Config()
 
-        # Try and find all orig mentioned in the .dsc
-        target_dir = '.'
         for filename, entry in self.pkg.dsc_files.iteritems():
             if not re_is_orig_source.match(filename):
                 # File is not an orig; ignore
@@ -1231,14 +1229,21 @@ class Upload(object):
                 if fingerprint != expected:
                     return False
 
-                os.symlink(path, os.path.join(target_dir, filename))
+                dest = os.path.join(target_dir, filename)
+
+                os.symlink(path, dest)
+                symlinked.append(dest)
+
                 return True
 
-            session = DBConn().session()
+            session_ = session
+            if session is None:
+                session_ = DBConn().session()
+
             found = False
 
             # Look in the pool
-            for poolfile in get_poolfile_like_name('/%s' % filename, session):
+            for poolfile in get_poolfile_like_name('/%s' % filename, session_):
                 poolfile_path = os.path.join(
                     poolfile.location.path, poolfile.filename
                 )
@@ -1247,7 +1252,8 @@ class Upload(object):
                     found = True
                     break
 
-            session.close()
+            if session is None:
+                session_.close()
 
             if found:
                 continue
@@ -1257,11 +1263,11 @@ class Upload(object):
                 'OldProposedUpdates', 'Embargoed', 'Unembargoed')
 
             for queue in queues:
-                if 'Dir::Queue::%s' % directory not in cnf:
+                if not cnf.get('Dir::Queue::%s' % queue):
                     continue
 
                 queuefile_path = os.path.join(
-                    cnf['Dir::Queue::%s' % directory], filename
+                    cnf['Dir::Queue::%s' % queue], filename
                 )
 
                 if not os.path.exists(queuefile_path):
@@ -1271,10 +1277,32 @@ class Upload(object):
                 if symlink_if_valid(queuefile_path):
                     break
 
+        return symlinked
+
+    ###########################################################################
+
+    def check_lintian(self):
+        cnf = Config()
+
+        # Don't reject binary uploads
+        if not self.pkg.changes['architecture'].has_key('source'):
+            return
+
+        # 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
+
         tagfile = cnf.get("Dinstall::LintianTags")
         if tagfile is None:
             # We don't have a tagfile, so just don't do anything.
             return
+
         # Parse the yaml file
         sourcefile = file(tagfile, 'r')
         sourcecontent = sourcefile.read()
@@ -1285,6 +1313,9 @@ class Upload(object):
             utils.fubar("Can not read the lintian tags file %s, YAML error: %s." % (tagfile, msg))
             return
 
+        # Try and find all orig mentioned in the .dsc
+        symlinked = self.ensure_orig()
+
         # 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.
@@ -1304,8 +1335,12 @@ class Upload(object):
         # to then parse it.
         command = "lintian --show-overrides --tags-from-file %s %s" % (temp_filename, self.pkg.changes_file)
         (result, output) = commands.getstatusoutput(command)
-        # We are done with lintian, remove our tempfile
+
+        # We are done with lintian, remove our tempfile and any symlinks we created
         os.unlink(temp_filename)
+        for symlink in symlinked:
+            os.unlink(symlink)
+
         if (result == 2):
             utils.warn("lintian failed for %s [return code: %s]." % (self.pkg.changes_file, result))
             utils.warn(utils.prefix_multi_line_string(output, " [possible output:] "))