For bug #154223, bridge new-style virtuals into old-style virtuals in order to preven...
authorZac Medico <zmedico@gentoo.org>
Mon, 6 Nov 2006 19:05:22 +0000 (19:05 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 6 Nov 2006 19:05:22 +0000 (19:05 -0000)
svn path=/main/trunk/; revision=4955

bin/emerge
pym/portage.py

index e6db286ed311712399ece7ea80e12d6769341ef9..4cdab4b84579b0a4bebb3ae3b4f4349157d8550a 100755 (executable)
@@ -721,10 +721,15 @@ class depgraph:
                        self.edebug = 1
                self.spinner = spinner
                self.pkgsettings = {}
-               self.pkgsettings[self.target_root] = portage.config(clone=settings)
-               if self.target_root != "/":
-                       self.pkgsettings["/"] = \
-                               portage.config(clone=trees["/"]["vartree"].settings)
+               for myroot in self.trees:
+                       self.pkgsettings[myroot] = portage.config(
+                               clone=trees[myroot]["vartree"].settings)
+                       mydbapis = []
+                       if "--usepkgonly" not in self.myopts:
+                               mydbapis.append(trees[myroot]["porttree"].dbapi)
+                       if "--usepkg" in self.myopts:
+                               mydbapis.append(trees[myroot]["bintree"].dbapi)
+                       self.pkgsettings[myroot].add_new_virtuals(mydbapis)
                self.useFlags = {}
                self.useFlags[self.target_root] = {}
                if self.target_root != "/":
index d6c5ec0beaf60e7ff307772afa6c3d1dc448667c..fd11dc22ea9e10f12cb7b195ef30770305bd6a38 100644 (file)
@@ -849,6 +849,7 @@ class config:
                self.virtuals = {}
                self.virts_p = {}
                self.dirVirtuals = None
+               self._new_virtuals = {}
                self.v_count  = 0
 
                # Virtuals obtained from the vartree
@@ -914,6 +915,7 @@ class config:
                        self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
                        self.pprovideddict = copy.deepcopy(clone.pprovideddict)
                        self.dirVirtuals = copy.deepcopy(clone.dirVirtuals)
+                       self._new_virtuals = copy.deepcopy(clone._new_virtuals)
                        self.treeVirtuals = copy.deepcopy(clone.treeVirtuals)
                        self.features = copy.deepcopy(clone.features)
 
@@ -1621,6 +1623,9 @@ class config:
                virts = flatten(portage_dep.use_reduce(portage_dep.paren_reduce(provides), uselist=myuse.split()))
 
                cp = dep_getkey(mycpv)
+               if cp.startswith("virtual/"):
+                       # Bridge new-style virtual into old-style.
+                       virts.append(cp)
                for virt in virts:
                        virt = dep_getkey(virt)
                        if not self.treeVirtuals.has_key(virt):
@@ -1859,7 +1864,19 @@ class config:
                                        ptVirtuals.setdefault(virt, [])
                                        ptVirtuals[virt].append(cp)
 
-               return stack_dictlist([ptVirtuals, self.treeVirtuals, self.dirVirtuals])
+               return stack_dictlist([ptVirtuals, self.treeVirtuals, self.dirVirtuals,
+                       self._new_virtuals])
+
+       def add_new_virtuals(self, mydbapis):
+               """Scan for new-style virtuals and bridge them into the old-style."""
+               new_virtuals = {}
+               for mydbapi in mydbapis:
+                       for cpv in mydbapi.cpv_all():
+                               if cpv.startswith("virtual/"):
+                                       cp = dep_getkey(cpv)
+                                       new_virtuals[cp] = [cp]
+               self._new_virtuals = new_virtuals
+               self.virtuals = self.getvirtuals()
 
        def __delitem__(self,mykey):
                self.modifying()
@@ -4738,6 +4755,9 @@ class vartree(packagetree):
                                        if not mys:
                                                mys = string.split(myprovide, "/")
                                        myprovides += [mys[0] + "/" + mys[1]]
+                       if mycpv.startswith("virtual/"):
+                               # Bridge new-style virtual into old-style.
+                               myprovides.append(dep_getkey(mycpv))
                        return myprovides
                except SystemExit, e:
                        raise
@@ -5318,6 +5338,8 @@ class portdbapi(dbapi):
                l.sort()
                return l
 
+       cpv_all = cp_all
+
        def p_list(self,mycp):
                d={}
                for oroot in self.porttrees: