]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/ls.py
daklib/daklog.py: acquire an advisory lock when writing to file
[dak.git] / daklib / ls.py
index aeb8cfcbb8b92eb7008d663a05e933b5f5666e06..0a1548f85a5ec133ce70d8b7b3361af2f4134289 100644 (file)
@@ -22,6 +22,8 @@ import sqlalchemy.sql as sql
 import daklib.daksql as daksql
 
 from daklib.dbconn import DBConn, session_wrapper
+from collections import defaultdict
+
 
 @session_wrapper
 def list_packages(packages, suites=None, components=None, architectures=None, binary_types=None,
@@ -39,7 +41,7 @@ def list_packages(packages, suites=None, components=None, architectures=None, bi
             where = where | t.c.source.op(comparison_operator)(package)
 
     if suites is not None:
-        where = where & t.c.suite.in_(suites)
+        where = where & (t.c.suite.in_(suites) | t.c.codename.in_(suites))
     if components is not None:
         where = where & t.c.component.in_(components)
     if architectures is not None:
@@ -72,6 +74,40 @@ def list_packages(packages, suites=None, components=None, architectures=None, bi
         result = session.execute(query)
         for row in result:
             yield "{0} {1} {2}".format(row[t.c.package], row[t.c.version], row[t.c.architecture])
+    elif format == "python":
+        c_architectures = daksql.string_agg(t.c.architecture, ',', order_by=[t.c.architecture_is_source.desc(), t.c.architecture])
+        query = sql.select([t.c.package,
+                            t.c.version,
+                            t.c.display_suite,
+                            c_architectures,
+                            t.c.source,
+                            t.c.source_version,
+                            t.c.component]) \
+            .where(where) \
+            .group_by(t.c.package,
+                      t.c.version,
+                      t.c.display_suite,
+                      t.c.source,
+                      t.c.component,
+                      t.c.source_version)
+        result = session.execute(query).fetchall()
+
+        if len(result) == 0:
+            raise StopIteration
+
+        val = lambda: defaultdict(val)
+        ret = val()
+        for row in result:
+            ret[row[t.c.package]] \
+               [row[t.c.display_suite]] \
+               [row[t.c.version]]={'component':      row[t.c.component],
+                                   'architectures':  row[c_architectures].split(','),
+                                   'source':         row[t.c.source],
+                                   'source_version': row[t.c.source_version]
+                               }
+
+        yield ret
+        return
     else:
         raise ValueError("Unknown output format requested.")