+def britney_changelog(packages, suite, session):
+
+ old = {}
+ current = {}
+ Cnf = utils.get_conf()
+
+ try:
+ q = session.execute("SELECT changelog FROM suite WHERE id = :suiteid", \
+ {'suiteid': suite.suite_id})
+ brit_file = q.fetchone()[0]
+ except:
+ brit_file = None
+
+ if brit_file:
+ brit_file = os.path.join(Cnf['Dir::Root'], brit_file)
+ else:
+ return
+
+ q = session.execute("""SELECT s.source, s.version, sa.id
+ FROM source s, src_associations sa
+ WHERE sa.suite = :suiteid
+ AND sa.source = s.id""", {'suiteid': suite.suite_id})
+
+ 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:
+ new[p] = [current[p], old[p]]
+ else:
+ new[p] = [current[p], 0]
+
+ query = "SELECT source, changelog FROM changelogs WHERE"
+ for p in new.keys():
+ query += " source = '%s' AND version > '%s' AND version <= '%s'" \
+ % (p, new[p][1], new[p][0])
+ query += " AND architecture LIKE '%source%' AND distribution in \
+ ('unstable', 'experimental', 'testing-proposed-updates') OR"
+ query += " False ORDER BY source, version DESC"
+ q = session.execute(query)
+
+ pu = None
+ brit = utils.open_file(brit_file, 'w')
+
+ for u in q:
+ if pu and pu != u[0]:
+ brit.write("\n")
+ brit.write("%s\n" % u[1])
+ pu = u[0]
+ if q.rowcount: brit.write("\n\n\n")
+
+ for p in list(set(old.keys()).difference(current.keys())):
+ brit.write("REMOVED: %s %s\n" % (p, old[p]))
+
+ brit.flush()
+ brit.close()
+
+#######################################################################################
+
+def version_checks(package, architecture, target_suite, new_version, session, force = False):
+ if architecture == "source":
+ suite_version_list = get_suite_version_by_source(package, session)
+ else:
+ suite_version_list = get_suite_version_by_package(package, architecture, session)
+
+ must_be_newer_than = [ vc.reference.suite_name for vc in get_version_checks(target_suite, "MustBeNewerThan") ]
+ must_be_older_than = [ vc.reference.suite_name for vc in get_version_checks(target_suite, "MustBeOlderThan") ]
+
+ # Must be newer than an existing version in target_suite
+ if target_suite not in must_be_newer_than:
+ must_be_newer_than.append(target_suite)
+
+ violations = False
+
+ for suite, version in suite_version_list:
+ cmp = apt_pkg.VersionCompare(new_version, version)
+ if suite in must_be_newer_than and cmp < 1:
+ 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 targeted at %s is *not* older than %s in %s" % (package, architecture, new_version, target_suite, version, suite))
+ violations = True
+
+ if violations:
+ if force:
+ utils.warn("Continuing anyway (forced)...")
+ else:
+ utils.fubar("Aborting. Version checks violated and not forced.")
+
+#######################################################################################
+
+def set_suite(file, suite, session, britney=False, force=False):