summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/EbuildMerge.py
diff options
context:
space:
mode:
authorDavid James <davidjames@google.com>2011-03-24 19:36:33 -0700
committerZac Medico <zmedico@gentoo.org>2011-03-24 19:36:33 -0700
commit7535cabdf2fab76fc55df83643157613dfd66be9 (patch)
tree535e51878faa5359a7c186ca0aadfbe6ebcc02b2 /pym/_emerge/EbuildMerge.py
parent99ec2a8f810ae7ea2c76d928665ed1d02c2d9cc7 (diff)
downloadportage-7535cabdf2fab76fc55df83643157613dfd66be9.tar.gz
portage-7535cabdf2fab76fc55df83643157613dfd66be9.tar.bz2
portage-7535cabdf2fab76fc55df83643157613dfd66be9.zip
Merge packages asynchronously in Portage.
This allows for the scheduler to continue to run while packages are being merged and installed, allowing for additional parallelism and making better use of the CPUs. Review URL: http://codereview.chromium.org/6713043
Diffstat (limited to 'pym/_emerge/EbuildMerge.py')
-rw-r--r--pym/_emerge/EbuildMerge.py47
1 files changed, 28 insertions, 19 deletions
diff --git a/pym/_emerge/EbuildMerge.py b/pym/_emerge/EbuildMerge.py
index d73a262b3..6a5869270 100644
--- a/pym/_emerge/EbuildMerge.py
+++ b/pym/_emerge/EbuildMerge.py
@@ -4,6 +4,8 @@
from _emerge.SlotObject import SlotObject
import portage
from portage import os
+from portage.dbapi._MergeProcess import MergeProcess
+from portage.dbapi.vartree import dblink
class EbuildMerge(SlotObject):
@@ -11,28 +13,35 @@ class EbuildMerge(SlotObject):
"pkg", "pkg_count", "pkg_path", "pretend",
"scheduler", "settings", "tree", "world_atom")
- def execute(self):
+ def create_task(self):
root_config = self.pkg.root_config
settings = self.settings
- retval = portage.merge(settings["CATEGORY"],
- settings["PF"], settings["D"],
- os.path.join(settings["PORTAGE_BUILDDIR"],
- "build-info"), root_config.root, settings,
- myebuild=settings["EBUILD"],
- mytree=self.tree, mydbapi=root_config.trees[self.tree].dbapi,
- vartree=root_config.trees["vartree"],
- prev_mtimes=self.ldpath_mtimes,
- scheduler=self.scheduler,
- blockers=self.find_blockers)
-
- if retval == os.EX_OK:
- self.world_atom(self.pkg)
- self._log_success()
-
- return retval
-
- def _log_success(self):
+ mycat = settings["CATEGORY"]
+ mypkg = settings["PF"]
+ pkgloc = settings["D"]
+ infloc = os.path.join(settings["PORTAGE_BUILDDIR"], "build-info")
+ myroot = root_config.root
+ myebuild = settings["EBUILD"]
+ mydbapi = root_config.trees[self.tree].dbapi
+ vartree = root_config.trees["vartree"]
+ background = (settings.get('PORTAGE_BACKGROUND') == '1')
+ logfile = settings.get('PORTAGE_LOG_FILE')
+
+ merge_task = MergeProcess(
+ dblink=dblink, mycat=mycat, mypkg=mypkg, settings=settings,
+ treetype=self.tree, vartree=vartree, scheduler=self.scheduler,
+ background=background, blockers=self.find_blockers, pkgloc=pkgloc,
+ infloc=infloc, myebuild=myebuild, mydbapi=mydbapi,
+ prev_mtimes=self.ldpath_mtimes, logfile=logfile)
+ merge_task.addExitListener(self._log_exit)
+ return merge_task
+
+ def _log_exit(self, task):
+ if task.returncode != os.EX_OK:
+ return
+
pkg = self.pkg
+ self.world_atom(pkg)
pkg_count = self.pkg_count
pkg_path = self.pkg_path
logger = self.logger