X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fcruft_report.py;h=6837ebf7cd2c8e22f82c32a0cd2b7c6408a7a5b7;hb=31c4eeed28e2e6dd1a789075c248488ce5b90983;hp=803a77527a48562c70d41e17a62ec6d6c424ac35;hpb=30413cf0ff7bc21b8d2b8b4346406357fe55dc19;p=dak.git diff --git a/dak/cruft_report.py b/dak/cruft_report.py index 803a7752..6837ebf7 100755 --- a/dak/cruft_report.py +++ b/dak/cruft_report.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # Check for obsolete binary packages -# Copyright (C) 2000, 2001, 2002, 2003, 2004 James Troup -# $Id: rene,v 1.23 2005-04-16 09:19:20 rmurray Exp $ +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 James Troup # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -24,18 +23,20 @@ # you might as well write some letters to God about how unfair entropy # is while you're at it.'' -- 20020802143104.GA5628@azure.humbug.org.au -## TODO: fix NBS looping for version, implement Dubious NBS, fix up output of duplicate source package stuff, improve experimental ?, add support for non-US ?, add overrides, avoid ANAIS for duplicated packages +## TODO: fix NBS looping for version, implement Dubious NBS, fix up output of duplicate source package stuff, improve experimental ?, add overrides, avoid ANAIS for duplicated packages ################################################################################ -import commands, pg, os, string, sys, time -import utils, db_access +import commands, pg, os, sys, time import apt_pkg +from daklib import database +from daklib import utils ################################################################################ Cnf = None projectB = None +suite = "unstable" # Default suite_id = None no_longer_in_suite = {}; # Really should be static to add_nbs, but I'm lazy @@ -45,7 +46,7 @@ source_versions = {} ################################################################################ def usage(exit_code=0): - print """Usage: rene + print """Usage: dak cruft-report Check for obsolete or duplicated packages. -h, --help show this help and exit. @@ -116,7 +117,7 @@ def do_anais(architecture, binaries_list, source): ################################################################################ def do_nviu(): - experimental_id = db_access.get_suite_id("experimental") + experimental_id = database.get_suite_id("experimental") if experimental_id == -1: return # Check for packages in experimental obsoleted by versions in unstable @@ -126,20 +127,20 @@ SELECT s.source, s.version AS experimental, s2.version AS unstable WHERE sa.suite = %s AND sa2.suite = %d AND sa.source = s.id AND sa2.source = s2.id AND s.source = s2.source AND versioncmp(s.version, s2.version) < 0""" % (experimental_id, - db_access.get_suite_id("unstable"))) + database.get_suite_id("unstable"))) ql = q.getresult() if ql: nviu_to_remove = [] print "Newer version in unstable" print "-------------------------" - print + print for i in ql: (source, experimental_version, unstable_version) = i print " o %s (%s, %s)" % (source, experimental_version, unstable_version) nviu_to_remove.append(source) print print "Suggested command:" - print " melanie -m \"[rene] NVIU\" -s experimental %s" % (" ".join(nviu_to_remove)) + print " dak rm -m \"[auto-cruft] NVIU\" -s experimental %s" % (" ".join(nviu_to_remove)) print ################################################################################ @@ -171,7 +172,7 @@ def do_nbs(real_nbs): print output print "Suggested command:" - print " melanie -m \"[rene] NBS\" -b %s" % (" ".join(nbs_to_remove)) + print " dak rm -m \"[auto-cruft] NBS\" -s %s -b %s" % (suite, " ".join(nbs_to_remove)) print ################################################################################ @@ -179,7 +180,7 @@ def do_nbs(real_nbs): def do_dubious_nbs(dubious_nbs): print "Dubious NBS" print "-----------" - print + print dubious_nbs_keys = dubious_nbs.keys() dubious_nbs_keys.sort() @@ -195,22 +196,21 @@ def do_dubious_nbs(dubious_nbs): packages.sort() print " o %s: %s" % (version, ", ".join(packages)) - print + print ################################################################################ def do_obsolete_source(duplicate_bins, bin2source): obsolete = {} for key in duplicate_bins.keys(): - (source_a, source_b) = key.split('~') + (source_a, source_b) = key.split('_') for source in [ source_a, source_b ]: if not obsolete.has_key(source): if not source_binaries.has_key(source): # Source has already been removed continue else: - obsolete[source] = map(string.strip, - source_binaries[source].split(',')) + obsolete[source] = [ i.strip() for i in source_binaries[source].split(',') ] for binary in duplicate_bins[key]: if bin2source.has_key(binary) and bin2source[binary]["source"] == source: continue @@ -226,7 +226,7 @@ def do_obsolete_source(duplicate_bins, bin2source): if not obsolete[source]: to_remove.append(source) output += " * %s (%s)\n" % (source, source_versions[source]) - for binary in map(string.strip, source_binaries[source].split(',')): + for binary in [ i.strip() for i in source_binaries[source].split(',') ]: if bin2source.has_key(binary): output += " o %s (%s) is built by %s.\n" \ % (binary, bin2source[binary]["version"], @@ -239,32 +239,46 @@ def do_obsolete_source(duplicate_bins, bin2source): print output print "Suggested command:" - print " melanie -S -p -m \"[rene] obsolete source package\" %s" % (" ".join(to_remove)) + print " dak rm -S -p -m \"[auto-cruft] obsolete source package\" %s" % (" ".join(to_remove)) print +def get_suite_binaries(): + # Initalize a large hash table of all binary packages + binaries = {} + before = time.time() + + sys.stderr.write("[Getting a list of binary packages in %s..." % (suite)) + q = projectB.query("SELECT distinct b.package FROM binaries b, bin_associations ba WHERE ba.suite = %s AND ba.bin = b.id" % (suite_id)) + ql = q.getresult() + sys.stderr.write("done. (%d seconds)]\n" % (int(time.time()-before))) + for i in ql: + binaries[i[0]] = "" + + return binaries + ################################################################################ def main (): - global Cnf, projectB, suite_id, source_binaries, source_versions + global Cnf, projectB, suite, suite_id, source_binaries, source_versions Cnf = utils.get_conf() - Arguments = [('h',"help","Rene::Options::Help"), - ('m',"mode","Rene::Options::Mode", "HasArg"), - ('s',"suite","Rene::Options::Suite","HasArg")] + Arguments = [('h',"help","Cruft-Report::Options::Help"), + ('m',"mode","Cruft-Report::Options::Mode", "HasArg"), + ('s',"suite","Cruft-Report::Options::Suite","HasArg")] for i in [ "help" ]: - if not Cnf.has_key("Rene::Options::%s" % (i)): - Cnf["Rene::Options::%s" % (i)] = "" - Cnf["Rene::Options::Suite"] = Cnf["Dinstall::DefaultSuite"] + if not Cnf.has_key("Cruft-Report::Options::%s" % (i)): + Cnf["Cruft-Report::Options::%s" % (i)] = "" + Cnf["Cruft-Report::Options::Suite"] = Cnf["Dinstall::DefaultSuite"] - if not Cnf.has_key("Rene::Options::Mode"): - Cnf["Rene::Options::Mode"] = "daily" + if not Cnf.has_key("Cruft-Report::Options::Mode"): + Cnf["Cruft-Report::Options::Mode"] = "daily" apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv) - Options = Cnf.SubTree("Rene::Options") + Options = Cnf.SubTree("Cruft-Report::Options") if Options["Help"]: - usage() + usage() # Set up checks based on mode if Options["Mode"] == "daily": @@ -276,7 +290,7 @@ def main (): usage(1) projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"])) - db_access.init(Cnf, projectB) + database.init(Cnf, projectB) bin_pkgs = {} src_pkgs = {} @@ -289,19 +303,12 @@ def main (): duplicate_bins = {} suite = Options["Suite"] - suite_id = db_access.get_suite_id(suite) + suite_id = database.get_suite_id(suite) bin_not_built = {} if "bnb" in checks: - # Initalize a large hash table of all binary packages - before = time.time() - sys.stderr.write("[Getting a list of binary packages in %s..." % (suite)) - q = projectB.query("SELECT distinct b.package FROM binaries b, bin_associations ba WHERE ba.suite = %s AND ba.bin = b.id" % (suite_id)) - ql = q.getresult() - sys.stderr.write("done. (%d seconds)]\n" % (int(time.time()-before))) - for i in ql: - bins_in_suite[i[0]] = "" + bins_in_suite = get_suite_binaries() # Checks based on the Sources files components = Cnf.ValueList("Suite::%s::Components" % (suite)) @@ -320,7 +327,7 @@ def main (): source_version = Sources.Section.Find('Version') architecture = Sources.Section.Find('Architecture') binaries = Sources.Section.Find('Binary') - binaries_list = map(string.strip, binaries.split(',')) + binaries_list = [ i.strip() for i in binaries.split(',') ] if "bnb" in checks: # Check for binaries not built on any architecture. @@ -341,7 +348,7 @@ def main (): if bin_pkgs.has_key(binary): key_list = [ source, bin_pkgs[binary] ] key_list.sort() - key = '~'.join(key_list) + key = '_'.join(key_list) duplicate_bins.setdefault(key, []) duplicate_bins[key].append(binary) bin_pkgs[binary] = source @@ -352,7 +359,10 @@ def main (): os.unlink(temp_filename) # Checks based on the Packages files - for component in components + ['main/debian-installer']: + check_components = components[:] + if suite != "experimental": + check_components.append('main/debian-installer'); + for component in check_components: architectures = filter(utils.real_arch, Cnf.ValueList("Suite::%s::Architectures" % (suite))) for architecture in architectures: filename = "%s/dists/%s/%s/binary-%s/Packages.gz" % (Cnf["Dir::Root"], suite, component, architecture) @@ -391,13 +401,13 @@ def main (): if previous_source != source: key_list = [ source, previous_source ] key_list.sort() - key = '~'.join(key_list) + key = '_'.join(key_list) duplicate_bins.setdefault(key, []) if package not in duplicate_bins[key]: duplicate_bins[key].append(package) packages.close() os.unlink(temp_filename) - + if "obsolete source" in checks: do_obsolete_source(duplicate_bins, bin2source) @@ -437,24 +447,24 @@ def main (): binaries = bin_not_built[source].keys() binaries.sort() print " o %s: %s" % (source, ", ".join(binaries)) - print + print if "bms" in checks: print "Built from multiple source packages" print "-----------------------------------" - print + print keys = duplicate_bins.keys() keys.sort() for key in keys: - (source_a, source_b) = key.split("~") + (source_a, source_b) = key.split("_") print " o %s & %s => %s" % (source_a, source_b, ", ".join(duplicate_bins[key])) - print + print if "anais" in checks: print "Architecture Not Allowed In Source" print "----------------------------------" print anais_output - print + print if "dubious nbs" in checks: do_dubious_nbs(dubious_nbs)