]> git.decadent.org.uk Git - dak.git/blobdiff - kelly
Add new top level directories
[dak.git] / kelly
diff --git a/kelly b/kelly
index 37a4ac4f64f98218bb0f7c955b842bb4d73ba8b5..d28d1ace28755bbecd69f90a667b2954fc375b80 100755 (executable)
--- a/kelly
+++ b/kelly
@@ -2,7 +2,7 @@
 
 # Installs Debian packages from queue/accepted into the pool
 # Copyright (C) 2000, 2001, 2002, 2003, 2004  James Troup <james@nocrew.org>
-# $Id: kelly,v 1.14 2004-03-11 00:20:51 troup Exp $
+# $Id: kelly,v 1.18 2005-12-17 10:57:03 rmurray Exp $
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 
 ###############################################################################
 
-import errno, fcntl, os, sys, time;
+import errno, fcntl, os, sys, time, re;
 import apt_pkg;
 import db_access, katie, logging, utils;
 
 ###############################################################################
 
 # Globals
-kelly_version = "$Revision: 1.14 $";
+kelly_version = "$Revision: 1.18 $";
 
 Cnf = None;
 Options = None;
@@ -107,6 +107,8 @@ def reject (str, prefix="Rejected: "):
 # frozen between accept and our run time.
 
 def check():
+    propogate={}
+    nopropogate={}
     for file in files.keys():
         # The .orig.tar.gz can disappear out from under us is it's a
         # duplicate of one in the archive.
@@ -123,12 +125,26 @@ def check():
         # Version and file overwrite checks
         if not installing_to_stable:
             if files[file]["type"] == "deb":
-                reject(Katie.check_binary_against_db(file));
+                reject(Katie.check_binary_against_db(file), "");
             elif files[file]["type"] == "dsc":
-                reject(Katie.check_source_against_db(file));
+                reject(Katie.check_source_against_db(file), "");
                 (reject_msg, is_in_incoming) = Katie.check_dsc_against_db(file);
                 reject(reject_msg, "");
 
+        # propogate in the case it is in the override tables:
+        if changes.has_key("propdistribution"):
+            for suite in changes["propdistribution"].keys():
+               if Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
+                   propogate[suite] = 1
+               else:
+                   nopropogate[suite] = 1
+
+    for suite in propogate.keys():
+       if suite in nopropogate:
+           continue
+       changes["distribution"][suite] = 1
+
+    for file in files.keys():
         # Check the package is still in the override tables
         for suite in changes["distribution"].keys():
             if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
@@ -201,7 +217,8 @@ def action ():
         if Options["Automatic"]:
             answer = 'R';
     else:
-        print "INSTALL\n" + reject_message + summary,;
+        print "INSTALL to " + ", ".join(changes["distribution"].keys()) 
+       print reject_message + summary,;
         prompt = "[I]nstall, Skip, Quit ?";
         if Options["Automatic"]:
             answer = 'I';
@@ -405,18 +422,18 @@ def install ():
     # from accepted.
     projectB.query("BEGIN WORK");
     for suite in changes["distribution"].keys():
-        if suite not in Cnf.ValueList("Dinstall::AcceptedAutoBuildSuites"):
+        if suite not in Cnf.ValueList("Dinstall::QueueBuildSuites"):
             continue;
         now_date = time.strftime("%Y-%m-%d %H:%M");
         suite_id = db_access.get_suite_id(suite);
-        dest_dir = Cnf["Dir::AcceptedAutoBuild"];
-        if Cnf.FindB("Dinstall::SecurityAcceptedAutoBuild"):
+        dest_dir = Cnf["Dir::QueueBuild"];
+        if Cnf.FindB("Dinstall::SecurityQueueBuild"):
             dest_dir = os.path.join(dest_dir, suite);
         for file in files.keys():
             dest = os.path.join(dest_dir, file);
             # Remove it from the list of packages for later processing by apt-ftparchive
-            projectB.query("UPDATE accepted_autobuild SET in_accepted = 'f', last_used = '%s' WHERE filename = '%s' AND suite = %s" % (now_date, dest, suite_id));
-            if not Cnf.FindB("Dinstall::SecurityAcceptedAutoBuild"):
+            projectB.query("UPDATE queue_build SET in_queue = 'f', last_used = '%s' WHERE filename = '%s' AND suite = %s" % (now_date, dest, suite_id));
+            if not Cnf.FindB("Dinstall::SecurityQueueBuild"):
                 # Update the symlink to point to the new location in the pool
                 pool_location = utils.poolify (changes["source"], files[file]["component"]);
                 src = os.path.join(Cnf["Dir::Pool"], pool_location, os.path.basename(file));
@@ -430,7 +447,7 @@ def install ():
                 if dsc_file.endswith(".orig.tar.gz"):
                     orig_tar_gz = os.path.join(dest_dir, dsc_file);
             # Remove it from the list of packages for later processing by apt-ftparchive
-            projectB.query("UPDATE accepted_autobuild SET in_accepted = 'f', last_used = '%s' WHERE filename = '%s' AND suite = %s" % (now_date, orig_tar_gz, suite_id));
+            projectB.query("UPDATE queue_build SET in_queue = 'f', last_used = '%s' WHERE filename = '%s' AND suite = %s" % (now_date, orig_tar_gz, suite_id));
     projectB.query("COMMIT WORK");
 
     # Finally...
@@ -465,18 +482,34 @@ def stable_install (summary, short_summary):
     # Add the binaries to stable (and remove it/them from proposed-updates)
     for file in files.keys():
         if files[file]["type"] == "deb":
+           binNMU = 0
             package = files[file]["package"];
             version = files[file]["version"];
             architecture = files[file]["architecture"];
             q = projectB.query("SELECT b.id FROM binaries b, architecture a WHERE b.package = '%s' AND b.version = '%s' AND (a.arch_string = '%s' OR a.arch_string = 'all') AND b.architecture = a.id" % (package, version, architecture));
             ql = q.getresult();
             if not ql:
-                utils.fubar("[INTERNAL ERROR] couldn't find '%s' (%s for %s architecture) in binaries table." % (package, version, architecture));
-            binary_id = ql[0][0];
-            suite_id = db_access.get_suite_id('proposed-updates');
-            projectB.query("DELETE FROM bin_associations WHERE suite = '%s' AND bin = '%s'" % (suite_id, binary_id));
-            suite_id = db_access.get_suite_id('stable');
-            projectB.query("INSERT INTO bin_associations (suite, bin) VALUES ('%s', '%s')" % (suite_id, binary_id));
+               suite_id = db_access.get_suite_id('proposed-updates');
+               que = "SELECT b.version FROM binaries b JOIN bin_associations ba ON (b.id = ba.bin) JOIN suite su ON (ba.suite = su.id) WHERE b.package = '%s' AND (ba.suite = '%s')" % (package, suite_id);
+               q = projectB.query(que)
+
+               # Reduce the query results to a list of version numbers
+               ql = map(lambda x: x[0], q.getresult());
+               if not ql:
+                   utils.fubar("[INTERNAL ERROR] couldn't find '%s' (%s for %s architecture) in binaries table." % (package, version, architecture));
+               else:
+                   for x in ql:
+                       if re.match(re.compile(r"%s((\.0)?\.)|(\+b)\d+$" % re.escape(version)),x):
+                           binNMU = 1
+                           break
+           if not binNMU:
+               binary_id = ql[0][0];
+               suite_id = db_access.get_suite_id('proposed-updates');
+               projectB.query("DELETE FROM bin_associations WHERE suite = '%s' AND bin = '%s'" % (suite_id, binary_id));
+               suite_id = db_access.get_suite_id('stable');
+               projectB.query("INSERT INTO bin_associations (suite, bin) VALUES ('%s', '%s')" % (suite_id, binary_id));
+           else:
+                del files[file]
 
     projectB.query("COMMIT WORK");