Index: parallel_emerge |
diff --git a/parallel_emerge b/parallel_emerge |
index 6f98f41dfac24460684a3142c223254f0a3c8674..d09324021d4b48093e6f6762e6a067d64899631c 100755 |
--- a/parallel_emerge |
+++ b/parallel_emerge |
@@ -82,11 +82,17 @@ from _emerge.main import emerge_main |
from _emerge.main import parse_opts |
from _emerge.Package import Package |
from _emerge.Scheduler import Scheduler |
+from _emerge.SetArg import SetArg |
from _emerge.stdout_spinner import stdout_spinner |
import portage |
import portage.debug |
import portage.versions |
+new_portage = not portage.VERSION.startswith("2.1.7.") |
+if new_portage: |
+ from portage._global_updates import _global_updates |
+else: |
+ from portage import _global_updates |
def Usage(): |
"""Print usage.""" |
@@ -390,7 +396,7 @@ class DepGraphGenerator(object): |
# |
# Portage normally handles this logic in emerge_main, but again, we can't |
# use that function here. |
- if portage._global_updates(trees, mtimedb["updates"]): |
+ if _global_updates(trees, mtimedb["updates"]): |
mtimedb.commit() |
settings, trees, mtimedb = load_emerge_config(trees=trees) |
@@ -438,6 +444,9 @@ class DepGraphGenerator(object): |
root = settings["ROOT"] |
emerge.root_config = trees[root]["root_config"] |
+ if new_portage and "--usepkg" in opts: |
+ emerge.trees[root]["bintree"].populate("--getbinpkg" in opts) |
+ |
def CheckUseFlags(self, pkgsettings, cur_pkg, new_pkg): |
"""Are the use flags in cur_pkg up to date? |
@@ -498,26 +507,19 @@ class DepGraphGenerator(object): |
frozen_config = _frozen_depgraph_config(emerge.settings, emerge.trees, |
emerge_opts, emerge.spinner) |
backtrack_max = emerge_opts.get('--backtrack', 5) |
- runtime_pkg_mask = None |
+ backtrack_parameters = {} |
allow_backtracking = backtrack_max > 0 |
# Try up to backtrack_max times to create a working depgraph. Each time we |
# run into a conflict, mask the offending package and try again. |
# TODO(davidjames): When Portage supports --force-remote-binary directly, |
# switch back to using the backtrack_depgraph function. |
- for i in range(backtrack_max + 1): |
- if i == backtrack_max: |
- # Looks like we hit the backtracking limit. Run the dependency |
- # calculation one more time (from scratch) to show the original error |
- # message. |
- runtime_pkg_mask = None |
- allow_backtracking = False |
- |
+ for i in range(backtrack_max + 2): |
# Create a depgraph object. |
depgraph = emerge_depgraph(emerge.settings, emerge.trees, emerge_opts, |
params, emerge.spinner, frozen_config=frozen_config, |
allow_backtracking=allow_backtracking, |
- runtime_pkg_mask=runtime_pkg_mask) |
+ **backtrack_parameters) |
if i == 0: |
for cpv in self.forced_remote_binary_packages: |
@@ -537,15 +539,19 @@ class DepGraphGenerator(object): |
success, favorites = depgraph.select_files(packages) |
if success: |
break |
- elif depgraph.need_restart(): |
+ elif depgraph.need_restart() and i < backtrack_max: |
# Looks like we found some packages that can't be installed due to |
# conflicts. Try again, masking out the conflicting packages. |
- runtime_pkg_mask = depgraph.get_runtime_pkg_mask() |
+ if new_portage: |
+ backtrack_parameters = depgraph.get_backtrack_parameters() |
+ else: |
+ backtrack_parameters = { |
+ 'runtime_pkg_mask': depgraph.get_runtime_pkg_mask() |
+ } |
elif allow_backtracking and i > 0: |
- # Looks like we tried all the possible combinations, and we still can't |
- # solve the graph. Stop backtracking, so that we can report an error |
- # message. |
- runtime_pkg_mask = None |
+ # Looks like we can't solve the graph. Stop backtracking and report an |
+ # error message. |
+ backtrack_parameters.pop('runtime_pkg_mask', None) |
allow_backtracking = False |
else: |
break |
@@ -641,6 +647,7 @@ class DepGraphGenerator(object): |
# We just refer to CPVs as packages here because it's easier. |
deps = {} |
for child, priorities in node_deps[0].items(): |
+ if isinstance(child, SetArg): continue |
deps[str(child.cpv)] = dict(action=str(child.operation), |
deptype=str(priorities[-1]), |
deps={}) |
@@ -1192,7 +1199,7 @@ class DepGraphGenerator(object): |
"""Update packages that can use prebuilts to do so.""" |
start = time.time() |
- # Build list of prebuilt packages |
+ # Build list of prebuilt packages. |
prebuilt_pkgs = {} |
for pkg, info in deps_map.iteritems(): |
if info and info["action"] == "merge": |
@@ -1394,6 +1401,10 @@ def EmergeWorker(task_queue, job_queue, emerge, package_db): |
settings, trees, mtimedb = emerge.settings, emerge.trees, emerge.mtimedb |
opts, spinner = emerge.opts, emerge.spinner |
opts["--nodeps"] = True |
+ if new_portage: |
+ # When Portage launches new processes, it goes on a rampage and closes all |
+ # open file descriptors. Ask Portage not to do that, as it breaks us. |
+ portage.process.get_open_fds = lambda: [] |
while True: |
# Wait for a new item to show up on the queue. This is a blocking wait, |
# so if there's nothing to do, we just sit here. |
@@ -1420,8 +1431,13 @@ def EmergeWorker(task_queue, job_queue, emerge, package_db): |
try: |
sys.stdout = output |
sys.stderr = output |
- scheduler = Scheduler(settings, trees, mtimedb, opts, spinner, |
- install_list, [], emerge.scheduler_graph) |
+ if new_portage: |
+ emerge.scheduler_graph.mergelist = install_list |
+ scheduler = Scheduler(settings, trees, mtimedb, opts, spinner, |
+ favorites=[], graph_config=emerge.scheduler_graph) |
+ else: |
+ scheduler = Scheduler(settings, trees, mtimedb, opts, spinner, |
+ install_list, [], emerge.scheduler_graph) |
retcode = scheduler.merge() |
except Exception: |
traceback.print_exc(file=output) |