summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/package/ebuild/_config/features_set.py69
-rw-r--r--pym/portage/package/ebuild/config.py66
2 files changed, 72 insertions, 63 deletions
diff --git a/pym/portage/package/ebuild/_config/features_set.py b/pym/portage/package/ebuild/_config/features_set.py
new file mode 100644
index 000000000..e53c2027e
--- /dev/null
+++ b/pym/portage/package/ebuild/_config/features_set.py
@@ -0,0 +1,69 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+__all__ = (
+ 'features_set',
+)
+
+from portage.dep import best_match_to_list
+
+class features_set(object):
+ """
+ Provides relevant set operations needed for access and modification of
+ config.features. The FEATURES variable is automatically synchronized
+ upon modification.
+
+ Modifications result in a permanent override that will cause the change
+ to propagate to the incremental stacking mechanism in config.regenerate().
+ This eliminates the need to call config.backup_changes() when FEATURES
+ is modified, since any overrides are guaranteed to persist despite calls
+ to config.reset().
+ """
+
+ def __init__(self, settings):
+ self._settings = settings
+ self._features = set()
+
+ def __contains__(self, k):
+ return k in self._features
+
+ def __iter__(self):
+ return iter(self._features)
+
+ def _sync_env_var(self):
+ self._settings['FEATURES'] = ' '.join(sorted(self._features))
+
+ def add(self, k):
+ self._settings.modifying()
+ self._settings._features_overrides.append(k)
+ if k not in self._features:
+ self._features.add(k)
+ self._sync_env_var()
+
+ def update(self, values):
+ self._settings.modifying()
+ values = list(values)
+ self._settings._features_overrides.extend(values)
+ need_sync = False
+ for k in values:
+ if k in self._features:
+ continue
+ self._features.add(k)
+ need_sync = True
+ if need_sync:
+ self._sync_env_var()
+
+ def remove(self, k):
+ """
+ This never raises KeyError, since it records a permanent override
+ that will prevent the given flag from ever being added again by
+ incremental stacking in config.regenerate().
+ """
+ self.discard(k)
+
+ def discard(self, k):
+ self._settings.modifying()
+ self._settings._features_overrides.append('-' + k)
+ if k in self._features:
+ self._features.remove(k)
+ self._sync_env_var()
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 315166659..ffff8c029 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -47,6 +47,7 @@ from portage.util import ensure_dirs, getconfig, grabdict, \
writemsg, writemsg_level
from portage.versions import catpkgsplit, catsplit, cpv_getkey
+from portage.package.ebuild._config.features_set import features_set
from portage.package.ebuild._config.LicenseManager import LicenseManager
from portage.package.ebuild._config.helper import ordered_by_atom_specificity
@@ -98,67 +99,6 @@ def best_from_dict(key, top_dict, key_order, EmptyOnError=1, FullCopy=1, AllowEm
else:
raise KeyError("Key not found in list; '%s'" % key)
-class _features_set(object):
- """
- Provides relevant set operations needed for access and modification of
- config.features. The FEATURES variable is automatically synchronized
- upon modification.
-
- Modifications result in a permanent override that will cause the change
- to propagate to the incremental stacking mechanism in config.regenerate().
- This eliminates the need to call config.backup_changes() when FEATURES
- is modified, since any overrides are guaranteed to persist despite calls
- to config.reset().
- """
-
- def __init__(self, settings):
- self._settings = settings
- self._features = set()
-
- def __contains__(self, k):
- return k in self._features
-
- def __iter__(self):
- return iter(self._features)
-
- def _sync_env_var(self):
- self._settings['FEATURES'] = ' '.join(sorted(self._features))
-
- def add(self, k):
- self._settings.modifying()
- self._settings._features_overrides.append(k)
- if k not in self._features:
- self._features.add(k)
- self._sync_env_var()
-
- def update(self, values):
- self._settings.modifying()
- values = list(values)
- self._settings._features_overrides.extend(values)
- need_sync = False
- for k in values:
- if k in self._features:
- continue
- self._features.add(k)
- need_sync = True
- if need_sync:
- self._sync_env_var()
-
- def remove(self, k):
- """
- This never raises KeyError, since it records a permanent override
- that will prevent the given flag from ever being added again by
- incremental stacking in config.regenerate().
- """
- self.discard(k)
-
- def discard(self, k):
- self._settings.modifying()
- self._settings._features_overrides.append('-' + k)
- if k in self._features:
- self._features.remove(k)
- self._sync_env_var()
-
def _lazy_iuse_regex(iuse_implicit):
"""
The PORTAGE_IUSE value is lazily evaluated since re.escape() is slow
@@ -514,7 +454,7 @@ class config(object):
self.punmaskdict = copy.deepcopy(clone.punmaskdict)
self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
self.pprovideddict = copy.deepcopy(clone.pprovideddict)
- self.features = _features_set(self)
+ self.features = features_set(self)
self.features._features = copy.deepcopy(clone.features._features)
self._features_overrides = copy.deepcopy(clone._features_overrides)
@@ -2457,7 +2397,7 @@ class config(object):
if hasattr(self, "features"):
self.features._features.clear()
else:
- self.features = _features_set(self)
+ self.features = features_set(self)
self.features._features.update(self.get('FEATURES', '').split())
self.features._sync_env_var()