1#! /usr/bin/env python3 

2 

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""" 

9 

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. 

14 

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. 

19 

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 

23 

24################################################################################ 

25 

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. 

29 

30################################################################################ 

31 

32import os 

33import sys 

34from typing import TextIO 

35 

36import apt_pkg 

37 

38from daklib import utils 

39from daklib.config import Config 

40from daklib.dbconn import Component, DBConn, OverrideType, Suite 

41 

42################################################################################ 

43 

44 

45def usage(exit_code=0): 

46 print( 

47 """Usage: dak make-overrides 

48Outputs the override tables to text files. 

49 

50 -h, --help show this help and exit.""" 

51 ) 

52 sys.exit(exit_code) 

53 

54 

55################################################################################ 

56 

57 

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. 

67 

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 

77 

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") 

89 

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") 

101 

102 

103################################################################################ 

104 

105 

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() 

117 

118 d = DBConn() 

119 session = d.session() 

120 

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 

127 

128 print("Processing %s..." % (suite.suite_name), file=sys.stderr) 

129 override_suite = suite.overridecodename or suite.codename 

130 

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 

135 

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) 

147 

148 cname = cname.replace("/", "_") 

149 filename = os.path.join( 

150 cnf["Dir::Override"], 

151 "override.%s.%s%s" % (override_suite, cname, suffix), 

152 ) 

153 

154 with open(filename, "w") as output_file: 

155 do_list(output_file, suite, component, otype, session) 

156 

157 

158################################################################################ 

159 

160 

161if __name__ == "__main__": 

162 main()