#!/usr/bin/python -tt # remove requested pkg and any pkg which it (and only it depends on) # for each pkg in remove state # traverse their requirements # if the installed pkg they require is not required by anything that's not already in the # transaction set marked as 'remove' then mark them for removal. import yum from yum.constants import * import yum.misc import sys __requires_cache = {} def requires_this_package(rpmsack, pkg): if __requires_cache.has_key(pkg): return __requires_cache[pkg] requirers = {} for prov in pkg.provides: for req_pkg in rpmsack.getRequires(prov[0], prov[1], prov[2]): if req_pkg == pkg: continue requirers[req_pkg.pkgtup] = 1 for prov in pkg.filelist + pkg.dirlist + pkg.ghostlist: for req_pkg in rpmsack.getRequires(prov): if req_pkg == pkg: continue requirers[req_pkg.pkgtup] = 1 __requires_cache[pkg] = requirers.keys() return requirers.keys() remove_pkg = sys.argv[1] ignore_list = ['glibc', 'bash', 'kernel', 'libgcc'] my = yum.YumBase() print 'remove %s' % remove_pkg my.remove(pattern=remove_pkg) oldlen = 0 while oldlen != len(my.tsInfo): oldlen = len(my.tsInfo) for txmbr in my.tsInfo.getMembersWithState(output_states=TS_REMOVE_STATES): for req in txmbr.po.requires: if req[0].startswith('rpmlib('): continue for pkg in my.rpmdb.getProvides(req[0], req[1], req[2]): if pkg.pkgtup in [ txmbr.po.pkgtup for txmbr in my.tsInfo.getMembersWithState(output_states=TS_REMOVE_STATES) ]: continue # skip ones already marked for remove, kinda pointless if pkg.name in ignore_list: # there are some pkgs which are NEVER going to be leafremovals continue non_removed_requires = [] for req_pkgtup in requires_this_package(my.rpmdb, pkg): pkgtups = [ txmbr.po.pkgtup for txmbr in my.tsInfo.getMembersWithState(output_states=TS_REMOVE_STATES) ] if req_pkgtup not in pkgtups: non_removed_requires.append(req_pkgtup) if not non_removed_requires: print 'removing %s b/c it is not required by anything else' % pkg my.remove(pkg) my.buildTransaction() #my.processTransaction() for pkg in my.tsInfo: print pkg