]> git.decadent.org.uk Git - dak.git/commitdiff
Merge branch 'merge'
authorJoerg Jaspert <joerg@debian.org>
Thu, 29 Oct 2009 13:15:56 +0000 (14:15 +0100)
committerJoerg Jaspert <joerg@debian.org>
Thu, 29 Oct 2009 13:15:56 +0000 (14:15 +0100)
* merge:
  Catch and log all exceptions from top-level dak command.
  Look in the pool and queues for missing orig files.
  Tidy check_lintian's 'log' closure
  Inline ensure_all_source_exists.

dak/dak.py
daklib/queue.py

index 052f3b3ef7b8b7e48717116809771f20d80d75d6..448c137f9ca903687e0ab70bf21e53fd039616da 100755 (executable)
@@ -34,8 +34,12 @@ G{importgraph}
 ################################################################################
 
 import sys
+import traceback
 import daklib.utils
 
+from daklib.daklog import Logger
+from daklib.config import Config
+
 ################################################################################
 
 def init():
@@ -152,6 +156,8 @@ Available commands:"""
 def main():
     """Launch dak functionality."""
 
+    logger = Logger(Config(), 'dak top-level')
+
     functionality = init()
     modules = [ command for (command, _) in functionality ]
 
@@ -189,7 +195,17 @@ def main():
     # Invoke the module
     module = __import__(cmdname.replace("-","_"))
 
-    module.main()
+    try:
+        module.main()
+    except KeyboardInterrupt:
+        msg = 'KeyboardInterrupt caught; exiting'
+        print msg
+        logger.log([msg])
+        sys.exit(1)
+    except:
+        for line in traceback.format_exc().split('\n')[:-1]:
+            logger.log(['exception', line])
+        raise
 
 ################################################################################
 
index 31f9a25be9e48e5f34ea59d3d6743f539338825e..9c12d1e2fb5a9a11e857bcde4989c1cd54bc4618 100755 (executable)
@@ -1025,16 +1025,21 @@ class Upload(object):
 
     ###########################################################################
 
-    def ensure_all_source_exists(self, source_dir, dest_dir=None):
-        """
-        Ensure that dest_dir contains all the orig tarballs for the specified
-        changes. If it does not, symlink them into place.
+    def get_changelog_versions(self, source_dir):
+        """Extracts a the source package and (optionally) grabs the
+        version history out of debian/changelog for the BTS."""
 
-        If dest_dir is None, populate the current directory.
-        """
+        cnf = Config()
 
-        if dest_dir is None:
-            dest_dir = os.getcwd()
+        # Find the .dsc (again)
+        dsc_filename = None
+        for f in self.pkg.files.keys():
+            if self.pkg.files[f]["type"] == "dsc":
+                dsc_filename = f
+
+        # If there isn't one, we have nothing to do. (We have reject()ed the upload already)
+        if not dsc_filename:
+            return
 
         # Create a symlink mirror of the source files in our temporary directory
         for f in self.pkg.files.keys():
@@ -1048,7 +1053,7 @@ class Upload(object):
                 if re_is_orig_source.match(f) and self.pkg.orig_files.has_key(f) and \
                    self.pkg.orig_files[f].has_key("path"):
                     continue
-                dest = os.path.join(dest_dir, f)
+                dest = os.path.join(os.getcwd(), f)
                 os.symlink(src, dest)
 
         # If the orig files are not a part of the upload, create symlinks to the
@@ -1059,26 +1064,6 @@ class Upload(object):
             dest = os.path.join(os.getcwd(), os.path.basename(orig_file))
             os.symlink(self.pkg.orig_files[orig_file]["path"], dest)
 
-    ###########################################################################
-
-    def get_changelog_versions(self, source_dir):
-        """Extracts a the source package and (optionally) grabs the
-        version history out of debian/changelog for the BTS."""
-
-        cnf = Config()
-
-        # Find the .dsc (again)
-        dsc_filename = None
-        for f in self.pkg.files.keys():
-            if self.pkg.files[f]["type"] == "dsc":
-                dsc_filename = f
-
-        # If there isn't one, we have nothing to do. (We have reject()ed the upload already)
-        if not dsc_filename:
-            return
-
-        self.ensure_all_source_exists(source_dir)
-
         # Extract the source
         cmd = "dpkg-source -sn -x %s" % (dsc_filename)
         (result, output) = commands.getstatusoutput(cmd)
@@ -1212,6 +1197,8 @@ class Upload(object):
 
     ###########################################################################
     def check_lintian(self):
+        cnf = Config()
+
         # Only check some distributions
         valid_dist = False
         for dist in ('unstable', 'experimental'):
@@ -1222,9 +1209,65 @@ class Upload(object):
         if not valid_dist:
             return
 
-        self.ensure_all_source_exists()
+        # Try and find all orig mentioned in the .dsc
+        target_dir = '.'
+        for filename, entry in self.pkg.dsc_files.iteritems():
+            if re_is_orig_source.match(filename):
+                # File is not an orig; ignore
+                continue
+
+            if os.path.exists(filename):
+                # File exists, no need to continue
+                continue
+
+            def symlink_if_valid(path):
+                f = utils.open_file(path)
+                md5sum = apt_pkg.md5sum(f)
+                f.close()
+
+                fingerprint = (os.stat(path)[stat.ST_SIZE], md5sum)
+                expected = (int(entry['size']), entry['md5sum'])
+
+                if fingerprint != expected:
+                    return False
+
+                os.symlink(path, os.path.join(target_dir, filename))
+                return True
+
+            found = False
+
+            # Look in the pool
+            for poolfile in get_poolfile_like_name('/%s' % filename):
+                poolfile_path = os.path.join(
+                    poolfile.location.path, poolfile.filename
+                )
+
+                if symlink_if_valid(poolfile_path):
+                    found = True
+                    break
+
+            if found:
+                continue
+
+            # Look in some other queues for the file
+            queues = ('Accepted', 'New', 'Byhand', 'ProposedUpdates',
+                'OldProposedUpdates', 'Embargoed', 'Unembargoed')
+
+            for queue in queues:
+                if 'Dir::Queue::%s' % directory not in cnf:
+                    continue
+
+                queuefile_path = os.path.join(
+                    cnf['Dir::Queue::%s' % directory], filename
+                )
+
+                if not os.path.exists(queuefile_path):
+                    # Does not exist in this queue
+                    continue
+
+                if symlink_if_valid(queuefile_path):
+                    break
 
-        cnf = Config()
         tagfile = cnf.get("Dinstall::LintianTags")
         if tagfile is None:
             # We don't have a tagfile, so just don't do anything.
@@ -1269,9 +1312,7 @@ class Upload(object):
 
         def log(*txt):
             if self.logger:
-                args = [self.pkg.changes_file, "check_lintian"]
-                args.extend(txt)
-                self.logger.log(args)
+                self.logger.log([self.pkg.changes_file, "check_lintian"] + list(txt))
 
         # We have output of lintian, this package isn't clean. Lets parse it and see if we
         # are having a victim for a reject.