summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-05-04 08:06:58 +0000
committerZac Medico <zmedico@gentoo.org>2008-05-04 08:06:58 +0000
commitc405d6af0165badfaee45fd84c7695d73c7808a7 (patch)
tree9c22c8c9115834a0c14c612d30180f5b70161805 /pym
parent5ca20ab70b14710b605cc0f80048150e667a11eb (diff)
downloadportage-c405d6af0165badfaee45fd84c7695d73c7808a7.tar.gz
portage-c405d6af0165badfaee45fd84c7695d73c7808a7.tar.bz2
portage-c405d6af0165badfaee45fd84c7695d73c7808a7.zip
Similar to the sys-apps/portage protection, also add protection against
inappropriately uninstalling either app-shells/bash or dev-lang/python. svn path=/main/trunk/; revision=10171
Diffstat (limited to 'pym')
-rw-r--r--pym/_emerge/__init__.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py
index 0042a6072..e89f75ff6 100644
--- a/pym/_emerge/__init__.py
+++ b/pym/_emerge/__init__.py
@@ -3489,6 +3489,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]
@@ -3677,10 +3680,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.