summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-06-26 00:49:10 +0000
committerZac Medico <zmedico@gentoo.org>2008-06-26 00:49:10 +0000
commit9a58611323e313a7a5d48fa65a316a3ffedc3954 (patch)
tree73d848b4919edd2e09d0c56fc9da1b7727a54177
parentd6b64ea06ff357b920b24a75f2c5ddf03674190d (diff)
downloadportage-9a58611323e313a7a5d48fa65a316a3ffedc3954.tar.gz
portage-9a58611323e313a7a5d48fa65a316a3ffedc3954.tar.bz2
portage-9a58611323e313a7a5d48fa65a316a3ffedc3954.zip
Make PackageIndex use SlotDict for package metadata storage. The set of
allowed keys is passed into the PackageIndex constructor (normal dict instances will be used if the set of keys is not passed in for some reason). A SlotDict.allowed_keys attribute now provides access to a frozenset of allowed keys. svn path=/main/trunk/; revision=10797
-rw-r--r--pym/portage/cache/mappings.py11
-rw-r--r--pym/portage/dbapi/bintree.py13
-rw-r--r--pym/portage/getbinpkg.py33
3 files changed, 45 insertions, 12 deletions
diff --git a/pym/portage/cache/mappings.py b/pym/portage/cache/mappings.py
index f35761765..2cddd8147 100644
--- a/pym/portage/cache/mappings.py
+++ b/pym/portage/cache/mappings.py
@@ -125,8 +125,9 @@ def slot_dict_class(keys):
class SlotDict(object):
- _keys = keys_set
- __slots__ = ("__weakref__",) + tuple("_val_" + k for k in _keys)
+ allowed_keys = keys_set
+ __slots__ = ("__weakref__",) + \
+ tuple("_val_" + k for k in allowed_keys)
def __iter__(self):
for k, v in self.iteritems():
@@ -142,7 +143,7 @@ def slot_dict_class(keys):
return list(self)
def iteritems(self):
- for k in self._keys:
+ for k in self.allowed_keys:
try:
yield (k, getattr(self, "_val_" + k))
except AttributeError:
@@ -229,12 +230,12 @@ def slot_dict_class(keys):
return c
def clear(self):
- for k in self._keys:
+ for k in self.allowed_keys:
try:
delattr(self, "_val_" + k)
except AttributeError:
pass
v = SlotDict
- _slot_dict_classes[keys_set] = v
+ _slot_dict_classes[v.allowed_keys] = v
return v
diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
index 9b470cf60..2e0a1a536 100644
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@ -18,7 +18,7 @@ import portage.xpak, portage.getbinpkg
import os, errno, stat
import re
-from itertools import izip
+from itertools import chain, izip
class bindbapi(fakedbapi):
_known_keys = frozenset(list(fakedbapi._known_keys) + \
@@ -182,6 +182,16 @@ class binarytree(object):
("repository" , "REPO"),
)
+ self._pkgindex_allowed_pkg_keys = set(chain(
+ self._pkgindex_keys,
+ self._pkgindex_aux_keys,
+ self._pkgindex_hashes,
+ self._pkgindex_default_pkg_data,
+ self._pkgindex_inherited_keys,
+ self._pkgindex_default_header_data,
+ chain(*self._pkgindex_translated_keys)
+ ))
+
def move_ent(self, mylist):
if not self.populated:
self.populate()
@@ -827,6 +837,7 @@ class binarytree(object):
def _new_pkgindex(self):
return portage.getbinpkg.PackageIndex(
+ allowed_pkg_keys=self._pkgindex_allowed_pkg_keys,
default_header_data=self._pkgindex_default_header_data,
default_pkg_data=self._pkgindex_default_pkg_data,
inherited_keys=self._pkgindex_inherited_keys,
diff --git a/pym/portage/getbinpkg.py b/pym/portage/getbinpkg.py
index 75f3a352a..497194d67 100644
--- a/pym/portage/getbinpkg.py
+++ b/pym/portage/getbinpkg.py
@@ -4,6 +4,7 @@
# $Id$
from portage.output import red, yellow, green
+from portage.cache.mappings import slot_dict_class
import portage.xpak
import HTMLParser
import sys
@@ -680,8 +681,17 @@ def _cmp_cpv(d1, d2):
class PackageIndex(object):
- def __init__(self, default_header_data=None, default_pkg_data=None,
- inherited_keys=None, translated_keys=None):
+ def __init__(self,
+ allowed_pkg_keys=None,
+ default_header_data=None,
+ default_pkg_data=None,
+ inherited_keys=None,
+ translated_keys=None):
+
+ self._pkg_slot_dict = None
+ if allowed_pkg_keys is not None:
+ self._pkg_slot_dict = slot_dict_class(allowed_pkg_keys)
+
self._default_header_data = default_header_data
self._default_pkg_data = default_pkg_data
self._inherited_keys = inherited_keys
@@ -696,8 +706,15 @@ class PackageIndex(object):
self.packages = []
self.modified = True
- def _readpkgindex(self, pkgfile):
- d = {}
+ def _readpkgindex(self, pkgfile, pkg_entry=True):
+
+ allowed_keys = None
+ if self._pkg_slot_dict is None or not pkg_entry:
+ d = {}
+ else:
+ d = self._pkg_slot_dict()
+ allowed_keys = d.allowed_keys
+
for line in pkgfile:
line = line.rstrip("\n")
if not line:
@@ -708,7 +725,11 @@ class PackageIndex(object):
k, v = line
if v:
v = v[1:]
- d[self._read_translation_map.get(k, k)] = v
+ k = self._read_translation_map.get(k, k)
+ if allowed_keys is not None and \
+ k not in allowed_keys:
+ continue
+ d[k] = v
return d
def _writepkgindex(self, pkgfile, items):
@@ -722,7 +743,7 @@ class PackageIndex(object):
self.readBody(pkgfile)
def readHeader(self, pkgfile):
- self.header.update(self._readpkgindex(pkgfile))
+ self.header.update(self._readpkgindex(pkgfile, pkg_entry=False))
def readBody(self, pkgfile):
while True: