]> git.decadent.org.uk Git - dak.git/blob - daklib/lists.py
Merge branch 'master' of ssh://ftp-master.debian.org/srv/ftp.debian.org/git/dak
[dak.git] / daklib / lists.py
1 #!/usr/bin/python
2
3 """
4 Helper functions for list generating commands (Packages, Sources).
5
6 @contact: Debian FTP Master <ftpmaster@debian.org>
7 @copyright: 2009-2011  Torsten Werner <twerner@debian.org>
8 @license: GNU General Public License version 2 or later
9 """
10
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
25 ################################################################################
26
27 from dbconn import get_architecture
28
29 def fetch(query, args, session):
30     for (id, path, filename) in session.execute(query, args).fetchall():
31         yield (id, path + filename)
32
33 def getSources(suite, component, session, timestamp = None):
34     '''
35     Calculates the sources in suite and component optionally limited by
36     sources newer than timestamp.  Returns a generator that yields a
37     tuple of source id and full pathname to the dsc file. See function
38     writeSourceList() in dak/generate_filelist.py for an example that
39     uses this function.
40     '''
41     extra_cond = ""
42     if timestamp:
43         extra_cond = "AND extract(epoch from sa.created) > %d" % timestamp
44     query = """
45         SELECT s.id, l.path, f.filename
46             FROM source s
47             JOIN src_associations sa
48                 ON s.id = sa.source AND sa.suite = :suite %s
49             JOIN files f
50                 ON s.file = f.id
51             JOIN location l
52                 ON f.location = l.id AND l.component = :component
53             ORDER BY filename
54     """ % extra_cond
55     args = { 'suite': suite.suite_id,
56              'component': component.component_id }
57     return fetch(query, args, session)
58
59 def getArchAll(suite, component, architecture, type, session, timestamp = None):
60     '''
61     Calculates all binaries in suite and component of architecture 'all' (and
62     only 'all') and type 'deb' or 'udeb' optionally limited to binaries newer
63     than timestamp.  Returns a generator that yields a tuple of binary id and
64     full pathname to the u(deb) file. See function writeAllList() in
65     dak/generate_filelist.py for an example that uses this function.
66     '''
67     query = suite.clone(session).binaries. \
68         filter_by(architecture = architecture, binarytype = type)
69     if timestamp is not None:
70         extra_cond = 'extract(epoch from bin_associations.created) > %d' % timestamp
71         query = query.filter(extra_cond)
72     for binary in query:
73         yield (binary.binary_id, binary.poolfile.fullpath)
74
75 def getBinaries(suite, component, architecture, type, session, timestamp = None):
76     '''
77     Calculates the binaries in suite and component of architecture and
78     type 'deb' or 'udeb' optionally limited to binaries newer than
79     timestamp.  Returns a generator that yields a tuple of binary id and
80     full pathname to the u(deb) file. See function writeBinaryList() in
81     dak/generate_filelist.py for an example that uses this function.
82     '''
83     extra_cond = ""
84     if timestamp:
85         extra_cond = "AND extract(epoch from ba.created) > %d" % timestamp
86     query = """
87 CREATE TEMP TABLE b_candidates (
88     id integer,
89     source integer,
90     file integer,
91     architecture integer);
92
93 INSERT INTO b_candidates (id, source, file, architecture)
94     SELECT b.id, b.source, b.file, b.architecture
95         FROM binaries b
96         JOIN bin_associations ba ON b.id = ba.bin
97         WHERE b.type = :type AND ba.suite = :suite AND
98             b.architecture IN (:arch_all, :architecture) %s;
99
100 CREATE TEMP TABLE gf_candidates (
101     id integer,
102     filename text,
103     path text,
104     architecture integer,
105     src integer,
106     source text);
107
108 INSERT INTO gf_candidates (id, filename, path, architecture, src, source)
109     SELECT bc.id, f.filename, l.path, bc.architecture, bc.source as src, s.source
110         FROM b_candidates bc
111         JOIN source s ON bc.source = s.id
112         JOIN files f ON bc.file = f.id
113         JOIN location l ON f.location = l.id
114         WHERE l.component = :component;
115
116 WITH arch_any AS
117
118     (SELECT id, path, filename FROM gf_candidates
119         WHERE architecture <> :arch_all),
120
121      arch_all_with_any AS
122     (SELECT id, path, filename FROM gf_candidates
123         WHERE architecture = :arch_all AND
124               src IN (SELECT src FROM gf_candidates WHERE architecture <> :arch_all)),
125
126      arch_all_without_any AS
127     (SELECT id, path, filename FROM gf_candidates
128         WHERE architecture = :arch_all AND
129               source NOT IN (SELECT DISTINCT source FROM gf_candidates WHERE architecture <> :arch_all)),
130
131      filelist AS
132     (SELECT * FROM arch_any
133     UNION
134     SELECT * FROM arch_all_with_any
135     UNION
136     SELECT * FROM arch_all_without_any)
137
138     SELECT * FROM filelist ORDER BY filename
139     """ % extra_cond
140     args = { 'suite': suite.suite_id,
141              'component': component.component_id,
142              'architecture': architecture.arch_id,
143              'arch_all': get_architecture('all', session).arch_id,
144              'type': type }
145     return fetch(query, args, session)
146