Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10184 - in main/trunk/pym: _emerge portage
Date: Sun, 04 May 2008 19:41:57
Message-Id: E1Jsk5q-000590-1W@stork.gentoo.org
1 Author: zmedico
2 Date: 2008-05-04 19:41:52 +0000 (Sun, 04 May 2008)
3 New Revision: 10184
4
5 Modified:
6 main/trunk/pym/_emerge/__init__.py
7 main/trunk/pym/portage/const.py
8 Log:
9 In the package uninstall sanity check, use RDEPEND from the currently
10 running 'sys-apps/portage' instance to create a set of protected atoms.
11
12
13 Modified: main/trunk/pym/_emerge/__init__.py
14 ===================================================================
15 --- main/trunk/pym/_emerge/__init__.py 2008-05-04 14:35:06 UTC (rev 10183)
16 +++ main/trunk/pym/_emerge/__init__.py 2008-05-04 19:41:52 UTC (rev 10184)
17 @@ -3489,19 +3489,43 @@
18 node.operation != "uninstall"]
19
20 # sys-apps/portage needs special treatment if ROOT="/"
21 - portage_python_dep = ">=dev-lang/python-2.4"
22 - portage_unslotted_deps = frozenset(
23 - ["app-shells/bash", "sys-apps/portage"])
24 - portage_node = self.mydbapi["/"].match_pkgs("sys-apps/portage")
25 - if portage_node:
26 - portage_node = portage_node[0]
27 + running_root = "/"
28 + from portage.const import PORTAGE_PACKAGE_ATOM
29 + runtime_deps = InternalPackageSet(
30 + initial_atoms=[PORTAGE_PACKAGE_ATOM])
31 + running_portage = self.trees[running_root]["vartree"].dbapi.match_pkgs(
32 + PORTAGE_PACKAGE_ATOM)
33 + replacement_portage = self.mydbapi[running_root].match_pkgs(
34 + PORTAGE_PACKAGE_ATOM)
35 +
36 + if running_portage:
37 + running_portage = running_portage[0]
38 else:
39 - portage_node = None
40 - if portage_node is not None and \
41 - (not mygraph.contains(portage_node) or \
42 - portage_node.operation == "nomerge"):
43 - portage_node = None
44 + running_portage = None
45
46 + if replacement_portage:
47 + replacement_portage = replacement_portage[0]
48 + else:
49 + replacement_portage = None
50 +
51 + if replacement_portage == running_portage:
52 + replacement_portage = None
53 +
54 + if running_portage is not None:
55 + try:
56 + portage_rdepend = self._select_atoms_highest_available(
57 + running_root, running_portage.metadata["RDEPEND"],
58 + myuse=running_portage.metadata["USE"].split(),
59 + parent=running_portage, strict=False)
60 + except portage.exception.InvalidDependString, e:
61 + portage.writemsg("!!! Invalid RDEPEND in " + \
62 + "'%svar/db/pkg/%s/RDEPEND': %s\n" % \
63 + (running_root, running_portage.cpv, e), noiselevel=-1)
64 + del e
65 + portage_rdepend = []
66 + runtime_deps.update(atom for atom in portage_rdepend \
67 + if not atom.startswith("!"))
68 +
69 ignore_priority_soft_range = [None]
70 ignore_priority_soft_range.extend(
71 xrange(DepPriority.MIN, DepPriority.MEDIUM_SOFT + 1))
72 @@ -3584,7 +3608,8 @@
73 return True
74 if node not in mergeable_nodes:
75 return False
76 - if node == portage_node and mygraph.child_nodes(node,
77 + if node == replacement_portage and \
78 + mygraph.child_nodes(node,
79 ignore_priority=DepPriority.MEDIUM_SOFT):
80 # Make sure that portage always has all of it's
81 # RDEPENDs installed first.
82 @@ -3679,20 +3704,26 @@
83 if self.digraph.contains(inst_pkg):
84 continue
85
86 - if "/" == task.root:
87 + if running_root == task.root:
88 # Never uninstall sys-apps/portage or it's essential
89 # dependencies, except through replacement.
90 - if task.cp in portage_unslotted_deps:
91 + try:
92 + runtime_dep_atoms = \
93 + list(runtime_deps.iterAtomsForPackage(task))
94 + except portage.exception.InvalidDependString, e:
95 + portage.writemsg("!!! Invalid PROVIDE in " + \
96 + "'%svar/db/pkg/%s/PROVIDE': %s\n" % \
97 + (task.root, task.cpv, e), noiselevel=-1)
98 + del e
99 continue
100
101 - # Don't uninstall python if it appears to be
102 - # the only suitable one installed.
103 - if task.cp == "dev-lang/python" and \
104 - portage.match_from_list(
105 - portage_python_dep, [task.cpv_slot]):
106 - vardb = root_config.trees["vartree"].dbapi
107 + # Don't uninstall a runtime dep if it appears
108 + # to be the only suitable one installed.
109 + skip = False
110 + vardb = root_config.trees["vartree"].dbapi
111 + for atom in runtime_dep_atoms:
112 other_version = None
113 - for pkg in vardb.match_pkgs(portage_python_dep):
114 + for pkg in vardb.match_pkgs(atom):
115 if pkg.cpv == task.cpv and \
116 pkg.metadata["COUNTER"] == \
117 task.metadata["COUNTER"]:
118 @@ -3700,7 +3731,10 @@
119 other_version = pkg
120 break
121 if other_version is None:
122 - continue
123 + skip = True
124 + break
125 + if skip:
126 + continue
127
128 # For packages in the system set, don't take
129 # any chances. If the conflict can't be resolved
130
131 Modified: main/trunk/pym/portage/const.py
132 ===================================================================
133 --- main/trunk/pym/portage/const.py 2008-05-04 14:35:06 UTC (rev 10183)
134 +++ main/trunk/pym/portage/const.py 2008-05-04 19:41:52 UTC (rev 10184)
135 @@ -24,6 +24,7 @@
136 PORTAGE_BASE_PATH = os.path.join(os.sep, os.sep.join(__file__.split(os.sep)[:-3]))
137 PORTAGE_BIN_PATH = PORTAGE_BASE_PATH+"/bin"
138 PORTAGE_PYM_PATH = PORTAGE_BASE_PATH+"/pym"
139 +PORTAGE_PACKAGE_ATOM = "sys-apps/portage"
140 NEWS_LIB_PATH = "/var/lib/gentoo"
141 PROFILE_PATH = "/etc/make.profile"
142 LOCALE_DATA_PATH = PORTAGE_BASE_PATH+"/locale"
143
144 --
145 gentoo-commits@l.g.o mailing list