This patch adds a depsafeunmerge feature that makes portage error out if we try to unmerge a package that is currently needed by other installed packages. --- emerge.orig 2004-11-29 09:41:28.000000000 +0100 +++ emerge 2004-12-04 01:13:56.599578783 +0100 @@ -16,7 +16,7 @@ import portage_util import portage_locks import portage_exception - +import portage_dep spinner_msgs = ["Gentoo Rocks ("+os.uname()[0]+")", "Thank you for using Gentoo. :)", @@ -2041,6 +2041,22 @@ pkgmap={} numselected=0 + vardeps={} + if "depsafeunmerge" in portage.features: + for x in portage.db["/"]["vartree"].dbapi.cpv_all(): + vals=portage.db["/"]["vartree"].dbapi.aux_get(x, ["USE", "RDEPEND", "PDEPEND", "CDEPEND"]) + use=vals[0].split() + for deps in vals[1:]: + deps=portage_dep.paren_reduce(deps) + deps=portage_dep.use_reduce(deps, use) + deps=portage.flatten(deps) + for y in deps: + if y[0]=="!" or y=="||": + continue + for z in portage.db["/"]["vartree"].dbapi.match(y): + if not vardeps.has_key(z): + vardeps[z]=[] + vardeps[z].append(x) for x in candidate_catpkgs: #cycle through all our candidate deps and determine what will and will not get unmerged try: @@ -2102,6 +2118,18 @@ pkgmap[mykey]["selected"].append(slotmap[myslot][ckey]) numselected=numselected+1 #ok, now the last-merged package is protected, and the rest are selected + if "depsafeunmerge" in portage.features: + breakloop=False + while not breakloop: + breakloop=True + for x in pkgmap.keys(): + for y in pkgmap[x]["selected"]: + if vardeps.has_key(y): + for z in vardeps[y]: + if pkgmap.has_key(portage.dep_getkey(z)): + if z in pkgmap[portage.dep_getkey(z)]["selected"]: + breakloop=False + vardeps[y].remove(z) if global_unmerge and not numselected: print "\n>>> No outdated packages were found on your system.\n" return 0 @@ -2110,6 +2138,7 @@ print "\n>>>",unmerge_action+": No packages selected for removal.\n" return 0 + unsafe=False for x in pkgmap.keys(): for y in localtree.dep_match(x): if y not in pkgmap[x]["omitted"] and \ @@ -2136,6 +2165,12 @@ else: print "none", print + if "depsafeunmerge" in portage.features and not pkgmap[x]["protected"]: + for y in pkgmap[x]["selected"]: + if vardeps.has_key(y) and len(vardeps[y]) > 0: + print red("\nUnmerging '%s' would potentially break the dependencies of the following packages:" % y) + print red(", ".join(vardeps[y])) + unsafe=True print "\n>>>",red("'Selected'"),"packages are slated for removal." print ">>>",green("'Protected'"),"and",green("'omitted'"),"packages will not be removed.\n" @@ -2143,6 +2178,11 @@ if "--pretend" in myopts: #we're done... return return 0 + if unsafe: + myopts+=["--pretend"] + print "The packages you want me to unmerge would potentially break dependencies. Quitting." + print + return 0 if "--ask" in myopts: if userquery("Do you want me to unmerge these packages?")=="No": # enter pretend mode for correct formatting of results