X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fmake_changelog.py;h=a6f4e192e72c14f9b43dece8b471595478b3afe3;hb=c4a8947bf81001d2b6ad8f437f5333111dc66d42;hp=e7505a1cc0067f40bcaa6d521f72cc15aab7f6b9;hpb=d9daaa0b74845853a09b34cd930f6f2879bc1254;p=dak.git diff --git a/dak/make_changelog.py b/dak/make_changelog.py old mode 100644 new mode 100755 index e7505a1c..a6f4e192 --- a/dak/make_changelog.py +++ b/dak/make_changelog.py @@ -53,13 +53,9 @@ import sys import apt_pkg from daklib.dbconn import * from daklib import utils -from daklib.queue import Upload ################################################################################ -suites = {'proposed-updates': 'proposedupdates', - 'oldstable-proposed-updates': 'oldproposedupdates'} - def usage (exit_code=0): print """Usage: make-changelog -s -b [OPTION]... Generate changelog between two suites @@ -68,62 +64,91 @@ Options: -h, --help show this help and exit -s, --suite suite providing packages to compare - -b, --base-suite suite to be taken as reference for comparison""" + -b, --base-suite suite to be taken as reference for comparison + -n, --binnmu display binNMUs uploads instead of source ones""" sys.exit(exit_code) -def get_new_packages(suite, base_suite): +def get_source_uploads(suite, base_suite, session): """ - Returns a dict of sources and versions where version is newer in base. + Returns changelogs for source uploads where version is newer than base. """ - suite_sources = dict() - base_suite_sources = dict() - new_in_suite = dict() - session = DBConn().session() - - # Get source details from given suites - for i in get_all_sources_in_suite(suite, session): - suite_sources[i[0]] = i[1] - for i in get_all_sources_in_suite(base_suite, session): - base_suite_sources[i[0]] = i[1] - - # Compare if version in suite is greater than the base_suite one - for i in suite_sources.keys(): - if i not in suite_sources.keys(): - new_in_suite[i] = (suite_sources[i], 0) - elif apt_pkg.VersionCompare(suite_sources[i], base_suite_sources[i]) > 0: - new_in_suite[i] = (suite_sources[i], base_suite_sources[i]) - - return new_in_suite - -def generate_changelog(suite, source, versions): + query = """WITH base AS ( + SELECT source, max(version) AS version + FROM source_suite + WHERE suite_name = :base_suite + GROUP BY source + UNION (SELECT source, CAST(0 AS debversion) AS version + FROM source_suite + WHERE suite_name = :suite + EXCEPT SELECT source, CAST(0 AS debversion) AS version + FROM source_suite + WHERE suite_name = :base_suite + ORDER BY source)), + cur_suite AS ( + SELECT source, max(version) AS version + FROM source_suite + WHERE suite_name = :suite + GROUP BY source) + SELECT DISTINCT c.source, c.version, c.changelog + FROM changelogs c + JOIN base b ON b.source = c.source + JOIN cur_suite cs ON cs.source = c.source + WHERE c.version > b.version + AND c.version <= cs.version + AND c.architecture LIKE '%source%' + ORDER BY c.source, c.version DESC""" + + return session.execute(query, {'suite': suite, 'base_suite': base_suite}) + +def get_binary_uploads(suite, base_suite, session): """ - Generates changelog data returned from changelogs table + Returns changelogs for binary uploads where version is newer than base. """ - query = """ - SELECT changelog FROM changelogs - WHERE suite = :suite - AND source = :source - AND version > :base - AND version <= :current - ORDER BY source, version DESC""" - session = DBConn().session() - result = session.execute(query, {'suite': suites[suite], 'source': source, \ - 'base': versions[1], 'current': versions[0]}) - session.commit() - for r in result.fetchall(): - for i in range(0, len(r)): - print r[i] + query = """WITH base as ( + SELECT s.source, max(b.version) AS version, a.arch_string + FROM source s + JOIN binaries b ON b.source = s.id + JOIN bin_associations ba ON ba.bin = b.id + JOIN architecture a ON a.id = b.architecture + WHERE ba.suite = ( + SELECT id + FROM suite + WHERE suite_name = :base_suite) + GROUP BY s.source, a.arch_string), + cur_suite as ( + SELECT s.source, max(b.version) AS version, a.arch_string + FROM source s + JOIN binaries b ON b.source = s.id + JOIN bin_associations ba ON ba.bin = b.id + JOIN architecture a ON a.id = b.architecture + WHERE ba.suite = ( + SELECT id + FROM suite + WHERE suite_name = :suite) + GROUP BY s.source, a.arch_string) + SELECT DISTINCT c.source, c.version, c.architecture, c.changelog + FROM changelogs c + JOIN base b on b.source = c.source + JOIN cur_suite cs ON cs.source = c.source + WHERE c.version > b.version + AND c.version <= cs.version + AND c.architecture = b.arch_string + AND c.architecture = cs.arch_string + ORDER BY c.source, c.version DESC, c.architecture""" + + return session.execute(query, {'suite': suite, 'base_suite': base_suite}) def main(): Cnf = utils.get_conf() Arguments = [('h','help','Make-Changelog::Options::Help'), - ('s','suite','Make-Changelog::Options::Suite', 'HasArg'), - ('b','base-suite','Make-Changelog::Options::Base-Suite', 'HasArg')] + ('s','suite','Make-Changelog::Options::Suite','HasArg'), + ('b','base-suite','Make-Changelog::Options::Base-Suite','HasArg'), + ('n','binnmu','Make-Changelog::Options::binNMU')] - for i in ['help', 'suite', 'base-suite']: + for i in ['help', 'suite', 'base-suite', 'binnmu']: if not Cnf.has_key('Make-Changelog::Options::%s' % (i)): Cnf['Make-Changelog::Options::%s' % (i)] = '' @@ -131,6 +156,7 @@ def main(): Options = Cnf.SubTree('Make-Changelog::Options') suite = Cnf['Make-Changelog::Options::Suite'] base_suite = Cnf['Make-Changelog::Options::Base-Suite'] + binnmu = Cnf['Make-Changelog::Options::binNMU'] if Options['help'] or not (suite and base_suite): usage() @@ -139,9 +165,18 @@ def main(): if not get_suite(s): utils.fubar('Invalid suite "%s"' % s) - new_packages = get_new_packages(suite, base_suite) - for package in sorted(new_packages.keys()): - generate_changelog(suite, package, new_packages[package]) + session = DBConn().session() + + if binnmu: + uploads = get_binary_uploads(suite, base_suite, session) + session.commit() + for upload in uploads: + print upload[3] + "\n" + else: + uploads = get_source_uploads(suite, base_suite, session) + session.commit() + for upload in uploads: + print upload[2] + "\n" if __name__ == '__main__': main()