]> git.decadent.org.uk Git - dak.git/blob - dak/make_pkg_file_mapping.py
auto-decruft: Disable short options for NVI
[dak.git] / dak / make_pkg_file_mapping.py
1 #!/usr/bin/env python
2
3 """
4 Prints out, for every file in the pool, which source package and version it
5 belongs to and for binary packages additionally which arch, binary package
6 and binary package version it has in a standard rfc2822-like format.
7
8 @contact: Debian FTP Master <ftpmaster@debian.org>
9 @copyright: 2009  Peter Palfrader <peter@palfrader.org>
10 @license: GNU General Public License version 2 or later
11 """
12
13 # This program is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation; either version 2 of the License, or
16 # (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26
27
28 ################################################################################
29
30 # <arma> it's crypto -- think of it like magic if you like.
31
32 ################################################################################
33
34 import sys
35
36 from daklib.dbconn import *
37
38 ################################################################################
39
40 def build_mapping(archive, session):
41     # The ORDER BY is in the queries so that compression of the output works
42     # better.  It's the difference between a 9 megabyte bzip2 and a 2.5 mb
43     # bzip2 file.
44
45     query_sources = """
46     SELECT
47         source.source,
48         source.version,
49         './pool/' || component.name || '/' || files.filename AS path
50     FROM source
51       JOIN dsc_files ON source.id=dsc_files.source
52       JOIN files ON files.id=dsc_files.file
53       JOIN files_archive_map ON files.id = files_archive_map.file_id
54       JOIN component ON files_archive_map.component_id = component.id
55       JOIN files_archive_map fam_dsc ON fam_dsc.file_id=source.file AND fam_dsc.component_id=component.id AND fam_dsc.archive_id=files_archive_map.archive_id
56     WHERE files_archive_map.archive_id = :archive_id
57     ORDER BY source, version, component.id, files.filename
58     """
59
60     query_binaries = """
61     SELECT
62         source.source,
63         source.version,
64         architecture.arch_string AS arch,
65         './pool/' || component.name || '/' || files.filename AS path,
66         binaries.package,
67         binaries.version AS bin_version
68     FROM source
69       JOIN binaries ON source.id=binaries.source
70       JOIN files ON binaries.file=files.id
71       JOIN files_archive_map ON files.id = files_archive_map.file_id
72       JOIN component ON files_archive_map.component_id = component.id
73       JOIN architecture ON architecture.id=binaries.architecture
74     WHERE files_archive_map.archive_id = :archive_id
75     ORDER BY source, version, package, bin_version
76     """
77
78     for row in session.execute(query_sources, {'archive_id': archive.archive_id}).fetchall():
79         (source, version, path) = row
80         print "Path: %s"%path
81         print "Source: %s"%source
82         print "Source-Version: %s"%version
83         print
84
85     for row in session.execute(query_binaries, {'archive_id': archive.archive_id}).fetchall():
86         (source, version, arch, path, bin, binv) = row
87         print "Path: %s"%path
88         print "Source: %s"%source
89         print "Source-Version: %s"%version
90         print "Architecture: %s"%arch
91         print "Binary: %s"%bin
92         print "Binary-Version: %s"%binv
93         print
94
95 ################################################################################
96
97 def usage():
98     print "usage: dak make-pkg-file-mapping <archive>"
99     sys.exit(0)
100
101 ################################################################################
102
103 def main():
104     if len(sys.argv) != 2:
105         usage()
106
107     archive_name = sys.argv[1]
108
109     session = DBConn().session()
110     archive = session.query(Archive).filter_by(archive_name=archive_name).one()
111     build_mapping(archive, session)
112
113 #########################################################################################
114
115 if __name__ == '__main__':
116     main()
117
118
119 # vim:set et:
120 # vim:set ts=4:
121 # vim:set shiftwidth=4: