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()