X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=kelly;h=d28d1ace28755bbecd69f90a667b2954fc375b80;hb=9540d873fa78598454af57f5f8a4875969ed0439;hp=68d59a0b4e66ad28d4479db39be697870c2bb54b;hpb=41b58850cb71d3fa204810b19cb0e00a46992fdb;p=dak.git diff --git a/kelly b/kelly index 68d59a0b..d28d1ace 100755 --- 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 -# $Id: kelly,v 1.15 2005-01-14 14:07:17 ajt 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 @@ -30,14 +30,14 @@ ############################################################################### -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.15 $"; +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. @@ -129,6 +131,20 @@ def check(): (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");