summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/emerge/__init__.py7
-rw-r--r--pym/portage/__init__.py21
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):