[dak/master] make-maintainer: Move logic into database
A sql database is way better in aggregating things if you ask it to do
all the heavy lifting.
---
dak/make_maintainers.py | 90 +++++++++++++++++++++++++++++++------------------
1 file changed, 57 insertions(+), 33 deletions(-)
diff --git a/dak/make_maintainers.py b/dak/make_maintainers.py
index 7387e8e..88b9dc3 100755
--- a/dak/make_maintainers.py
+++ b/dak/make_maintainers.py
@@ -40,6 +40,8 @@ from daklib.regexes import re_comments
import apt_pkg
import sys
+from sqlalchemy.sql import text
+
################################################################################
def usage (exit_code=0):
@@ -61,12 +63,6 @@ def format(package, person):
################################################################################
-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()
@@ -94,33 +90,61 @@ def main():
# dictionary packages to list of uploader names
uploaders = dict()
- source_query = session.query(DBSource).from_statement('''
- select distinct on (source.source) source.* from source
- join src_associations sa on source.id = sa.source
- join suite on sa.suite = suite.id
- where suite.archive_id = :archive_id
- order by source.source, source.version desc''') \
- .params(archive_id=archive.archive_id)
-
- binary_query = session.query(DBBinary).from_statement('''
- select distinct on (binaries.package) binaries.* from binaries
- join bin_associations ba on binaries.id = ba.bin
- join suite on ba.suite = suite.id
- where suite.archive_id = :archive_id
- order by binaries.package, binaries.version desc''') \
- .params(archive_id=archive.archive_id)
-
- Logger.log(['sources'])
- for source in source_query:
- maintainers[source.source] = source.maintainer.name
- uploaders[source.source] = uploader_list(source)
-
- if not Options["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)
+ query = session.execute(text('''
+SELECT
+ bs.package,
+ bs.name AS maintainer,
+ array_agg(mu.name) OVER (
+ PARTITION BY bs.source, bs.id
+ ORDER BY mu.name
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+ ) AS uploaders
+ FROM (
+ SELECT DISTINCT ON (package)
+ *
+ FROM (
+ SELECT
+ s.id AS source,
+ 0 AS id,
+ s.source AS package,
+ s.version,
+ m.name
+ FROM
+ source AS s INNER JOIN
+ maintainer AS m ON s.maintainer = m.id INNER JOIN
+ src_associations AS sa ON s.id = sa.source INNER JOIN
+ suite on sa.suite = suite.id
+ WHERE
+ suite.archive_id = :archive_id
+ UNION SELECT
+ b.source,
+ b.id,
+ b.package,
+ b.version,
+ m.name
+ FROM
+ binaries AS b INNER JOIN
+ maintainer AS m ON b.maintainer = m.id INNER JOIN
+ bin_associations AS ba ON b.id = ba.bin INNER JOIN
+ suite on ba.suite = suite.id
+ WHERE
+ NOT :source_only AND
+ suite.archive_id = :archive_id
+ ) AS bs
+ ORDER BY package, version desc
+ ) AS bs LEFT OUTER JOIN
+ -- find all uploaders for a given source
+ src_uploaders AS su ON bs.source = su.source LEFT OUTER JOIN
+ maintainer AS mu ON su.maintainer = mu.id
+''').params(
+ archive_id=archive.archive_id,
+ source_only=Options["Source"]
+))
+
+ Logger.log(['database'])
+ for entry in query:
+ maintainers[entry['package']] = entry['maintainer']
+ uploaders[entry['package']] = entry['uploaders']
Logger.log(['files'])
# Process any additional Maintainer files (e.g. from pseudo
--
2.1.4
Reply to: