]> git.decadent.org.uk Git - dak.git/blob - dak/external_overrides.py
Make external overrides specific for (suite, component)
[dak.git] / dak / external_overrides.py
1 #!/usr/bin/python
2
3 """
4 Modify external overrides.
5
6 @contact: Debian FTP Master <ftpmaster@debian.org>
7 @copyright: 2011  Ansgar Burchardt <ansgar@debian.org>
8 @license: GNU General Public License version 2 or later
9 """
10
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
25 from daklib.dbconn import *
26 from daklib.config import Config
27 from daklib import utils, daklog
28
29 import apt_pkg
30 import sys
31
32 def usage():
33     print """Usage: dak external-overrides COMMAND
34 Modify external overrides.
35
36   -h, --help                    show this help and exit.
37   -f, --force                   allow processing of untouchable suites.
38
39 Commands can use a long or abbreviated form:
40
41     import SUITE COMPONENT KEY  import external overrides for KEY
42     i SUITE COMPONENT KEY       NOTE: This will replace existing overrides.
43
44     copy FROM TO                copy external overrides from suite FROM to TO
45                                 NOTE: Needs --force for untouchable TO
46
47 For the 'import' command, external overrides are read from standard input and
48 should be given as lines of the form 'PACKAGE KEY VALUE'.
49 """
50     sys.exit()
51
52 #############################################################################
53
54 def external_overrides_copy(from_suite_name, to_suite_name, force = False):
55     session = DBConn().session()
56
57     from_suite = get_suite(from_suite_name, session)
58     to_suite = get_suite(to_suite_name, session)
59
60     if from_suite is None:
61         print "E: source %s not found." % from_suite_name
62         session.rollback()
63         return False
64     if to_suite is None:
65         print "E: target %s not found." % to_suite_name
66         session.rollback()
67         return False
68
69     if not force and to_suite.untouchable:
70         print "E: refusing to touch untouchable suite %s (not forced)." % to_suite_name
71         session.rollback()
72         return False
73
74     session.query(ExternalOverride).filter_by(suite=to_suite).delete()
75     session.execute("""
76     INSERT INTO external_overrides (suite, component, package, key, value)
77       SELECT :to_suite, component, package, key, value FROM external_overrides WHERE suite = :from_suite
78     """, { 'from_suite': from_suite.suite_id, 'to_suite': to_suite.suite_id })
79
80     session.commit()
81
82 def external_overrides_import(suite_name, component_name, key, file, force = False):
83     session = DBConn().session()
84
85     suite = get_suite(suite_name, session)
86     component = get_component(component_name, session)
87
88     if not force and suite.untouchable:
89         print "E: refusing to touch untouchable suite %s (not forced)." % suite_name
90         session.rollback()
91         return False
92
93     session.query(ExternalOverride).filter_by(suite=suite,component=component,key=key).delete()
94
95     for line in file:
96         (package, key, value) = line.strip().split(None, 2)
97         eo = ExternalOverride()
98         eo.suite = suite
99         eo.component = component
100         eo.package = package
101         eo.key = key
102         eo.value = value
103         session.add(eo)
104
105     session.commit()
106
107 #############################################################################
108
109 def main():
110     cnf = Config()
111
112     Arguments = [('h',"help","External-Overrides::Options::Help"),
113                  ('f','force','External-Overrides::Options::Force')]
114
115     args = apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv)
116     try:
117         Options = cnf.SubTree("External-Overrides::Options")
118     except KeyError:
119         Options = {}
120
121     if Options.has_key("Help"):
122         usage()
123
124     force = False
125     if Options.has_key("Force") and Options["Force"]:
126         force = True
127
128     logger = daklog.Logger(cnf, 'external-overrides')
129
130     command = args[0]
131     if command in ('import', 'i'):
132         external_overrides_import(args[1], args[2], args[3], sys.stdin, force)
133     elif command in ('copy', 'c'):
134         external_overrides_copy(args[1], args[2], force)
135     else:
136         print "E: Unknown commands."
137
138 if __name__ == '__main__':
139     main()