for p in q.fetchall():
current[p[0]] = p[1]
for p in packages.keys():
- p = p.split()
if p[2] == "source":
old[p[0]] = p[1]
new = {}
for p in current.keys():
if p in old.keys():
- if apt_pkg.VersionCompare(current[p], old[p]) > 0:
+ if apt_pkg.version_compare(current[p], old[p]) > 0:
new[p] = [current[p], old[p]]
else:
new[p] = [current[p], 0]
violations = False
for suite, version in suite_version_list:
- cmp = apt_pkg.VersionCompare(new_version, version)
+ cmp = apt_pkg.version_compare(new_version, version)
if suite in must_be_newer_than and cmp < 1:
- utils.warn("%s (%s): version check violated: %s in %s is *not* newer than %s targeted at %s" % (package, architecture, version, suite, new_version, target_suite))
+ utils.warn("%s (%s): version check violated: %s targeted at %s is *not* newer than %s in %s" % (package, architecture, new_version, target_suite, version, suite))
violations = True
if suite in must_be_older_than and cmp > 1:
- utils.warn("%s (%s): version check violated: %s in %s is *not* older than %s targeted at %s" % (package, architecture, version, suite, new_version, target_suite))
+ utils.warn("%s (%s): version check violated: %s targeted at %s is *not* older than %s in %s" % (package, architecture, new_version, target_suite, version, suite))
violations = True
if violations:
- if forced:
+ if force:
utils.warn("Continuing anyway (forced)...")
else:
utils.fubar("Aborting. Version checks violated and not forced.")
#######################################################################################
+def cmp_package_version(a, b):
+ """
+ comparison function for tuples of the form (package-name, version ...)
+ """
+ cmp_package = cmp(a[0], b[0])
+ if cmp_package != 0:
+ return cmp_package
+ return apt_pkg.version_compare(a[1], b[1])
+
+#######################################################################################
+
def set_suite(file, suite, session, britney=False, force=False):
suite_id = suite.suite_id
lines = file.readlines()
FROM binaries b, bin_associations ba, architecture a
WHERE ba.suite = :suiteid
AND ba.bin = b.id AND b.architecture = a.id""", {'suiteid': suite_id})
- for i in q.fetchall():
- key = " ".join(i[:3])
+ for i in q:
+ key = i[:3]
current[key] = i[3]
- q = session.execute("""SELECT s.source, s.version, sa.id
+ q = session.execute("""SELECT s.source, s.version, 'source', sa.id
FROM source s, src_associations sa
WHERE sa.suite = :suiteid
AND sa.source = s.id""", {'suiteid': suite_id})
- for i in q.fetchall():
- key = " ".join(i[:2]) + " source"
- current[key] = i[2]
+ for i in q:
+ key = i[:3]
+ current[key] = i[3]
# Build up a dictionary of what should be in the suite
- desired = {}
+ desired = set()
for line in lines:
split_line = line.strip().split()
if len(split_line) != 3:
utils.warn("'%s' does not break into 'package version architecture'." % (line[:-1]))
continue
- key = " ".join(split_line)
- desired[key] = ""
-
- # Check to see which packages need removed and remove them
- for key in current.keys():
- if not desired.has_key(key):
- (package, version, architecture) = key.split()
- pkid = current[key]
- if architecture == "source":
- session.execute("""DELETE FROM src_associations WHERE id = :pkid""", {'pkid': pkid})
- else:
- session.execute("""DELETE FROM bin_associations WHERE id = :pkid""", {'pkid': pkid})
- Logger.log(["removed", key, pkid])
+ desired.add(tuple(split_line))
# Check to see which packages need added and add them
- for key in desired.keys():
- if not current.has_key(key):
- (package, version, architecture) = key.split()
+ for key in sorted(desired, cmp=cmp_package_version):
+ if key not in current:
+ (package, version, architecture) = key
version_checks(package, architecture, suite.suite_name, version, session, force)
pkid = get_id (package, version, architecture, session)
if not pkid:
else:
session.execute("""INSERT INTO bin_associations (suite, bin)
VALUES (:suiteid, :pkid)""", {'suiteid': suite_id, 'pkid': pkid})
- Logger.log(["added", key, pkid])
+ Logger.log(["added", " ".join(key), pkid])
+
+ # Check to see which packages need removed and remove them
+ for key, pkid in current.iteritems():
+ if key not in desired:
+ (package, version, architecture) = key
+ if architecture == "source":
+ session.execute("""DELETE FROM src_associations WHERE id = :pkid""", {'pkid': pkid})
+ else:
+ session.execute("""DELETE FROM bin_associations WHERE id = :pkid""", {'pkid': pkid})
+ Logger.log(["removed", " ".join(key), pkid])
session.commit()
suite_id = suite.suite_id
- lines = file.readlines()
+ request = []
# Our session is already in a transaction
- for line in lines:
+ for line in file:
split_line = line.strip().split()
if len(split_line) != 3:
utils.warn("'%s' does not break into 'package version architecture'." % (line[:-1]))
continue
+ request.append(split_line)
- (package, version, architecture) = split_line
+ request.sort(cmp=cmp_package_version)
+ for package, version, architecture in request:
pkid = get_id(package, version, architecture, session)
if not pkid:
continue
session.execute("""INSERT INTO src_associations (suite, source)
VALUES (:suiteid, :pkid)""",
{'suiteid': suite_id, 'pkid': pkid})
+ Logger.log(["added", package, version, architecture, suite.suite_name, pkid])
+
elif action == "remove":
if association_id == None:
utils.warn("'%s_%s_%s' doesn't exist in suite %s." % (package, version, architecture, suite))
continue
else:
session.execute("""DELETE FROM src_associations WHERE id = :pkid""", {'pkid': association_id})
+ Logger.log(["removed", package, version, architecture, suite.suite_name, pkid])
else:
# Find the existing associations ID, if any
q = session.execute("""SELECT id FROM bin_associations
session.execute("""INSERT INTO bin_associations (suite, bin)
VALUES (:suiteid, :pkid)""",
{'suiteid': suite_id, 'pkid': pkid})
+ Logger.log(["added", package, version, architecture, suite.suite_name, pkid])
elif action == "remove":
if association_id == None:
utils.warn("'%s_%s_%s' doesn't exist in suite %s." % (package, version, architecture, suite))
continue
else:
session.execute("""DELETE FROM bin_associations WHERE id = :pkid""", {'pkid': association_id})
+ Logger.log(["removed", package, version, architecture, suite.suite_name, pkid])
session.commit()
cnf["Control-Suite::Options::%s" % (i)] = ""
try:
- file_list = apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv);
- except SystemError, e:
+ file_list = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv);
+ except SystemError as e:
print "%s\n" % e
usage(1)
- Options = cnf.SubTree("Control-Suite::Options")
+ Options = cnf.subtree("Control-Suite::Options")
if Options["Help"]:
usage()
utils.fubar("Can only perform one action at a time.")
action = i
+ # Safety/Sanity check
+ if action == "set" and (not suite.allowcsset):
+ if force:
+ utils.warn("Would not normally allow setting suite %s (allowsetcs is FALSE), but --force used" % (suite_name))
+ else:
+ utils.fubar("Will not reset suite %s due to its database configuration (allowsetcs is FALSE)" % (suite_name))
+
# Need an action...
if action == None:
utils.fubar("No action specified.")
- # Safety/Sanity check
- # XXX: This should be stored in the database
- if action == "set" and suite_name not in ["testing", "squeeze-updates"]:
- utils.fubar("Will not reset suite %s" % (suite_name))
-
britney = False
if action == "set" and cnf["Control-Suite::Options::Britney"]:
britney = True
if action == "list":
get_list(suite, session)
else:
- Logger = daklog.Logger(cnf.Cnf, "control-suite")
+ Logger = daklog.Logger("control-suite")
if file_list:
for f in file_list:
process_file(utils.open_file(f), suite, action, session, britney, force)