[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[dak/master 2/3] generate-filelist: improve arch all handling



include only the 'right' version of arch all packages

Signed-off-by: Torsten Werner <twerner@debian.org>
---
 dak/generate_filelist.py |   55 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/dak/generate_filelist.py b/dak/generate_filelist.py
index 43a7605..50a0949 100755
--- a/dak/generate_filelist.py
+++ b/dak/generate_filelist.py
@@ -44,11 +44,46 @@ def getSources(suite, component, session):
 
 def getBinaries(suite, component, architecture, type, session):
     query = """
-        SELECT path, filename
-            FROM binfiles_suite_component_arch
-            WHERE suite = :suite AND component = :component AND type = :type AND
-                  (architecture = :architecture OR architecture = 2)
-            ORDER BY filename
+CREATE TEMP TABLE gf_candidates (
+    filename text,
+    path text,
+    architecture integer,
+    src integer,
+    source text);
+
+INSERT INTO gf_candidates (filename, path, architecture, src, source)
+    SELECT f.filename, l.path, b.architecture, b.source as src, s.source
+	FROM binaries b
+	JOIN bin_associations ba ON b.id = ba.bin
+	JOIN source s ON b.source = s.id
+        JOIN files f ON b.file = f.id
+        JOIN location l ON f.location = l.id
+	WHERE ba.suite = :suite AND b.type = :type AND
+            l.component = :component AND b.architecture IN (2, :architecture);
+
+WITH arch_any AS
+
+    (SELECT path, filename FROM gf_candidates
+	WHERE architecture > 2),
+
+     arch_all_with_any AS
+    (SELECT path, filename FROM gf_candidates
+	WHERE architecture = 2 AND
+	      src IN (SELECT src FROM gf_candidates WHERE architecture > 2)),
+
+     arch_all_without_any AS
+    (SELECT path, filename FROM gf_candidates
+	WHERE architecture = 2 AND
+	      source NOT IN (SELECT DISTINCT source FROM gf_candidates WHERE architecture > 2)),
+
+     filelist AS
+    (SELECT * FROM arch_any
+    UNION
+    SELECT * FROM arch_all_with_any
+    UNION
+    SELECT * FROM arch_all_without_any)
+
+    SELECT * FROM filelist ORDER BY filename
     """
     args = { 'suite': suite.suite_id,
              'component': component.component_id,
@@ -75,10 +110,12 @@ def writeSourceList(suite, component, session):
         file.write(filename + '\n')
     file.close()
 
-def writeBinaryList(suite, component, architecture, type, session):
+def writeBinaryList(suite, component, architecture, type):
     file = listPath(suite, component, architecture, type)
+    session = DBConn().session()
     for filename in getBinaries(suite, component, architecture, type, session):
         file.write(filename + '\n')
+    session.close()
     file.close()
 
 def usage():
@@ -133,12 +170,12 @@ def main():
                     if architecture_name == 'source':
                         writeSourceList(suite, component, session)
                     elif architecture_name != 'all':
-                        writeBinaryList(suite, component, architecture, 'deb', session)
-                        writeBinaryList(suite, component, architecture, 'udeb', session)
+                        writeBinaryList(suite, component, architecture, 'deb')
+                        writeBinaryList(suite, component, architecture, 'udeb')
                 except:
                     pass
     # this script doesn't change the database
-    session.rollback()
+    session.close()
 
 if __name__ == '__main__':
     main()
-- 
1.6.5



Reply to: