block 485803 by 120262 thanks Hi,
I've prepared a patch for this bug that adds an option (-u, --uploaders) to make-maintainers to generate an uploaders index. This is needed for the BTS to track uploaders (I want this to be able to query for RC bugs on pkg-gnome packages, where the team is only in uploaders for many of them), see #485803. I haven't tested the package as I don't have a dak instance running. I'd appreciate if you could review the patch and let me know whether it looks reasonably fine (and if it does and you can directly check it's fine and commit it, that would be awesome!). I haven't optimized it for the uploaders case. I could do it (like not storing the maintainer in the dict since it's used from the key), but I think it's only worth it if make-maintainers is not very fast already (which I don't know), since it will make the code a bit more complex. Thanks, Emilio
From 28c1563856193d336dfcc7d8e84bae2c3253efd5 Mon Sep 17 00:00:00 2001 From: Emilio Pozuelo Monfort <poch...@gmail.com> Date: Sun, 15 Nov 2009 17:13:13 +0100 Subject: [PATCH] make_maintainers.py: Support creating an uploaders index http://bugs.debian.org/120262 --- dak/make_maintainers.py | 105 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 76 insertions(+), 29 deletions(-) diff --git a/dak/make_maintainers.py b/dak/make_maintainers.py index aef7da2..e88c7fc 100755 --- a/dak/make_maintainers.py +++ b/dak/make_maintainers.py @@ -51,6 +51,7 @@ def usage (exit_code=0): print """Usage: dak make-maintainers [OPTION] EXTRA_FILE[...] Generate an index of packages <=> Maintainers. + -u, --uploaders create uploaders index -h, --help show this help and exit """ sys.exit(exit_code) @@ -111,9 +112,12 @@ def get_maintainer_from_source(source_id, session): def main(): cnf = Config() - Arguments = [('h',"help","Make-Maintainers::Options::Help")] + Arguments = [('h',"help","Make-Maintainers::Options::Help"), + ('u',"uploaders","Make-Maintainers::Options::Uploaders")] if not cnf.has_key("Make-Maintainers::Options::Help"): cnf["Make-Maintainers::Options::Help"] = "" + if not cnf.has_key("Make-Maintainers::Options::Uploaders"): + cnf["Make-Maintainers::Options::Uploaders"] = "" extra_files = apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv) Options = cnf.SubTree("Make-Maintainers::Options") @@ -121,6 +125,10 @@ def main(): if Options["Help"]: usage() + gen_uploaders = False + if Options["Uploaders"]: + gen_uploaders = True + session = DBConn().session() for suite in cnf.SubTree("Suite").List(): @@ -128,44 +136,74 @@ def main(): suite_priority = int(cnf["Suite::%s::Priority" % (suite)]) # Source packages - q = session.execute("""SELECT s.source, s.version, m.name - FROM src_associations sa, source s, suite su, maintainer m - WHERE su.suite_name = :suite_name - AND sa.suite = su.id AND sa.source = s.id - AND m.id = s.maintainer""", - {'suite_name': suite}) + if not gen_uploaders: + q = session.execute("""SELECT s.source, s.version, m.name + FROM src_associations sa, source s, suite su, maintainer m + WHERE su.suite_name = :suite_name + AND sa.suite = su.id AND sa.source = s.id + AND m.id = s.maintainer""", + {'suite_name': suite}) + else: + q = session.execute("""SELECT s.source, s.version, m.name + FROM src_associations sa, source s, suite su, maintainer m, src_uploaders srcu + WHERE su.suite_name = :suite_name + AND sa.suite = su.id AND sa.source = s.id + AND m.id = srcu.maintainer + AND srcu.source = s.id""", + {'suite_name': suite}) + for source in q.fetchall(): package = source[0] version = source[1] maintainer = fix_maintainer(source[2]) - if packages.has_key(package): - if packages[package]["priority"] <= suite_priority: - if apt_pkg.VersionCompare(packages[package]["version"], version) < 0: - packages[package] = { "maintainer": maintainer, "priority": suite_priority, "version": version } + if not gen_uploaders: + key = package else: - packages[package] = { "maintainer": maintainer, "priority": suite_priority, "version": version } + key = (package, maintainer) + + if packages.has_key(key): + if packages[key]["priority"] <= suite_priority: + if apt_pkg.VersionCompare(packages[key]["version"], version) < 0: + packages[key] = { "maintainer": maintainer, "priority": suite_priority, "version": version } + else: + packages[key] = { "maintainer": maintainer, "priority": suite_priority, "version": version } # Binary packages - q = session.execute("""SELECT b.package, b.source, b.maintainer, b.version - FROM bin_associations ba, binaries b, suite s - WHERE s.suite_name = :suite_name - AND ba.suite = s.id AND ba.bin = b.id""", - {'suite_name': suite}) + if not gen_uploaders: + q = session.execute("""SELECT b.package, b.source, b.maintainer, b.version + FROM bin_associations ba, binaries b, suite s + WHERE s.suite_name = :suite_name + AND ba.suite = s.id AND ba.bin = b.id""", + {'suite_name': suite}) + else: + q = session.execute("""SELECT b.package, b.source, srcu.maintainer, b.version + FROM bin_associations ba, binaries b, suite s, src_uploaders srcu + WHERE s.suite_name = :suite_name + AND ba.suite = s.id AND ba.bin = b.id + AND b.source = srcu.source""", + {'suite_name': suite}) + + for binary in q.fetchall(): package = binary[0] source_id = binary[1] version = binary[3] # Use the source maintainer first; falling back on the binary maintainer as a last resort only - if source_id: + if source_id and not gen_uploaders: maintainer = get_maintainer_from_source(source_id, session) else: maintainer = get_maintainer(binary[2], session) - if packages.has_key(package): - if packages[package]["priority"] <= suite_priority: - if apt_pkg.VersionCompare(packages[package]["version"], version) < 0: - packages[package] = { "maintainer": maintainer, "priority": suite_priority, "version": version } + if not gen_uploaders: + key = package + else: + key = (package, maintainer) + + if packages.has_key(key): + if packages[key]["priority"] <= suite_priority: + if apt_pkg.VersionCompare(packages[key]["version"], version) < 0: + packages[key] = { "maintainer": maintainer, "priority": suite_priority, "version": version } else: - packages[package] = { "maintainer": maintainer, "priority": suite_priority, "version": version } + packages[key] = { "maintainer": maintainer, "priority": suite_priority, "version": version } # Process any additional Maintainer files (e.g. from pseudo packages) for filename in extra_files: @@ -182,17 +220,26 @@ def main(): else: package = lhs version = '*' + if not gen_uploaders: + key = package + else: + key = (package, maintainer) # A version of '*' overwhelms all real version numbers - if not packages.has_key(package) or version == '*' \ - or apt_pkg.VersionCompare(packages[package]["version"], version) < 0: - packages[package] = { "maintainer": maintainer, "version": version } + if not packages.has_key(key) or version == '*' \ + or apt_pkg.VersionCompare(packages[key]["version"], version) < 0: + packages[key] = { "maintainer": maintainer, "version": version } extrafile.close() package_keys = packages.keys() package_keys.sort() - for package in package_keys: - lhs = "~".join([package, packages[package]["version"]]) - print "%-30s %s" % (lhs, packages[package]["maintainer"]) + if not gen_uploaders: + for package in package_keys: + lhs = "~".join([package, packages[package]["version"]]) + print "%-30s %s" % (lhs, packages[package]["maintainer"]) + else: + for (package, maintainer) in package_keys: + lhs = "~".join([package, packages[package]["version"]]) + print "%-30s %s" % (lhs, maintainer) ################################################################################ -- 1.6.5.2
signature.asc
Description: OpenPGP digital signature