Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r13686 - main/trunk/pym/_emerge
Date: Thu, 25 Jun 2009 00:33:50
Message-Id: E1MJcuR-0006Tx-LR@stork.gentoo.org
1 Author: zmedico
2 Date: 2009-06-25 00:33:47 +0000 (Thu, 25 Jun 2009)
3 New Revision: 13686
4
5 Modified:
6 main/trunk/pym/_emerge/Package.py
7 main/trunk/pym/_emerge/Scheduler.py
8 main/trunk/pym/_emerge/depgraph.py
9 Log:
10 * Make Package.metadata['USE'] access trigger USE calculation for unbuilt
11 ebuilds.
12 * Make Package.metadata['LICENSE'] access trigger USE conditional evaluation.
13 * Make Package.metadata['PROVIDE'] access trigger USE conditional evaluation.
14 * Initialize Package.metadata['CHOST'] in the Package constructor for
15 unbuilt ebuilds.
16
17
18 Modified: main/trunk/pym/_emerge/Package.py
19 ===================================================================
20 --- main/trunk/pym/_emerge/Package.py 2009-06-24 21:07:50 UTC (rev 13685)
21 +++ main/trunk/pym/_emerge/Package.py 2009-06-25 00:33:47 UTC (rev 13686)
22 @@ -10,7 +10,8 @@
23 import portage
24
25 from portage.cache.mappings import slot_dict_class
26 -
27 +from portage.dep import paren_reduce, use_reduce, \
28 + paren_normalize, paren_enclose
29 from _emerge.Task import Task
30
31 class Package(Task):
32 @@ -21,7 +22,8 @@
33 "root_config", "type_name",
34 "category", "counter", "cp", "cpv_split",
35 "inherited", "iuse", "mtime",
36 - "pf", "pv_split", "root", "slot", "slot_atom", "use")
37 + "pf", "pv_split", "root", "slot", "slot_atom",) + \
38 + ("_use",)
39
40 metadata_keys = [
41 "CHOST", "COUNTER", "DEPEND", "EAPI",
42 @@ -33,6 +35,8 @@
43 Task.__init__(self, **kwargs)
44 self.root = self.root_config.root
45 self.metadata = _PackageMetadataWrapper(self, self.metadata)
46 + if not self.built:
47 + self.metadata['CHOST'] = self.root_config.settings.get('CHOST', '')
48 self.cp = portage.cpv_getkey(self.cpv)
49 slot = self.slot
50 if not slot:
51 @@ -44,13 +48,19 @@
52 self.cpv_split = portage.catpkgsplit(self.cpv)
53 self.pv_split = self.cpv_split[1:]
54
55 - class _use(object):
56 + class _use_class(object):
57
58 __slots__ = ("__weakref__", "enabled")
59
60 def __init__(self, use):
61 self.enabled = frozenset(use)
62
63 + @property
64 + def use(self):
65 + if self._use is None:
66 + self._use = self._use_class(self.metadata['USE'].split())
67 + return self._use
68 +
69 class _iuse(object):
70
71 __slots__ = ("__weakref__", "all", "enabled", "disabled", "iuse_implicit", "regex", "tokens")
72 @@ -141,13 +151,38 @@
73
74 __slots__ = ("_pkg",)
75 _wrapped_keys = frozenset(
76 - ["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"])
77 + ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
78
79 def __init__(self, pkg, metadata):
80 _PackageMetadataWrapperBase.__init__(self)
81 self._pkg = pkg
82 + """LICENSE with USE conditionals evaluated."""
83 +
84 + if not pkg.built:
85 + # USE is lazy, but we want it to show up in self.keys().
86 + self['USE'] = ''
87 +
88 self.update(metadata)
89
90 + def __getitem__(self, k):
91 + v = _PackageMetadataWrapperBase.__getitem__(self, k)
92 + if k in ('PROVIDE', 'LICENSE',):
93 + if '?' in v:
94 + v = paren_enclose(paren_normalize(use_reduce(
95 + paren_reduce(v), uselist=self._pkg.use.enabled)))
96 + self[k] = v
97 +
98 + elif k == 'USE' and not self._pkg.built:
99 + if not v:
100 + # This is lazy because it's expensive.
101 + pkgsettings = self._pkg.root_config.trees[
102 + 'porttree'].dbapi.doebuild_settings
103 + pkgsettings.setcpv(self._pkg)
104 + v = pkgsettings["PORTAGE_USE"]
105 + self['USE'] = v
106 +
107 + return v
108 +
109 def __setitem__(self, k, v):
110 _PackageMetadataWrapperBase.__setitem__(self, k, v)
111 if k in self._wrapped_keys:
112 @@ -165,9 +200,6 @@
113 def _set_slot(self, k, v):
114 self._pkg.slot = v
115
116 - def _set_use(self, k, v):
117 - self._pkg.use = self._pkg._use(v.split())
118 -
119 def _set_counter(self, k, v):
120 if isinstance(v, basestring):
121 try:
122
123 Modified: main/trunk/pym/_emerge/Scheduler.py
124 ===================================================================
125 --- main/trunk/pym/_emerge/Scheduler.py 2009-06-24 21:07:50 UTC (rev 13685)
126 +++ main/trunk/pym/_emerge/Scheduler.py 2009-06-25 00:33:47 UTC (rev 13686)
127 @@ -1625,12 +1625,6 @@
128 db_keys = list(self.trees[root_config.root][
129 tree_type].dbapi._aux_cache_keys)
130 metadata = izip(db_keys, db.aux_get(cpv, db_keys))
131 - pkg = Package(cpv=cpv, metadata=metadata,
132 + return Package(built=(type_name != 'ebuild'),
133 + cpv=cpv, metadata=metadata,
134 root_config=root_config, installed=installed)
135 - if type_name == "ebuild":
136 - settings = self.pkgsettings[root_config.root]
137 - settings.setcpv(pkg)
138 - pkg.metadata["USE"] = settings["PORTAGE_USE"]
139 - pkg.metadata['CHOST'] = settings.get('CHOST', '')
140 -
141 - return pkg
142
143 Modified: main/trunk/pym/_emerge/depgraph.py
144 ===================================================================
145 --- main/trunk/pym/_emerge/depgraph.py 2009-06-24 21:07:50 UTC (rev 13685)
146 +++ main/trunk/pym/_emerge/depgraph.py 2009-06-25 00:33:47 UTC (rev 13686)
147 @@ -1147,9 +1147,6 @@
148 metadata = izip(db_keys, portdb.aux_get(mykey, db_keys))
149 pkg = Package(type_name="ebuild", root_config=root_config,
150 cpv=mykey, metadata=metadata, onlydeps=onlydeps)
151 - pkgsettings.setcpv(pkg)
152 - pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
153 - pkg.metadata['CHOST'] = pkgsettings.get('CHOST', '')
154 self._pkg_cache[pkg] = pkg
155 args.append(PackageArg(arg=x, package=pkg,
156 root_config=root_config))
157 @@ -1893,10 +1890,8 @@
158 continue
159 reinstall_for_flags = None
160 cache_key = (pkg_type, root, cpv, pkg_status)
161 - calculated_use = True
162 pkg = self._pkg_cache.get(cache_key)
163 if pkg is None:
164 - calculated_use = False
165 try:
166 metadata = izip(db_keys, db.aux_get(cpv, db_keys))
167 except KeyError:
168 @@ -1908,14 +1903,6 @@
169 metadata = pkg.metadata
170 if not built:
171 metadata['CHOST'] = pkgsettings.get('CHOST', '')
172 - if not built and ("?" in metadata["LICENSE"] or \
173 - "?" in metadata["PROVIDE"]):
174 - # This is avoided whenever possible because
175 - # it's expensive. It only needs to be done here
176 - # if it has an effect on visibility.
177 - pkgsettings.setcpv(pkg)
178 - metadata["USE"] = pkgsettings["PORTAGE_USE"]
179 - calculated_use = True
180 self._pkg_cache[pkg] = pkg
181
182 if not installed or (built and matched_packages):
183 @@ -1967,11 +1954,9 @@
184 if not visible(pkgsettings, pkg_eb):
185 continue
186
187 - if not pkg.built and not calculated_use:
188 - # This is avoided whenever possible because
189 - # it's expensive.
190 - pkgsettings.setcpv(pkg)
191 - pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
192 + # Calculation of USE for unbuilt ebuilds is relatively
193 + # expensive, so it is only performed lazily, after the
194 + # above visibility checks are complete.
195
196 if pkg.cp != atom.cp:
197 # A cpv can be returned from dbapi.match() as an
198 @@ -1984,8 +1969,6 @@
199 myarg = None
200 if root == self.target_root:
201 try:
202 - # Ebuild USE must have been calculated prior
203 - # to this point, in case atoms have USE deps.
204 myarg = self._iter_atoms_for_pkg(pkg).next()
205 except StopIteration:
206 pass
207 @@ -2235,13 +2218,9 @@
208 metadata = izip(db_keys, db.aux_get(cpv, db_keys))
209 except KeyError:
210 raise portage.exception.PackageNotFound(cpv)
211 - pkg = Package(cpv=cpv, metadata=metadata,
212 + pkg = Package(built=(type_name != "ebuild"), cpv=cpv,
213 + metadata=metadata,
214 root_config=root_config, installed=installed)
215 - if type_name == "ebuild":
216 - settings = self.pkgsettings[root_config.root]
217 - settings.setcpv(pkg)
218 - pkg.metadata["USE"] = settings["PORTAGE_USE"]
219 - pkg.metadata['CHOST'] = settings.get('CHOST', '')
220 self._pkg_cache[pkg] = pkg
221 return pkg
222
223 @@ -4381,11 +4360,6 @@
224 installed=installed, metadata=metadata,
225 operation=action, root_config=root_config,
226 type_name=pkg_type)
227 - if pkg_type == "ebuild":
228 - pkgsettings = self.pkgsettings[myroot]
229 - pkgsettings.setcpv(pkg)
230 - pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
231 - pkg.metadata['CHOST'] = pkgsettings.get('CHOST', '')
232 self._pkg_cache[pkg] = pkg
233
234 root_config = self.roots[pkg.root]
235 @@ -4827,10 +4801,7 @@
236 db.aux_get(cpv, db_keys)))
237 except KeyError:
238 metadata = None
239 - if metadata and not built:
240 - pkgsettings.setcpv(cpv, mydb=metadata)
241 - metadata["USE"] = pkgsettings["PORTAGE_USE"]
242 - metadata['CHOST'] = pkgsettings.get('CHOST', '')
243 +
244 if metadata is None:
245 mreasons = ["corruption"]
246 else: