From: Torsten Werner Date: Thu, 24 Mar 2011 20:58:04 +0000 (+0100) Subject: Merge branch 'master' into maintainer X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=71c48c6fce3e9f48367a19ed87c2400142c6f722;hp=c717473b373ac3cb8f20806ab02b1967339063e1;p=dak.git Merge branch 'master' into maintainer --- diff --git a/config/debian/cron.dinstall b/config/debian/cron.dinstall index 27200dd1..c922683b 100755 --- a/config/debian/cron.dinstall +++ b/config/debian/cron.dinstall @@ -334,14 +334,6 @@ GO=( ) stage $GO -GO=( - FUNC="mkuploaders" - TIME="mkuploaders" - ARGS="" - ERR="" -) -stage $GO - GO=( FUNC="copyoverrides" TIME="copyoverrides" diff --git a/config/debian/dinstall.functions b/config/debian/dinstall.functions index cac7c7c5..d89aa483 100644 --- a/config/debian/dinstall.functions +++ b/config/debian/dinstall.functions @@ -235,36 +235,9 @@ function mkmaintainers() { log 'Creating Maintainers index ... ' cd $indices - dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers | \ - sed -e "s/~[^ ]*\([ ]\)/\1/" | \ - awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-maintainers - - if ! cmp -s .new-maintainers Maintainers || [ ! -f Maintainers ]; then - log "installing Maintainers ... " - mv -f .new-maintainers Maintainers - gzip -9v .new-maintainers.gz - mv -f .new-maintainers.gz Maintainers.gz - else - rm -f .new-maintainers - fi -} - -function mkuploaders() { - log 'Creating Uploaders index ... ' - - cd $indices - dak make-maintainers -u ${scriptdir}/masterfiles/pseudo-packages.maintainers | \ - sed -e "s/~[^ ]*\([ ]\)/\1/" | \ - awk '{printf "%-20s ", $1; for (i=2; i<=NF; i++) printf "%s ", $i; printf "\n";}' > .new-uploaders - - if ! cmp -s .new-uploaders Uploaders || [ ! -f Uploaders ]; then - log "installing Uploaders ... " - mv -f .new-uploaders Uploaders - gzip -9v .new-uploaders.gz - mv -f .new-uploaders.gz Uploaders.gz - else - rm -f .new-uploaders - fi + dak make-maintainers ${scriptdir}/masterfiles/pseudo-packages.maintainers + gzip -9v --rsyncable Maintainers.gz + gzip -9v --rsyncable Uploaders.gz } function copyoverrides() { diff --git a/dak/make_maintainers.py b/dak/make_maintainers.py index 4a113b0c..0733f3bc 100755 --- a/dak/make_maintainers.py +++ b/dak/make_maintainers.py @@ -4,6 +4,7 @@ Generate Maintainers file used by e.g. the Debian Bug Tracking System @contact: Debian FTP Master @copyright: 2000, 2001, 2002, 2003, 2004, 2006 James Troup +@copyright: 2011 Torsten Werner @license: GNU General Public License version 2 or later """ @@ -30,94 +31,45 @@ Generate Maintainers file used by e.g. the Debian Bug Tracking System ################################################################################ -import sys -import apt_pkg - +from daklib import daklog +from daklib import utils from daklib.config import Config from daklib.dbconn import * -from daklib import utils -from daklib import textutils from daklib.regexes import re_comments -################################################################################ - -maintainer_from_source_cache = {} #: caches the maintainer name per source_id -packages = {} #: packages data to write out -fixed_maintainer_cache = {} #: caches fixed ( L{daklib.textutils.fix_maintainer} ) maintainer data +import apt_pkg +import sys ################################################################################ def usage (exit_code=0): print """Usage: dak make-maintainers [OPTION] EXTRA_FILE[...] -Generate an index of packages <=> Maintainers. +Generate an index of packages <=> Maintainers / Uploaders. - -u, --uploaders create uploaders index -h, --help show this help and exit """ sys.exit(exit_code) ################################################################################ -def fix_maintainer (maintainer): - """ - Fixup maintainer entry, cache the result. - - @type maintainer: string - @param maintainer: A maintainer entry as passed to L{daklib.textutils.fix_maintainer} +def format(package, person): + '''Return a string nicely formatted for writing to the output file.''' + return '%-20s %s\n' % (package, person) - @rtype: tuple - @returns: fixed maintainer tuple - """ - global fixed_maintainer_cache - - if not fixed_maintainer_cache.has_key(maintainer): - fixed_maintainer_cache[maintainer] = textutils.fix_maintainer(maintainer)[0] - - return fixed_maintainer_cache[maintainer] - -def get_maintainer(maintainer, session): - """ - Retrieves maintainer name from database, passes it through fix_maintainer and - passes on whatever that returns. - - @type maintainer: int - @param maintainer: maintainer_id - """ - q = session.execute("SELECT name FROM maintainer WHERE id = :id", {'id': maintainer}).fetchall() - return fix_maintainer(q[0][0]) - -def get_maintainer_from_source(source_id, session): - """ - Returns maintainer name for given source_id. - - @type source_id: int - @param source_id: source package id - - @rtype: string - @return: maintainer name/email - """ - global maintainer_from_source_cache - - if not maintainer_from_source_cache.has_key(source_id): - q = session.execute("""SELECT m.name FROM maintainer m, source s - WHERE s.id = :sourceid AND s.maintainer = m.id""", - {'sourceid': source_id}) - maintainer = q.fetchall()[0][0] - maintainer_from_source_cache[source_id] = fix_maintainer(maintainer) +################################################################################ - return maintainer_from_source_cache[source_id] +def uploader_list(source): + '''Return a sorted list of uploader names for source package.''' + return sorted([uploader.name for uploader in source.uploaders]) ################################################################################ def main(): cnf = Config() - Arguments = [('h',"help","Make-Maintainers::Options::Help"), - ('u',"uploaders","Make-Maintainers::Options::Uploaders")] + Arguments = [('h',"help","Make-Maintainers::Options::Help")] 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") @@ -125,122 +77,55 @@ def main(): if Options["Help"]: usage() - gen_uploaders = False - if Options["Uploaders"]: - gen_uploaders = True - + Logger = daklog.Logger(cnf.Cnf, 'make-maintainers') session = DBConn().session() - for suite in session.query(Suite).all(): - suite_name = suite.suite_name - suite_priority = suite.priority - - # Source packages - if gen_uploaders: - 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_name}) - else: - 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_name}) - - for source in q.fetchall(): - package = source[0] - version = source[1] - maintainer = fix_maintainer(source[2]) - if gen_uploaders: - key = (package, maintainer) - else: - key = package - - 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 - if gen_uploaders: - 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_name}) - else: - 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_name}) - - - 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 and not gen_uploaders: - maintainer = get_maintainer_from_source(source_id, session) - else: - maintainer = get_maintainer(binary[2], session) - if gen_uploaders: - key = (package, maintainer) - else: - key = package - - 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 } - - # Process any additional Maintainer files (e.g. from pseudo packages) + # dictionary packages to maintainer names + maintainers = dict() + # dictionary packages to list of uploader names + uploaders = dict() + + source_query = session.query(DBSource).from_statement(''' + select distinct on (source) * from source + order by source, version desc''') + + binary_query = session.query(DBBinary).from_statement(''' + select distinct on (package) * from binaries + order by package, version desc''') + + Logger.log(['sources']) + for source in source_query: + maintainers[source.source] = source.maintainer.name + uploaders[source.source] = uploader_list(source) + + Logger.log(['binaries']) + for binary in binary_query: + if binary.package not in maintainers: + maintainers[binary.package] = binary.maintainer.name + uploaders[binary.package] = uploader_list(binary.source) + + Logger.log(['files']) + # Process any additional Maintainer files (e.g. from pseudo + # packages) for filename in extra_files: extrafile = utils.open_file(filename) for line in extrafile.readlines(): line = re_comments.sub('', line).strip() if line == "": continue - split = line.split() - lhs = split[0] - maintainer = fix_maintainer(" ".join(split[1:])) - if lhs.find('~') != -1: - (package, version) = lhs.split('~', 1) - 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(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() - if gen_uploaders: - for (package, maintainer) in package_keys: - key = (package, maintainer) - lhs = "~".join([package, packages[key]["version"]]) - print "%-30s %s" % (lhs, maintainer) - else: - for package in package_keys: - lhs = "~".join([package, packages[package]["version"]]) - print "%-30s %s" % (lhs, packages[package]["maintainer"]) + (package, maintainer) = line.split(None, 1) + maintainers[package] = maintainer + uploaders[package] = [maintainer] + + maintainer_file = open('Maintainers', 'w') + uploader_file = open('Uploaders', 'w') + for package in sorted(uploaders): + maintainer_file.write(format(package, maintainers[package])) + for uploader in uploaders[package]: + uploader_file.write(format(package, uploader)) + uploader_file.close() + maintainer_file.close() + Logger.close() ################################################################################