1#! /usr/bin/env python3
3"""
4Output override files for apt-ftparchive and indices/
5@contact: Debian FTP Master <ftpmaster@debian.org>
6@copyright: 2000, 2001, 2002, 2004, 2006 James Troup <james@nocrew.org>
7@license: GNU General Public License version 2 or later
8"""
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24################################################################################
26# This is separate because it's horribly Debian specific and I don't
27# want that kind of horribleness in the otherwise generic 'dak
28# make-overrides'. It does duplicate code tho.
30################################################################################
32import os
33import sys
34from typing import TextIO
36import apt_pkg
38from daklib import utils
39from daklib.config import Config
40from daklib.dbconn import Component, DBConn, OverrideType, Suite
42################################################################################
45def usage(exit_code=0):
46 print(
47 """Usage: dak make-overrides
48Outputs the override tables to text files.
50 -h, --help show this help and exit."""
51 )
52 sys.exit(exit_code)
55################################################################################
58def do_list(
59 output_file: TextIO,
60 suite: Suite,
61 component: Component,
62 otype: OverrideType,
63 session,
64):
65 """
66 Fetch override data for suite from the database and dump it.
68 :param output_file: where to write the overrides to
69 :param suite: A suite object describing the Suite
70 :param component: The name of the component
71 :param otype: object of type of override. deb/udeb/dsc
72 :param session: the database session in use
73 """
74 # Here's a nice example of why the object API isn't always the
75 # right answer. On my laptop, the object version of the code
76 # takes 1:45, the 'dumb' tuple-based one takes 0:16 - mhy
78 if otype.overridetype == "dsc":
79 q = session.execute(
80 "SELECT o.package, s.section, o.maintainer FROM override o, section s WHERE o.suite = :suite AND o.component = :component AND o.type = :otype AND o.section = s.id ORDER BY s.section, o.package",
81 {
82 "suite": suite.suite_id,
83 "component": component.component_id,
84 "otype": otype.overridetype_id,
85 },
86 )
87 for i in q.fetchall():
88 output_file.write(utils.result_join(i) + "\n")
90 else:
91 q = session.execute(
92 "SELECT o.package, p.priority, s.section, o.maintainer FROM override o, priority p, section s WHERE o.suite = :suite AND o.component = :component AND o.type = :otype AND o.priority = p.id AND o.section = s.id ORDER BY s.section, p.level, o.package",
93 {
94 "suite": suite.suite_id,
95 "component": component.component_id,
96 "otype": otype.overridetype_id,
97 },
98 )
99 for i in q.fetchall():
100 output_file.write(utils.result_join(i) + "\n")
103################################################################################
106def main():
107 cnf = Config()
108 Arguments = [("h", "help", "Make-Overrides::Options::Help")]
109 for i in ["help"]:
110 key = "Make-Overrides::Options::%s" % i
111 if key not in cnf: 111 ↛ 109line 111 didn't jump to line 109, because the condition on line 111 was never false
112 cnf[key] = ""
113 apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
114 Options = cnf.subtree("Make-Overrides::Options")
115 if Options["Help"]:
116 usage()
118 d = DBConn()
119 session = d.session()
121 for suite in session.query(Suite).filter(
122 Suite.overrideprocess == True # noqa:E712
123 ):
124 if suite.untouchable: 124 ↛ 125line 124 didn't jump to line 125, because the condition on line 124 was never true
125 print("Skipping %s as it is marked as untouchable" % suite.suite_name)
126 continue
128 print("Processing %s..." % (suite.suite_name), file=sys.stderr)
129 override_suite = suite.overridecodename or suite.codename
131 for component in session.query(Component).all():
132 for otype in session.query(OverrideType).all():
133 otype_name = otype.overridetype
134 cname = component.component_name
136 # TODO: Stick suffix info in database (or get rid of it)
137 if otype_name == "deb":
138 suffix = ""
139 elif otype_name == "udeb":
140 if cname == "contrib":
141 continue # Ick2
142 suffix = ".debian-installer"
143 elif otype_name == "dsc": 143 ↛ 146line 143 didn't jump to line 146, because the condition on line 143 was never false
144 suffix = ".src"
145 else:
146 utils.fubar("Don't understand OverrideType %s" % otype.overridetype)
148 cname = cname.replace("/", "_")
149 filename = os.path.join(
150 cnf["Dir::Override"],
151 "override.%s.%s%s" % (override_suite, cname, suffix),
152 )
154 with open(filename, "w") as output_file:
155 do_list(output_file, suite, component, otype, session)
158################################################################################
161if __name__ == "__main__":
162 main()