]> git.decadent.org.uk Git - dak.git/blobdiff - dak/override_disparity.py
Merge remote-tracking branch 'nthykier/auto-decruft'
[dak.git] / dak / override_disparity.py
index 94e1e9e8b0222863fe0db36d6f6436eff2931b75..413dcaabfbfcca0cddc1ac2074711744b24b3371 100755 (executable)
@@ -37,6 +37,7 @@ Generate a list of override disparities
 import os
 import sys
 import apt_pkg
+import yaml
 
 from daklib.config import Config
 from daklib.dbconn import *
@@ -48,11 +49,12 @@ def usage (exit_code=0):
     print """Generate a list of override disparities
 
        Usage:
-       dak override-disparity [ -p <package> ] [ -s <suite> ]
+       dak override-disparity [-f <file>] [ -p <package> ] [ -s <suite> ]
 
 Options:
 
   -h, --help                show this help and exit
+  -f, --file                store output into given file
   -p, --package             limit check on given package only
   -s, --suite               choose suite to look for (default: unstable)"""
 
@@ -61,6 +63,7 @@ Options:
 def main():
     cnf = Config()
     Arguments = [('h','help','Override-Disparity::Options::Help'),
+                 ('f','file','Override-Disparity::Options::File','HasArg'),
                  ('s','suite','Override-Disparity::Options::Suite','HasArg'),
                  ('p','package','Override-Disparity::Options::Package','HasArg')]
 
@@ -70,35 +73,35 @@ def main():
     if not cnf.has_key('Override-Disparity::Options::Suite'):
         cnf['Override-Disparity::Options::Suite'] = 'unstable'
 
-    apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv)
-    Options = cnf.SubTree('Override-Disparity::Options')
+    apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
+    Options = cnf.subtree('Override-Disparity::Options')
 
     if Options['help']:
         usage()
 
     depends = {}
     session = DBConn().session()
-    suite = Options['suite']
-    components = cnf.ValueList('Suite::%s::Components' % suite)
-    arches = set([x.arch_string for x in get_suite_architectures(suite)])
+    suite_name = Options['suite']
+    suite = get_suite(suite_name, session)
+    if suite is None:
+        utils.fubar("Unknown suite '{0}'".format(suite_name))
+    components = get_component_names(session)
+    arches = set([x.arch_string for x in get_suite_architectures(suite_name)])
     arches -= set(['source', 'all'])
     for arch in arches:
         for component in components:
-            temp_filename = utils.get_packages_from_ftp(cnf['Dir::Root'], suite, component, arch)
-            packages_file = utils.open_file(temp_filename)
-            Packages = apt_pkg.ParseTagFile(packages_file)
-            while Packages.Step():
-                package = Packages.Section.Find('Package')
-                dep_list = Packages.Section.Find('Depends')
+            Packages = utils.get_packages_from_ftp(suite.archive.path, suite_name, component, arch)
+            while Packages.step():
+                package = Packages.section.find('Package')
+                dep_list = Packages.section.find('Depends')
                 if Options['package'] and package != Options['package']:
                     continue
                 if dep_list:
-                    for d in apt_pkg.ParseDepends(dep_list):
+                    for d in apt_pkg.parse_depends(dep_list):
                         for i in d:
                             if not depends.has_key(package):
                                 depends[package] = set()
                             depends[package].add(i[0])
-            os.unlink(temp_filename)
 
     priorities = {}
     query = """SELECT DISTINCT o.package, p.level, p.priority, m.name
@@ -110,10 +113,14 @@ def main():
                JOIN bin_associations ba ON ba.bin = b.id
                WHERE s.suite_name = '%s'
                AND ba.suite = s.id
-               AND p.level <> 0""" % suite
+               AND p.level <> 0""" % suite_name
     packages = session.execute(query)
-    session.commit()
 
+    out = {}
+    if Options.has_key('file'):
+        outfile = file(os.path.expanduser(Options['file']), 'w')
+    else:
+        outfile = sys.stdout
     for p in packages:
         priorities[p[0]] = [p[1], p[2], p[3], True]
     for d in sorted(depends.keys()):
@@ -121,13 +128,18 @@ def main():
             if priorities.has_key(d) and priorities.has_key(p):
                 if priorities[d][0] < priorities[p][0]:
                      if priorities[d][3]:
-                         print 'Package: ' + d
-                         print ' Priority: ' + priorities[d][1]
-                         print ' Maintainer: ' + priorities[d][2]
+                         if not out.has_key(d):
+                             out[d] = {}
+                         out[d]['priority'] = priorities[d][1]
+                         out[d]['maintainer'] = unicode(priorities[d][2], 'utf-8')
+                         out[d]['priority'] = priorities[d][1]
                          priorities[d][3] = False
-                     print ' Dependency: ' + p
-                     print '  Priority: ' + priorities[p][1]
-                     print '  Maintainer: ' + priorities[p][2]
+                     if not out[d].has_key('dependency'):
+                         out[d]['dependency'] = {}
+                     out[d]['dependency'][p] = priorities[p][1]
+    yaml.safe_dump(out, outfile, default_flow_style=False)
+    if Options.has_key('file'):
+        outfile.close()
 
 if __name__ == '__main__':
     main()