diff options
-rw-r--r-- | pym/emerge/__init__.py | 7 | ||||
-rw-r--r-- | pym/portage/__init__.py | 21 |
2 files changed, 20 insertions, 8 deletions
diff --git a/pym/emerge/__init__.py b/pym/emerge/__init__.py index 4bf288af5..830e221de 100644 --- a/pym/emerge/__init__.py +++ b/pym/emerge/__init__.py @@ -1744,9 +1744,14 @@ class depgraph(object): if p_status == "merge": # Update old-style virtuals if this package provides any. # These are needed for dep_virtual calls inside dep_check. - p_db = self.trees[p_root][self.pkg_tree_map[p_type]].dbapi + p_db = self.mydbapi[p_root] # contains cached metadata try: self.pkgsettings[p_root].setinst(p_key, p_db) + # For consistency, also update the global virtuals. + settings = self.roots[p_root].settings + settings.unlock() + settings.setinst(p_key, p_db) + settings.lock() except portage.exception.InvalidDependString, e: provide = p_db.aux_get(p_key, ["PROVIDE"])[0] show_invalid_depstring_notice(myparent, provide, str(e)) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 4f7f89f51..b15f4ced1 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1859,22 +1859,29 @@ class config(object): self.getvirtuals() # Grab the virtuals this package provides and add them into the tree virtuals. provides = mydbapi.aux_get(mycpv, ["PROVIDE"])[0] + if not provides: + return if isinstance(mydbapi, portdbapi): + self.setcpv(mycpv, mydb=mydbapi) myuse = self["USE"] else: myuse = mydbapi.aux_get(mycpv, ["USE"])[0] virts = flatten(portage.dep.use_reduce(portage.dep.paren_reduce(provides), uselist=myuse.split())) + modified = False cp = dep_getkey(mycpv) for virt in virts: virt = dep_getkey(virt) - if not self.treeVirtuals.has_key(virt): - self.treeVirtuals[virt] = [] - # XXX: Is this bad? -- It's a permanent modification - if cp not in self.treeVirtuals[virt]: - self.treeVirtuals[virt].append(cp) - - self.virtuals = self.__getvirtuals_compile() + providers = self.treeVirtuals.get(virt) + if providers is None: + providers = [] + self.treeVirtuals[virt] = providers + if cp not in providers: + providers.append(cp) + modified = True + + if modified: + self.virtuals = self.__getvirtuals_compile() def regenerate(self,useonly=0,use_cache=1): |