summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/Package.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-06-25 00:33:47 +0000
committerZac Medico <zmedico@gentoo.org>2009-06-25 00:33:47 +0000
commita1c4f31d5c9a7e4a49e6293263a0b5b2602551ba (patch)
treecccf39a795ef632400d96a05d8b379a93742bd94 /pym/_emerge/Package.py
parentb3bfab30337c750c60e4ef7abae28644e1cda0cd (diff)
downloadportage-a1c4f31d5c9a7e4a49e6293263a0b5b2602551ba.tar.gz
portage-a1c4f31d5c9a7e4a49e6293263a0b5b2602551ba.tar.bz2
portage-a1c4f31d5c9a7e4a49e6293263a0b5b2602551ba.zip
* Make Package.metadata['USE'] access trigger USE calculation for unbuilt
ebuilds. * Make Package.metadata['LICENSE'] access trigger USE conditional evaluation. * Make Package.metadata['PROVIDE'] access trigger USE conditional evaluation. * Initialize Package.metadata['CHOST'] in the Package constructor for unbuilt ebuilds. svn path=/main/trunk/; revision=13686
Diffstat (limited to 'pym/_emerge/Package.py')
-rw-r--r--pym/_emerge/Package.py46
1 files changed, 39 insertions, 7 deletions
diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py
index 4a40bf950..502bb7c84 100644
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@ -10,7 +10,8 @@ except ImportError:
import portage
from portage.cache.mappings import slot_dict_class
-
+from portage.dep import paren_reduce, use_reduce, \
+ paren_normalize, paren_enclose
from _emerge.Task import Task
class Package(Task):
@@ -21,7 +22,8 @@ class Package(Task):
"root_config", "type_name",
"category", "counter", "cp", "cpv_split",
"inherited", "iuse", "mtime",
- "pf", "pv_split", "root", "slot", "slot_atom", "use")
+ "pf", "pv_split", "root", "slot", "slot_atom",) + \
+ ("_use",)
metadata_keys = [
"CHOST", "COUNTER", "DEPEND", "EAPI",
@@ -33,6 +35,8 @@ class Package(Task):
Task.__init__(self, **kwargs)
self.root = self.root_config.root
self.metadata = _PackageMetadataWrapper(self, self.metadata)
+ if not self.built:
+ self.metadata['CHOST'] = self.root_config.settings.get('CHOST', '')
self.cp = portage.cpv_getkey(self.cpv)
slot = self.slot
if not slot:
@@ -44,13 +48,19 @@ class Package(Task):
self.cpv_split = portage.catpkgsplit(self.cpv)
self.pv_split = self.cpv_split[1:]
- class _use(object):
+ class _use_class(object):
__slots__ = ("__weakref__", "enabled")
def __init__(self, use):
self.enabled = frozenset(use)
+ @property
+ def use(self):
+ if self._use is None:
+ self._use = self._use_class(self.metadata['USE'].split())
+ return self._use
+
class _iuse(object):
__slots__ = ("__weakref__", "all", "enabled", "disabled", "iuse_implicit", "regex", "tokens")
@@ -141,13 +151,38 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
__slots__ = ("_pkg",)
_wrapped_keys = frozenset(
- ["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"])
+ ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
def __init__(self, pkg, metadata):
_PackageMetadataWrapperBase.__init__(self)
self._pkg = pkg
+ """LICENSE with USE conditionals evaluated."""
+
+ if not pkg.built:
+ # USE is lazy, but we want it to show up in self.keys().
+ self['USE'] = ''
+
self.update(metadata)
+ def __getitem__(self, k):
+ v = _PackageMetadataWrapperBase.__getitem__(self, k)
+ if k in ('PROVIDE', 'LICENSE',):
+ if '?' in v:
+ v = paren_enclose(paren_normalize(use_reduce(
+ paren_reduce(v), uselist=self._pkg.use.enabled)))
+ self[k] = v
+
+ elif k == 'USE' and not self._pkg.built:
+ if not v:
+ # This is lazy because it's expensive.
+ pkgsettings = self._pkg.root_config.trees[
+ 'porttree'].dbapi.doebuild_settings
+ pkgsettings.setcpv(self._pkg)
+ v = pkgsettings["PORTAGE_USE"]
+ self['USE'] = v
+
+ return v
+
def __setitem__(self, k, v):
_PackageMetadataWrapperBase.__setitem__(self, k, v)
if k in self._wrapped_keys:
@@ -165,9 +200,6 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
def _set_slot(self, k, v):
self._pkg.slot = v
- def _set_use(self, k, v):
- self._pkg.use = self._pkg._use(v.split())
-
def _set_counter(self, k, v):
if isinstance(v, basestring):
try: