1#! /usr/bin/env python3
2"""
3Create all the contents files
5@contact: Debian FTPMaster <ftpmaster@debian.org>
6@copyright: 2008, 2009 Michael Casadevall <mcasadevall@debian.org>
7@copyright: 2009 Mike O'Connor <stew@debian.org>
8@copyright: 2011 Torsten Werner <twerner@debian.org>
9@license: GNU General Public License version 2 or later
10"""
12################################################################################
14# This program is free software; you can redistribute it and/or modify
15# it under the terms of the GNU General Public License as published by
16# the Free Software Foundation; either version 2 of the License, or
17# (at your option) any later version.
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22# GNU General Public License for more details.
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28################################################################################
30# <Ganneff> there is the idea to slowly replace contents files
31# <Ganneff> with a new generation of such files.
32# <Ganneff> having more info.
34# <Ganneff> of course that wont help for now where we need to generate them :)
36################################################################################
38import sys
39import apt_pkg
41from daklib.config import Config
42from daklib.dbconn import *
43from daklib.contents import BinaryContentsScanner, ContentsWriter, \
44 SourceContentsScanner
45from daklib import daklog
46from daklib import utils
48################################################################################
51def usage(exit_code=0):
52 print("""Usage: dak contents [options] subcommand
54SUBCOMMANDS
55 generate
56 generate Contents-$arch.gz files
58 scan-source
59 scan the source packages in the existing pool and load contents into
60 the src_contents table
62 scan-binary
63 scan the (u)debs in the existing pool and load contents into the
64 bin_contents table
66OPTIONS
67 -h, --help
68 show this help and exit
70OPTIONS for generate
71 -a, --archive=ARCHIVE
72 only operate on suites in the specified archive
74 -s, --suite={stable,testing,unstable,...}
75 only operate on specified suite names
77 -c, --component={main,contrib,non-free}
78 only operate on specified components
80 -f, --force
81 write Contents files for suites marked as untouchable, too
83OPTIONS for scan-source and scan-binary
84 -l, --limit=NUMBER
85 maximum number of packages to scan
86""")
87 sys.exit(exit_code)
89################################################################################
92def write_all(cnf, archive_names=[], suite_names=[], component_names=[], force=None):
93 Logger = daklog.Logger('contents generate')
94 ContentsWriter.write_all(Logger, archive_names, suite_names, component_names, force)
95 Logger.close()
97################################################################################
100def binary_scan_all(cnf, limit):
101 Logger = daklog.Logger('contents scan-binary')
102 result = BinaryContentsScanner.scan_all(limit)
103 processed = '%(processed)d packages processed' % result
104 remaining = '%(remaining)d packages remaining' % result
105 Logger.log([processed, remaining])
106 Logger.close()
108################################################################################
111def source_scan_all(cnf, limit):
112 Logger = daklog.Logger('contents scan-source')
113 result = SourceContentsScanner.scan_all(limit)
114 processed = '%(processed)d packages processed' % result
115 remaining = '%(remaining)d packages remaining' % result
116 Logger.log([processed, remaining])
117 Logger.close()
119################################################################################
122def main():
123 cnf = Config()
124 cnf['Contents::Options::Help'] = ''
125 cnf['Contents::Options::Suite'] = ''
126 cnf['Contents::Options::Component'] = ''
127 cnf['Contents::Options::Limit'] = ''
128 cnf['Contents::Options::Force'] = ''
129 arguments = [('h', "help", 'Contents::Options::Help'),
130 ('a', 'archive', 'Contents::Options::Archive', 'HasArg'),
131 ('s', "suite", 'Contents::Options::Suite', "HasArg"),
132 ('c', "component", 'Contents::Options::Component', "HasArg"),
133 ('l', "limit", 'Contents::Options::Limit', "HasArg"),
134 ('f', "force", 'Contents::Options::Force'),
135 ]
136 args = apt_pkg.parse_commandline(cnf.Cnf, arguments, sys.argv)
137 options = cnf.subtree('Contents::Options')
139 if (len(args) != 1) or options['Help']:
140 usage()
142 limit = None
143 if len(options['Limit']) > 0: 143 ↛ 144line 143 didn't jump to line 144, because the condition on line 143 was never true
144 limit = int(options['Limit'])
146 if args[0] == 'scan-source':
147 source_scan_all(cnf, limit)
148 return
150 if args[0] == 'scan-binary':
151 binary_scan_all(cnf, limit)
152 return
154 archive_names = utils.split_args(options['Archive'])
155 suite_names = utils.split_args(options['Suite'])
156 component_names = utils.split_args(options['Component'])
158 force = bool(options['Force'])
160 if args[0] == 'generate': 160 ↛ 164line 160 didn't jump to line 164, because the condition on line 160 was never false
161 write_all(cnf, archive_names, suite_names, component_names, force)
162 return
164 usage()
167if __name__ == '__main__':
168 main()