#!/usr/bin/env python import os,sys,portage,string # # This function should be smart enough to figure out what's going # to be deleted if we unmerge a package. This duplicates a lot # of things that are going on inside portage.py, and should probably # be contained there, but I'm not feeling up to hacking it right # now. # def checkdeletions(packageVersion): # We should really just use portage.dblink, but for now I'm just # going to do this instead. fileName = "/var/db/pkg/" + packageVersion + "/CONTENTS" try: df = open(fileName, "r") fileinfo = df.readlines() df.close() except IOError: print "That package doesn't exist." sys.exit() #packageArray = string.split(packageVersion, "/") #mydblink = portage.dblink(packageArray[0], packageArray[1], "/") #pkgfiles=mydblink.getcontents() #mykeys=pkgfiles.keys() #mykeys.sort() #mykeys.reverse() #print str(mykeys) #return deletedfiles=[] dirs=[] # Make a list of files that would get deleted, and a list of all the dirs. for line in fileinfo: line = line[:-1] lineinfo = string.split(line, " ") if (lineinfo[0] == "dir"): if (os.path.isdir(lineinfo[1])): dirs.append(lineinfo[1]) elif (lineinfo[0] == "obj"): if (os.path.exists(lineinfo[1])): try: statInfo = os.stat(lineinfo[1]) except OSError: print "Something's wrong with file " + lineinfo[1] continue if (str(statInfo.st_mtime) == lineinfo[3]): md5stream = os.popen("/usr/bin/md5sum " + lineinfo[1] + " 2>/dev/null", "r") md5line = md5stream.readline() md5stream.close() md5val = string.split(md5line, " ")[0] if (md5val == lineinfo[2]): print "File " + lineinfo[1] + " will get hosed." deletedfiles.append(lineinfo[1]) elif (lineinfo[0] == "sym"): if (os.path.islink(lineinfo[1])): if (os.readlink(lineinfo[1]) == lineinfo[3]): try: statInfo = os.lstat(lineinfo[1]) except OSError: print "Something's wrong with symlink " + lineinfo[1] continue if (str(statInfo.st_mtime) == lineinfo[4]): print "Symlink " + lineinfo[1] + " will get hosed." deletedfiles.append(lineinfo[1]) else: print "Unsupported type: " + lineinfo[0] # We should probably display directories here, too. # Now the meat of everything installcache = portage.db["/"]["vartree"] for package in installcache.getallnodes(): versions = installcache.getnode(package) if (len(versions) > 1): versions.sort() totalversions=[] totalblank=0 counter=0 for version in versions: counter = counter + 1 slot = installcache.getslot(version[0]) version.append(slot) version.append(counter) if (slot == ""): totalblank = totalblank + 1 print "------------------------" print print "Package " + package + " has multiple versions installed:" print donewithloop = 0 unmergelist = [] while (not donewithloop): for version in versions: print " " + str(version[3]) + ") " + version[0] + " has a SLOT of '" + version[2] + "'" print for version in versions: if (version[2] == ""): unmergelist.append(version) if (len(unmergelist) > 0): print "Here's what we'd like to unmerge:" print for unmerge in unmergelist: print " * " + unmerge[0] print else: print "Currently nothing is marked for unmerging." print sys.stdout.write("Do the unmerge [(N)o/(y)es/(m)odify/(d)ependencies/(f)iles/(q)uit]? ") dounmerge = sys.stdin.readline() response = dounmerge[0].lower() print if (response == "m"): numlist = " " for unmerge in unmergelist: numlist = numlist + str(unmerge[3]) + " " numlist = numlist[1:-1] print "Type the numbers of the versions you want to unmerge, seperated" sys.stdout.write("by spaces: [" + numlist + "]: ") newnumlist = sys.stdin.readline() newnumlist = newnumlist[:-1] if (len(newnumlist) > 0): newnums = string.split(newnumlist) unmergelist = [] for version in versions: if (str(version[3]) in newnums): unmergelist.append(version) print elif (response == "y"): if (len(unmergelist) == 0): print "First select some versions to unmerge, by pressing 'm'" print else: print "First we'll check emerge --pretend to make sure things are kosher . . ." print tounmerge = "" for unmerge in unmergelist: tounmerge = tounmerge + unmerge[0] + " " os.system("emerge --pretend unmerge " + tounmerge) print sys.stdout.write("Still do the unmerge [N/y/q]? ") dounmerge = sys.stdin.readline() print if (dounmerge[0].lower() == "y"): print "Okay, here we go." os.system("emerge unmerge " + tounmerge) donewithloop = 1 elif (dounmerge[0].lower() == "q"): sys.exit() else: print "Maybe next time, then." elif (response == "d"): if (len(unmergelist) == 0): print "First select some versions to unmerge, by pressing 'm'" print else: for unmerge in unmergelist: os.system("qpkg -q " + unmerge[0]) print elif (response == "f"): if (len(unmergelist) == 0): print "First select some versions to unmerge, by pressing 'm'" print else: for unmerge in unmergelist: print "Package " + unmerge[0] + ":" checkdeletions(unmerge[0]) print elif (response == "q"): sys.exit() else: print "We'll skip that one for now, then." donewithloop = 1 print # The End