Index: bin/emerge =================================================================== --- bin/emerge (revision 7599) +++ bin/emerge (revision 7605) @@ -778,11 +778,11 @@ SOFT The upper boundary for soft dependencies. MIN The lower boundary for soft dependencies. """ - __slots__ = ("__weakref__", "satisfied", "buildtime", "runtime", "runtime_post") + __slots__ = ("__weakref__", "satisfied", "buildtime", "runtime", "runtime_post", "rebuild") MEDIUM = -1 MEDIUM_SOFT = -2 SOFT = -3 - MIN = -5 + MIN = -6 def __init__(self, **kwargs): for myattr in self.__slots__: if myattr == "__weakref__": @@ -797,13 +797,15 @@ return -1 if self.runtime_post: return -2 + if self.rebuild: + return -3 if self.buildtime: - return -3 + return -4 if self.runtime: - return -4 + return -5 if self.runtime_post: - return -5 - return -5 + return -6 + return -6 def __lt__(self, other): return self.__int__() < other def __le__(self, other): @@ -1244,24 +1246,7 @@ #"no downgrade" emerge """ mytype, myroot, mykey = mybigkey - existing_node = None - if addme: - existing_node = self.pkg_node_map[myroot].get(mykey) - if existing_node: - self._parent_child_digraph.add(existing_node, myparent) - if existing_node != myparent: - # Refuse to make a node depend on itself so that the we don't - # don't create a bogus circular dependency in self.altlist(). - if rev_dep and myparent: - self.digraph.addnode(myparent, existing_node, - priority=priority) - else: - self.digraph.addnode(existing_node, myparent, - priority=priority) - return 1 - - if "--nodeps" not in self.myopts: - self.spinner.update() + if mytype == "blocks": if myparent and \ "--buildpkgonly" not in self.myopts and \ @@ -1303,6 +1288,36 @@ return 0 del e + # normal arg, not system or world + if arg and len(self._sets) == 1 and \ + "selective" not in self.myparams: + # For revdep-rebuild, dependencies on packages specified as + # arguments are given higher priority since the currently + # installed version has been rendered useless by ABI breakage. + # It's okay to increase the priority here even if the caller + # is not revdep-rebuild. + if priority.satisfied: + priority.rebuild = True + + existing_node = None + if addme: + existing_node = self.pkg_node_map[myroot].get(mykey) + if existing_node: + self._parent_child_digraph.add(existing_node, myparent) + if existing_node != myparent: + # Refuse to make a node depend on itself so that the we don't + # don't create a bogus circular dependency in self.altlist(). + if rev_dep and myparent: + self.digraph.addnode(myparent, existing_node, + priority=priority) + else: + self.digraph.addnode(existing_node, myparent, + priority=priority) + return 1 + + if "--nodeps" not in self.myopts: + self.spinner.update() + reinstall_for_flags = None merging=1 if mytype == "installed": @@ -2237,9 +2252,6 @@ self._altlist_cache[reversed] = retlist[:] return retlist mygraph=self.digraph.copy() - for node in mygraph.order[:]: - if node[-1] == "nomerge": - mygraph.remove(node) self._merge_order_bias(mygraph) myblockers = self.blocker_digraph.copy() retlist=[] @@ -2431,7 +2443,8 @@ prefer_asap = True for node in selected_nodes: - retlist.append(list(node)) + if node[-1] != "nomerge": + retlist.append(list(node)) mygraph.remove(node) if not reversed and not circular_blocks and myblockers.contains(node): """This node may have invalidated one or more blockers."""