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 != "/":
If the package has new iuse flags or different use flags then if
--newuse is specified, we need to merge the package. """
if merging==0 and "--newuse" in self.myopts and \
+ mytype == "ebuild" and \
vardbapi.cpv_exists(mykey):
pkgsettings.setcpv(mykey, mydb=portdb)
forced_flags = set()
retlist=[]
circular_blocks = False
blocker_deps = None
+ asap_nodes = []
if reversed:
get_nodes = mygraph.root_nodes
else:
get_nodes = mygraph.leaf_nodes
+ for cpv, node in self.pkg_node_map.iteritems():
+ if "portage" == portage.catsplit(portage.dep_getkey(cpv))[-1]:
+ asap_nodes.append(node)
+ break
ignore_priority_range = [None]
ignore_priority_range.extend(
xrange(DepPriority.MIN, DepPriority.MEDIUM + 1))
while not mygraph.empty():
- for ignore_priority in ignore_priority_range:
- nodes = get_nodes(ignore_priority=ignore_priority)
- if nodes:
- break
+ ignore_priority = None
+ nodes = None
+ if asap_nodes:
+ """ASAP nodes are merged before their soft deps."""
+ for node in asap_nodes:
+ if not mygraph.contains(node):
+ asap_nodes.remove(node)
+ continue
+ if not mygraph.child_nodes(node,
+ ignore_priority=DepPriority.SOFT):
+ nodes = [node]
+ asap_nodes.remove(node)
+ break
+ if not nodes:
+ for ignore_priority in ignore_priority_range:
+ nodes = get_nodes(ignore_priority=ignore_priority)
+ if nodes:
+ break
selected_nodes = None
if nodes:
if ignore_priority <= DepPriority.SOFT:
newlist = []
for atom in mylist:
mykey = portage.dep_getkey(atom)
- if portage.catsplit(mykey)[-1] == "portage":
- newlist.insert(0, atom)
- else:
+ if True:
newlist.append(atom)
"""Make sure all installed slots are updated when possible.
Do this with --emptytree also, to ensure that all slots are
myversion = "%s-%s" % (mysplit[1], mysplit[2])
if myversion != portage.VERSION and "--quiet" not in self.myopts:
- if "--emptytree" in self.myopts:
- p.append(colorize("WARN", "***")+" Please update portage to the above version before proceeding.")
- p.append(" Failure to do so may result in failed or improper merges.")
- p.append(" A simple '"+green("emerge portage")+"' is sufficient.")
- p.append("")
- elif mylist.index(x) < len(mylist) - 1 and \
+ if mylist.index(x) < len(mylist) - 1 and \
"livecvsportage" not in self.settings.features:
p.append(colorize("WARN", "*** Portage will stop merging at this point and reload itself,"))
p.append(colorize("WARN", " then resume the merge."))
self.virtuals = {}
self.virts_p = {}
self.dirVirtuals = None
+ self._new_virtuals = {}
self.v_count = 0
# Virtuals obtained from the vartree
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)
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):
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
+ # Make sure dirVirtuals and treeVirtuals are initialized.
+ self.getvirtuals()
+ self.virtuals = self.__getvirtuals_compile()
def __delitem__(self,mykey):
self.modifying()
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
l.sort()
return l
+ cpv_all = cp_all
+
def p_list(self,mycp):
d={}
for oroot in self.porttrees: