| Index: parallel_emerge
|
| diff --git a/parallel_emerge b/parallel_emerge
|
| index 192cb8afbf9b5906c848e0d2a11e28569c88a66f..ae02a14b252145050de4a6cd8319c1338e0c32b5 100755
|
| --- a/parallel_emerge
|
| +++ b/parallel_emerge
|
| @@ -217,13 +217,14 @@ class DepGraphGenerator(object):
|
| """
|
|
|
| __slots__ = ["board", "emerge", "mandatory_source", "no_workon_deps",
|
| - "package_db", "rebuild", "show_output"]
|
| + "nomerge", "package_db", "rebuild", "show_output"]
|
|
|
| def __init__(self):
|
| self.board = None
|
| self.emerge = EmergeData()
|
| self.mandatory_source = set()
|
| self.no_workon_deps = False
|
| + self.nomerge = set()
|
| self.package_db = {}
|
| self.rebuild = False
|
| self.show_output = False
|
| @@ -249,6 +250,10 @@ class DepGraphGenerator(object):
|
| workon_str = arg.replace("--workon=", "")
|
| package_list = shlex.split(" ".join(shlex.split(workon_str)))
|
| self.mandatory_source.update(package_list)
|
| + elif arg.startswith("--nomerge="):
|
| + nomerge_str = arg.replace("--nomerge=", "")
|
| + package_list = shlex.split(" ".join(shlex.split(nomerge_str)))
|
| + self.nomerge.update(package_list)
|
| elif arg == "--no-workon-deps":
|
| self.no_workon_deps = True
|
| elif arg == "--rebuild":
|
| @@ -775,6 +780,12 @@ class DepGraphGenerator(object):
|
| if info["optional"]:
|
| rm_pkgs.add(pkg)
|
|
|
| + # Schedule nomerge packages for removal
|
| + for pkg in self.nomerge:
|
| + for db_pkg in final_db.match_pkgs(pkg):
|
| + if db_pkg.cpv in deps_map:
|
| + rm_pkgs.add(str(db_pkg.cpv))
|
| +
|
| # Remove the packages we don't want, simplifying the graph and making
|
| # it easier for us to crack cycles.
|
| for pkg in sorted(rm_pkgs):
|
| @@ -1611,9 +1622,13 @@ def main():
|
|
|
| if "--quiet" not in emerge.opts:
|
| cmdline_packages = " ".join(emerge.cmdline_packages)
|
| + nomerge_packages = " ".join(deps.nomerge)
|
| print "Starting fast-emerge."
|
| print " Building package %s on %s" % (cmdline_packages,
|
| deps.board or "root")
|
| + if nomerge_packages:
|
| + print " Skipping package %s on %s" % (nomerge_packages,
|
| + deps.board or "root")
|
|
|
| deps_tree, deps_info = deps.GenDependencyTree()
|
|
|
| @@ -1628,6 +1643,22 @@ def main():
|
| if "--tree" in emerge.opts:
|
| PrintDepsMap(deps_graph)
|
|
|
| + # Are we upgrading portage? If so, and there are more packages to merge,
|
| + # schedule a restart of parallel_emerge to merge the rest. This ensures that
|
| + # we pick up all updates to portage settings before merging any more
|
| + # packages.
|
| + portage_upgrade = False
|
| + root = emerge.settings["ROOT"]
|
| + final_db = emerge.depgraph._dynamic_config.mydbapi[root]
|
| + if root == "/":
|
| + for db_pkg in final_db.match_pkgs("sys-apps/portage"):
|
| + portage_pkg = deps_graph.get(db_pkg.cpv)
|
| + if portage and len(deps_graph) > 1:
|
| + deps_graph = { str(db_pkg.cpv): portage_pkg }
|
| + portage_upgrade = True
|
| + if "--quiet" not in emerge.opts:
|
| + print "Upgrading portage first, then restarting..."
|
| +
|
| # Run the queued emerges.
|
| scheduler = EmergeQueue(deps_graph, emerge, deps.package_db, deps.show_output)
|
| scheduler.Run()
|
| @@ -1637,8 +1668,6 @@ def main():
|
| "--pretend" not in emerge.opts):
|
| world_set = emerge.root_config.sets["selected"]
|
| new_world_pkgs = []
|
| - root = emerge.settings["ROOT"]
|
| - final_db = emerge.depgraph._dynamic_config.mydbapi[root]
|
| for pkg in emerge.cmdline_packages:
|
| for db_pkg in final_db.match_pkgs(pkg):
|
| print "Adding %s to world" % db_pkg.cp
|
| @@ -1650,6 +1679,12 @@ def main():
|
| if deps.board and "--pretend" not in emerge.opts:
|
| portage.env_update()
|
|
|
| + # If we already upgraded portage, we don't need to do so again. But we do
|
| + # need to upgrade the rest of the packages. So we'll go ahead and do that.
|
| + if portage_upgrade:
|
| + args = sys.argv[1:] + ["--nomerge=sys-apps/portage"]
|
| + os.execvp(os.path.realpath(sys.argv[0]), args)
|
| +
|
| print "Done"
|
|
|
| if __name__ == "__main__":
|
|
|