From: Luca Falavigna Date: Sun, 8 Jul 2012 00:07:11 +0000 (+0000) Subject: Use check_reverse_depends function from utils X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=13a234f688c83e2e57e1187386b248b5fd798940;p=dak.git Use check_reverse_depends function from utils Signed-off-by: Luca Falavigna --- diff --git a/dak/rm.py b/dak/rm.py index c2c1c62c..b59c0220 100755 --- a/dak/rm.py +++ b/dak/rm.py @@ -51,7 +51,7 @@ from daklib.config import Config from daklib.dbconn import * from daklib import utils from daklib.dak_exceptions import * -from daklib.regexes import re_strip_source_version, re_build_dep_arch, re_bin_only_nmu +from daklib.regexes import re_strip_source_version, re_bin_only_nmu import debianbts as bts ################################################################################ @@ -99,159 +99,8 @@ def game_over(): ################################################################################ def reverse_depends_check(removals, suite, arches=None, session=None): - dbsuite = get_suite(suite, session) - cnf = Config() - print "Checking reverse dependencies..." - dep_problem = 0 - p2c = {} - all_broken = {} - if arches: - all_arches = set(arches) - else: - all_arches = set([x.arch_string for x in get_suite_architectures(suite)]) - all_arches -= set(["source", "all"]) - metakey_d = get_or_set_metadatakey("Depends", session) - metakey_p = get_or_set_metadatakey("Provides", session) - params = { - 'suite_id': dbsuite.suite_id, - 'metakey_d_id': metakey_d.key_id, - 'metakey_p_id': metakey_p.key_id, - } - for architecture in all_arches | set(['all']): - deps = {} - sources = {} - virtual_packages = {} - params['arch_id'] = get_architecture(architecture, session).arch_id - - statement = ''' - SELECT b.id, b.package, s.source, c.name as component, - (SELECT bmd.value FROM binaries_metadata bmd WHERE bmd.bin_id = b.id AND bmd.key_id = :metakey_d_id) AS depends, - (SELECT bmp.value FROM binaries_metadata bmp WHERE bmp.bin_id = b.id AND bmp.key_id = :metakey_p_id) AS provides - FROM binaries b - JOIN bin_associations ba ON b.id = ba.bin AND ba.suite = :suite_id - JOIN source s ON b.source = s.id - JOIN files f ON b.file = f.id - JOIN location l ON f.location = l.id - JOIN component c ON l.component = c.id - WHERE b.architecture = :arch_id''' - query = session.query('id', 'package', 'source', 'component', 'depends', 'provides'). \ - from_statement(statement).params(params) - for binary_id, package, source, component, depends, provides in query: - sources[package] = source - p2c[package] = component - if depends is not None: - deps[package] = depends - # Maintain a counter for each virtual package. If a - # Provides: exists, set the counter to 0 and count all - # provides by a package not in the list for removal. - # If the counter stays 0 at the end, we know that only - # the to-be-removed packages provided this virtual - # package. - if provides is not None: - for virtual_pkg in provides.split(","): - virtual_pkg = virtual_pkg.strip() - if virtual_pkg == package: continue - if not virtual_packages.has_key(virtual_pkg): - virtual_packages[virtual_pkg] = 0 - if package not in removals: - virtual_packages[virtual_pkg] += 1 - - # If a virtual package is only provided by the to-be-removed - # packages, treat the virtual package as to-be-removed too. - for virtual_pkg in virtual_packages.keys(): - if virtual_packages[virtual_pkg] == 0: - removals.append(virtual_pkg) - - # Check binary dependencies (Depends) - for package in deps.keys(): - if package in removals: continue - parsed_dep = [] - try: - parsed_dep += apt_pkg.ParseDepends(deps[package]) - except ValueError as e: - print "Error for package %s: %s" % (package, e) - for dep in parsed_dep: - # Check for partial breakage. If a package has a ORed - # dependency, there is only a dependency problem if all - # packages in the ORed depends will be removed. - unsat = 0 - for dep_package, _, _ in dep: - if dep_package in removals: - unsat += 1 - if unsat == len(dep): - component = p2c[package] - source = sources[package] - if component != "main": - source = "%s/%s" % (source, component) - all_broken.setdefault(source, {}).setdefault(package, set()).add(architecture) - dep_problem = 1 - - if all_broken: - print "# Broken Depends:" - for source, bindict in sorted(all_broken.items()): - lines = [] - for binary, arches in sorted(bindict.items()): - if arches == all_arches or 'all' in arches: - lines.append(binary) - else: - lines.append('%s [%s]' % (binary, ' '.join(sorted(arches)))) - print '%s: %s' % (source, lines[0]) - for line in lines[1:]: - print ' ' * (len(source) + 2) + line - print - - # Check source dependencies (Build-Depends and Build-Depends-Indep) - all_broken.clear() - metakey_bd = get_or_set_metadatakey("Build-Depends", session) - metakey_bdi = get_or_set_metadatakey("Build-Depends-Indep", session) - params = { - 'suite_id': dbsuite.suite_id, - 'metakey_ids': (metakey_bd.key_id, metakey_bdi.key_id), - } - statement = ''' - SELECT s.id, s.source, string_agg(sm.value, ', ') as build_dep - FROM source s - JOIN source_metadata sm ON s.id = sm.src_id - WHERE s.id in - (SELECT source FROM src_associations - WHERE suite = :suite_id) - AND sm.key_id in :metakey_ids - GROUP BY s.id, s.source''' - query = session.query('id', 'source', 'build_dep').from_statement(statement). \ - params(params) - for source_id, source, build_dep in query: - if source in removals: continue - parsed_dep = [] - if build_dep is not None: - # Remove [arch] information since we want to see breakage on all arches - build_dep = re_build_dep_arch.sub("", build_dep) - try: - parsed_dep += apt_pkg.ParseDepends(build_dep) - except ValueError as e: - print "Error for source %s: %s" % (source, e) - for dep in parsed_dep: - unsat = 0 - for dep_package, _, _ in dep: - if dep_package in removals: - unsat += 1 - if unsat == len(dep): - component = DBSource.get(source_id, session).get_component_name() - if component != "main": - source = "%s/%s" % (source, component) - all_broken.setdefault(source, set()).add(utils.pp_deps(dep)) - dep_problem = 1 - - if all_broken: - print "# Broken Build-Depends:" - for source, bdeps in sorted(all_broken.items()): - bdeps = sorted(bdeps) - print '%s: %s' % (source, bdeps[0]) - for bdep in bdeps[1:]: - print ' ' * (len(source) + 2) + bdep - print - - if dep_problem: + if utils.check_reverse_depends(removals, suite, arches, session): print "Dependency problem found." if not Options["No-Action"]: game_over()