]> git.decadent.org.uk Git - dak.git/blob - dak/dak.py
move generate_contents_information to utils.py
[dak.git] / dak / dak.py
1 #!/usr/bin/env python
2
3 """Wrapper to launch dak functionality"""
4 # Copyright (C) 2005, 2006 Anthony Towns <ajt@debian.org>
5 # Copyright (C) 2006 James Troup <james@nocrew.org>
6
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21 ################################################################################
22
23 # well I don't know where you're from but in AMERICA, there's a little
24 # thing called "abstinent until proven guilty."
25 #  -- http://harrietmiers.blogspot.com/2005/10/wow-i-feel-loved.html
26
27 # (if James had a blog, I bet I could find a funny quote in it to use!)
28
29 ################################################################################
30
31 import sys, imp
32 import daklib.utils, daklib.extensions
33
34 ################################################################################
35
36 class UserExtension:
37     def __init__(self, user_extension = None):
38         if user_extension:
39             m = imp.load_source("dak_userext", user_extension)
40             d = m.__dict__
41         else:
42             m, d = None, {}
43         self.__dict__["_module"] = m
44         self.__dict__["_d"] = d
45
46     def __getattr__(self, a):
47         if a in self.__dict__: return self.__dict__[a]
48         if a[0] == "_": raise AttributeError, a
49         return self._d.get(a, None)
50
51     def __setattr__(self, a, v):
52         self._d[a] = v
53
54 ################################################################################
55
56 class UserExtension:
57     def __init__(self, user_extension = None):
58         if user_extension:
59             m = imp.load_source("dak_userext", user_extension)
60             d = m.__dict__
61         else:
62             m, d = None, {}
63         self.__dict__["_module"] = m
64         self.__dict__["_d"] = d
65
66     def __getattr__(self, a):
67         if a in self.__dict__: return self.__dict__[a]
68         if a[0] == "_": raise AttributeError, a
69         return self._d.get(a, None)
70
71     def __setattr__(self, a, v):
72         self._d[a] = v
73
74 ################################################################################
75
76 def init():
77     """Setup the list of modules and brief explanation of what they
78     do."""
79
80     functionality = [
81         ("ls",
82          "Show which suites packages are in"),
83         ("override",
84          "Query/change the overrides"),
85         ("check-archive",
86          "Archive sanity checks"),
87         ("queue-report",
88          "Produce a report on NEW and BYHAND packages"),
89         ("show-new",
90          "Output html for packages in NEW"),
91         ("show-deferred",
92          "Output html and symlinks for packages in DEFERRED"),
93
94         ("rm",
95          "Remove packages from suites"),
96
97         ("process-new",
98          "Process NEW and BYHAND packages"),
99         ("process-unchecked",
100          "Process packages in queue/unchecked"),
101         ("process-accepted",
102          "Install packages into the pool"),
103
104         ("make-suite-file-list",
105          "Generate lists of packages per suite for apt-ftparchive"),
106         ("generate-releases",
107          "Generate Release files"),
108         ("generate-contents",
109          "Generate contest files"),
110         ("generate-index-diffs",
111          "Generate .diff/Index files"),
112         ("clean-suites",
113          "Clean unused/superseded packages from the archive"),
114         ("clean-queues",
115          "Clean cruft from incoming"),
116         ("clean-proposed-updates",
117          "Remove obsolete .changes from proposed-updates"),
118
119         ("transitions",
120          "Manage the release transition file"),
121         ("check-overrides",
122          "Override cruft checks"),
123         ("check-proposed-updates",
124          "Dependency checking for proposed-updates"),
125         ("compare-suites",
126          "Show fixable discrepencies between suites"),
127         ("control-overrides",
128          "Manipulate/list override entries in bulk"),
129         ("control-suite",
130          "Manipulate suites in bulk"),
131         ("cruft-report",
132          "Check for obsolete or duplicated packages"),
133         ("decode-dot-dak",
134          "Display contents of a .dak file"),
135         ("examine-package",
136          "Show information useful for NEW processing"),
137         ("find-null-maintainers",
138          "Check for users with no packages in the archive"),
139         ("import-archive",
140          "Populate SQL database based from an archive tree"),
141         ("import-contents",
142          "Populate SQL database with Contents files"),
143         ("import-keyring",
144          "Populate fingerprint/uid table based on a new/updated keyring"),
145         ("import-ldap-fingerprints",
146          "Syncs fingerprint and uid tables with Debian LDAP db"),
147         ("import-users-from-passwd",
148          "Sync PostgreSQL users with passwd file"),
149         ("init-db",
150          "Update the database to match the conf file"),
151         ("update-db",
152          "Updates databae schema to latest revision"),
153         ("init-dirs",
154          "Initial setup of the archive"),
155         ("make-maintainers",
156          "Generates Maintainers file for BTS etc"),
157         ("make-overrides",
158          "Generates override files"),
159         ("mirror-split",
160          "Split the pool/ by architecture groups"),
161         ("poolize",
162          "Move packages from dists/ to pool/"),
163         ("reject-proposed-updates",
164          "Manually reject from proposed-updates"),
165         ("new-security-install",
166          "New way to install a security upload into the archive"),
167         ("split-done",
168          "Split queue/done into a date-based hierarchy"),
169         ("stats",
170          "Generate statistics"),
171         ]
172     return functionality
173
174 ################################################################################
175
176 def usage(functionality, exit_code=0):
177     """Print a usage message and exit with 'exit_code'."""
178
179     print """Usage: dak COMMAND [...]
180 Run DAK commands.  (Will also work if invoked as COMMAND.)
181
182 Available commands:"""
183     for (command, description) in functionality:
184         print "  %-23s %s" % (command, description)
185     sys.exit(exit_code)
186
187 ################################################################################
188
189 def main():
190     """Launch dak functionality."""
191
192     Cnf = daklib.utils.get_conf()
193
194     if Cnf.has_key("Dinstall::UserExtensions"):
195         userext = UserExtension(Cnf["Dinstall::UserExtensions"])
196     else:
197         userext = UserExtension()
198
199     functionality = init()
200     modules = [ command for (command, _) in functionality ]
201
202     if len(sys.argv) == 0:
203         daklib.utils.fubar("err, argc == 0? how is that possible?")
204     elif (len(sys.argv) == 1
205           or (len(sys.argv) == 2 and
206               (sys.argv[1] == "--help" or sys.argv[1] == "-h"))):
207         usage(functionality)
208
209     # First see if we were invoked with/as the name of a module
210     cmdname = sys.argv[0]
211     cmdname = cmdname[cmdname.rfind("/")+1:]
212     if cmdname in modules:
213         pass
214     # Otherwise the argument is the module
215     else:
216         cmdname = sys.argv[1]
217         sys.argv = [sys.argv[0] + " " + sys.argv[1]] + sys.argv[2:]
218         if cmdname not in modules:
219             match = []
220             for name in modules:
221                 if name.startswith(cmdname):
222                     match.append(name)
223             if len(match) == 1:
224                 cmdname = match[0]
225             elif len(match) > 1:
226                 daklib.utils.warn("ambiguous command '%s' - could be %s" \
227                            % (cmdname, ", ".join(match)))
228                 usage(functionality, 1)
229             else:
230                 daklib.utils.warn("unknown command '%s'" % (cmdname))
231                 usage(functionality, 1)
232
233     # Invoke the module
234     module = __import__(cmdname.replace("-","_"))
235
236     module.dak_userext = userext
237     userext.dak_module = module
238
239     daklib.extensions.init(cmdname, module, userext)
240     if userext.init is not None: userext.init(cmdname)
241
242     module.main()
243
244 ################################################################################
245
246 if __name__ == "__main__":
247     main()