From b3aaf3fe867ccb1f9cbb088be5217fe4c7116021 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 27 Apr 2008 00:23:03 +0000 Subject: * Add a Blocker class to use instead of tuples. * Fix the Task constructor to properly traverse __slots__ of all inherited classes. (trunk r9979) svn path=/main/branches/2.1.2/; revision=9985 --- bin/emerge | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'bin') diff --git a/bin/emerge b/bin/emerge index 9aba5e6db..52975a86a 100755 --- a/bin/emerge +++ b/bin/emerge @@ -1348,11 +1348,18 @@ class Task(object): __slots__ = ("__weakref__", "_hash_key",) def __init__(self, **kwargs): - for myattr in self.__slots__: - if myattr == "__weakref__": + classes = [self.__class__] + while classes: + c = classes.pop() + if c is Task: continue - myvalue = kwargs.get(myattr, None) - setattr(self, myattr, myvalue) + classes.extend(c.__bases__) + slots = getattr(c, "__slots__", None) + if not slots: + continue + for myattr in slots: + myvalue = kwargs.get(myattr, None) + setattr(self, myattr, myvalue) def _get_hash_key(self): try: @@ -1384,6 +1391,17 @@ class Task(object): def __str__(self): return str(self._get_hash_key()) +class Blocker(Task): + __slots__ = ("root", "atom") + + def _get_hash_key(self): + try: + return self._hash_key + except AttributeError: + self._hash_key = \ + ("blocks", self.root, self.atom) + return self._hash_key + class Package(Task): __slots__ = ("built", "cpv", "depth", "installed", "metadata", "root", "onlydeps", "type_name", @@ -1424,6 +1442,7 @@ class Package(Task): return False class Uninstall(Package): + __slots__ = () def _get_hash_key(self): try: return self._hash_key @@ -2010,7 +2029,7 @@ class depgraph(object): # The blocker applies to the root where # the parent is or will be installed. self.blocker_parents.setdefault( - ("blocks", dep.parent.root, dep.atom), set()).add( + Blocker(atom=dep.atom, root=dep.parent.root), set()).add( dep.parent) return 1 dep_pkg, existing_node = self._select_package(dep.root, dep.atom, -- cgit v1.2.3-1-g7c22