4 Generate a list of override disparities
6 @contact: Debian FTP Master <ftpmaster@debian.org>
7 @copyright: 2010 Luca Falavigna <dktrkranz@debian.org>
8 @license: GNU General Public License version 2 or later
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.
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.
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
25 ################################################################################
27 # <adsb> Yay bugzilla *sigh*
29 # <Ganneff> quick, replace the bts with it
30 # * jcristau replaces dak with soyuz
31 # <adsb> and expects Ganneff to look after it?
32 # <jcristau> nah, elmo can do that
35 ################################################################################
42 from daklib.config import Config
43 from daklib.dbconn import *
44 from daklib import utils
46 ################################################################################
48 def usage (exit_code=0):
49 print """Generate a list of override disparities
52 dak override-disparity [-f <file>] [ -p <package> ] [ -s <suite> ]
56 -h, --help show this help and exit
57 -f, --file store output into given file
58 -p, --package limit check on given package only
59 -s, --suite choose suite to look for (default: unstable)"""
65 Arguments = [('h','help','Override-Disparity::Options::Help'),
66 ('f','file','Override-Disparity::Options::File','HasArg'),
67 ('s','suite','Override-Disparity::Options::Suite','HasArg'),
68 ('p','package','Override-Disparity::Options::Package','HasArg')]
70 for i in ['help', 'package']:
71 if not cnf.has_key('Override-Disparity::Options::%s' % (i)):
72 cnf['Override-Disparity::Options::%s' % (i)] = ''
73 if not cnf.has_key('Override-Disparity::Options::Suite'):
74 cnf['Override-Disparity::Options::Suite'] = 'unstable'
76 apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv)
77 Options = cnf.SubTree('Override-Disparity::Options')
83 session = DBConn().session()
84 suite = Options['suite']
85 components = cnf.ValueList('Suite::%s::Components' % suite)
86 arches = set([x.arch_string for x in get_suite_architectures(suite)])
87 arches -= set(['source', 'all'])
89 for component in components:
90 temp_filename = utils.get_packages_from_ftp(cnf['Dir::Root'], suite, component, arch)
91 packages_file = utils.open_file(temp_filename)
92 Packages = apt_pkg.ParseTagFile(packages_file)
93 while Packages.Step():
94 package = Packages.Section.Find('Package')
95 dep_list = Packages.Section.Find('Depends')
96 if Options['package'] and package != Options['package']:
99 for d in apt_pkg.ParseDepends(dep_list):
101 if not depends.has_key(package):
102 depends[package] = set()
103 depends[package].add(i[0])
104 os.unlink(temp_filename)
107 query = """SELECT DISTINCT o.package, p.level, p.priority, m.name
109 JOIN suite s ON s.id = o.suite
110 JOIN priority p ON p.id = o.priority
111 JOIN binaries b ON b.package = o.package
112 JOIN maintainer m ON m.id = b.maintainer
113 JOIN bin_associations ba ON ba.bin = b.id
114 WHERE s.suite_name = '%s'
116 AND p.level <> 0""" % suite
117 packages = session.execute(query)
121 if Options.has_key('file'):
122 outfile = file(os.path.expanduser(Options['file']), 'w')
126 priorities[p[0]] = [p[1], p[2], p[3], True]
127 for d in sorted(depends.keys()):
129 if priorities.has_key(d) and priorities.has_key(p):
130 if priorities[d][0] < priorities[p][0]:
132 if not out.has_key(d):
134 out[d]['priority'] = priorities[d][1]
135 out[d]['maintainer'] = priorities[d][2]
136 out[d]['priority'] = priorities[d][1]
137 priorities[d][3] = False
138 if not out[d].has_key('dependency'):
139 out[d]['dependency'] = {}
140 out[d]['dependency'][p] = priorities[p][1]
141 yaml.dump(out, outfile, default_flow_style=False)
142 if Options.has_key('file'):
145 if __name__ == '__main__':