From e8b23dfae9b01466f034c1e3f9f8fa82e3ed46d8 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 4 May 2008 08:10:12 +0000 Subject: Similar to the sys-apps/portage protection, also add protection against inappropriately uninstalling either app-shells/bash or dev-lang/python. (trunk r10171) svn path=/main/branches/2.1.2/; revision=10172 --- bin/emerge | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'bin/emerge') diff --git a/bin/emerge b/bin/emerge index 75da6349c..808101b9c 100755 --- a/bin/emerge +++ b/bin/emerge @@ -3640,6 +3640,9 @@ class depgraph(object): node.operation != "uninstall"] # sys-apps/portage needs special treatment if ROOT="/" + portage_python_dep = ">=dev-lang/python-2.4" + portage_unslotted_deps = frozenset( + ["app-shells/bash", "sys-apps/portage"]) portage_node = self.mydbapi["/"].match_pkgs("sys-apps/portage") if portage_node: portage_node = portage_node[0] @@ -3828,10 +3831,28 @@ class depgraph(object): continue if "/" == task.root: - # Never uninstall sys-apps/portage - # except through replacement. - if "sys-apps/portage" == task.cp: + # Never uninstall sys-apps/portage or it's essential + # dependencies, except through replacement. + if task.cp in portage_unslotted_deps: continue + + # Don't uninstall python if it appears to be + # the only suitable one installed. + if task.cp == "dev-lang/python" and \ + portage.match_from_list( + portage_python_dep, [task.cpv_slot]): + vardb = root_config.trees["vartree"].dbapi + other_version = None + for pkg in vardb.match_pkgs(portage_python_dep): + if pkg.cpv == task.cpv and \ + pkg.metadata["COUNTER"] == \ + task.metadata["COUNTER"]: + continue + other_version = pkg + break + if other_version is None: + continue + # For packages in the system set, don't take # any chances. If the conflict can't be resolved # by a normal replacement operation then abort. -- cgit v1.2.3-1-g7c22