Make the depgraph and FakeVartree cooperate to consistently create
authorZac Medico <zmedico@gentoo.org>
Mon, 6 Sep 2010 18:45:08 +0000 (11:45 -0700)
committerZac Medico <zmedico@gentoo.org>
Mon, 6 Sep 2010 18:45:08 +0000 (11:45 -0700)
Package instances whose root_config attribute is a specially optimized
RootConfig that has a FakeVartree instead of a real vartree.

pym/_emerge/FakeVartree.py
pym/_emerge/depgraph.py

index 97675708b341d4f224c70000d0ef125daee24663..e6ec15fc300367031136915f5399f8a9b1337f67 100644 (file)
@@ -36,11 +36,15 @@ class FakeVartree(vartree):
        global updates are necessary (updates are performed when necessary if there
        is not a matching ebuild in the tree). Instances of this class are not
        populated until the sync() method is called."""
-       def __init__(self, root_config, pkg_cache=None):
+       def __init__(self, root_config, pkg_cache=None, pkg_root_config=None):
                self._root_config = root_config
+               if pkg_root_config is None:
+                       pkg_root_config = self._root_config
+               self._pkg_root_config = pkg_root_config
                if pkg_cache is None:
                        pkg_cache = {}
                real_vartree = root_config.trees["vartree"]
+               self._real_vardb = real_vartree.dbapi
                portdb = root_config.trees["porttree"].dbapi
                self.root = real_vartree.root
                self.settings = real_vartree.settings
@@ -177,12 +181,17 @@ class FakeVartree(vartree):
                real_vardb.flush_cache()
 
        def _pkg(self, cpv):
-               root_config = self._root_config
-               real_vardb = root_config.trees["vartree"].dbapi
+               """
+               The RootConfig instance that will become the Package.root_config
+               attribute can be overridden by the FakeVartree pkg_root_config
+               constructory argument, since we want to be consitent with the
+               depgraph._pkg() method which uses a specially optimized
+               RootConfig that has a FakeVartree instead of a real vartree.
+               """
                pkg = Package(cpv=cpv, built=True, installed=True,
                        metadata=zip(self._db_keys,
-                       real_vardb.aux_get(cpv, self._db_keys)),
-                       root_config=root_config,
+                       self._real_vardb.aux_get(cpv, self._db_keys)),
+                       root_config=self._pkg_root_config,
                        type_name="installed")
 
                try:
index db85c2ea3d421800f0e5a54cc1a26ebc0399d826..94e55e173d22eba8e362a532daf72c9eb9f991ae 100644 (file)
@@ -101,7 +101,8 @@ class _frozen_depgraph_config(object):
                                self.trees[myroot][tree] = trees[myroot][tree]
                        self.trees[myroot]["vartree"] = \
                                FakeVartree(trees[myroot]["root_config"],
-                                       pkg_cache=self._pkg_cache)
+                                       pkg_cache=self._pkg_cache,
+                                       pkg_root_config=self.roots[myroot])
                        self.pkgsettings[myroot] = portage.config(
                                clone=self.trees[myroot]["vartree"].settings)
 
@@ -3066,6 +3067,9 @@ class depgraph(object):
                operation = "merge"
                if installed or onlydeps:
                        operation = "nomerge"
+               # Ensure that we use the specially optimized RootConfig instance
+               # that refers to FakeVartree instead of the real vartree.
+               root_config = self._frozen_config.roots[root_config.root]
                pkg = self._frozen_config._pkg_cache.get(
                        (type_name, root_config.root, cpv, operation))
                if pkg is None and onlydeps and not installed: