Sample code using rpm-objects (Iterative Delete)

"Adam T. Gautier" <adam_gautier-/[email protected]> Tue, 23 Mar 2004 14:14:04 +0000 (UTC)
Newsgroups gmane.linux.redhat.rpm.python
Message-ID <[email protected]>
Below is the code I used to iterate and delete packages from the RPM 
database.  I have been hacking around with the code and this should 
work, I have used it, but should be seen as just an example.



#!/usr/bin/python -tt

from RPM import Callback
from RPM import RPMDatabase
from RPM import Header

headers = []
require_map_of_headers = {}
rpmdb = RPMDatabase(Callback())
rpmdb.init()
headers.extend(rpmdb.list())
# Map all headers by what they require
for header in headers:
    for require in header.getRequires():
        try: # Try to append header, require key may not exist
            require_map_of_headers[require].append(header)
        except KeyError: # Require key does not exist so create with list
            require_map_of_headers[require]=[header]

def removeHeader(header):
    ''' Removes all require map references for the given header'''
    # Loop through what header requires.  This is more efficent than
    # looping through the require map of headers
    for require in header.getRequires():
        # Get the list headers that require the same requirement of the
        # header given
        requires = require_map_of_headers[require]
        # Remove the header given
        requires.remove(header)
        print "Removed required ("+key+") dependancy of header("+\
              str(header.getName())+")"
        # If there are no more headers that need this requirement. remove
        # the requirement
        if(0==len(requires)):
                require_map_of_headers.remove(require)
                print "Remove requirement ("+require+\
                      ") that is not needed anymore"

def processHeader(header):
    input = raw_input("Remove package("+str(header.getName())+
                      "-"+str(header.getVersion())+"-"+
                      str(header.getRelease())+")\n ((y)es/[n]o/(i)nfo/"+
                      "(d)ependencies/(q)uit):")
    if("y"==input):
        rpmdb.erase(str(header.getName()))
        print "Removed package("+str(header.getName())+\
              "-"+str(header.getVersion())+"-"+\
              str(header.getRelease())+")"
        return 1
    elif("i"==input):
        print header
        return processHeader(header)
    elif("d"==input):
        print "Dependencies of header("+str(header.getName())+\
              "-"+str(header.getVersion())+"-"+\
              str(header.getRelease())+")"
        for provide in header.getProvides():
            try:
                requires = require_map_of_headers[provide]
                print provide+":"
                for require in requires:
                    print "\t"+str(require.getName())+"-"+\
                          str(require.getVersion())+"-"+\
                          str(require.getRelease())
            except KeyError:
                print provide+":"
        print "\n"
        return processHeader(header)
    elif("q"==input):
        return -1
    else:
        print "Keeping package("+str(header.getName())+\
              "-"+str(header.getVersion())+"-"+\
              str(header.getRelease())+")"
        return 0
    
total_headers = len(headers) # Count all headers
count_headers = 0.0 # Current count of headers
for header in headers: # Iterate headers
    count_headers += 1
    print "Processing headers ("+str(int(count_headers))+" of 
"+str(total_headers)+" ["+str((count_headers/total_headers)*100)+"%]):"
    if(-1==processHeader(header)): # Process header and break on quit
        break
rpmdb.close()