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: |