summaryrefslogtreecommitdiffstats
path: root/pym/portage
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-07-14 03:47:47 +0000
committerZac Medico <zmedico@gentoo.org>2008-07-14 03:47:47 +0000
commit698bbf0e9c210c978d7e953306a59c1a25a00ac5 (patch)
tree66a88108e6d4ab8f0344f1bb67fe6cb6251af5af /pym/portage
parentd1de3afcb5558e2968bc35922e70ad0a306e61ec (diff)
downloadportage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.tar.gz
portage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.tar.bz2
portage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.zip
Add async execution support for pkg_preinst and pkg_postinst. This allows the
scheduler's poll loop to run so that other parallel tasks aren't starved for output handling while pkg_preinst and pkg_postinst are executing. svn path=/main/trunk/; revision=11044
Diffstat (limited to 'pym/portage')
-rw-r--r--pym/portage/__init__.py5
-rw-r--r--pym/portage/dbapi/vartree.py36
2 files changed, 28 insertions, 13 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 4031f64cc..fd4d14b2f 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -5727,13 +5727,14 @@ def movefile(src,dest,newmtime=None,sstat=None,mysettings=None):
return newmtime
def merge(mycat, mypkg, pkgloc, infloc, myroot, mysettings, myebuild=None,
- mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None):
+ mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None,
+ scheduler=None):
if not os.access(myroot, os.W_OK):
writemsg("Permission denied: access('%s', W_OK)\n" % myroot,
noiselevel=-1)
return errno.EACCES
mylink = dblink(mycat, mypkg, myroot, mysettings, treetype=mytree,
- vartree=vartree, blockers=blockers)
+ vartree=vartree, blockers=blockers, scheduler=scheduler)
return mylink.merge(pkgloc, infloc, myroot, myebuild,
mydbapi=mydbapi, prev_mtimes=prev_mtimes)
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 50aadc898..fdb16a225 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -1282,7 +1282,7 @@ class dblink(object):
}
def __init__(self, cat, pkg, myroot, mysettings, treetype=None,
- vartree=None, blockers=None):
+ vartree=None, blockers=None, scheduler=None):
"""
Creates a DBlink object for a given CPV.
The given CPV may not be present in the database already.
@@ -1312,6 +1312,7 @@ class dblink(object):
vartree = db[myroot]["vartree"]
self.vartree = vartree
self._blockers = blockers
+ self._scheduler = scheduler
self.dbroot = normalize_path(os.path.join(myroot, VDB_PATH))
self.dbcatdir = self.dbroot+"/"+cat
@@ -2379,7 +2380,7 @@ class dblink(object):
# we need it to have private ${T} etc... for things like elog.
others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1],
self.vartree.root, config(clone=self.settings),
- vartree=self.vartree))
+ vartree=self.vartree, scheduler=self._scheduler))
retval = self._security_check(others_in_slot)
if retval:
return retval
@@ -2550,8 +2551,6 @@ class dblink(object):
if collision_protect:
return 1
- writemsg_stdout(">>> Merging %s to %s\n" % (self.mycpv, destroot))
-
# The merge process may move files out of the image directory,
# which causes invalidation of the .installed flag.
try:
@@ -2566,10 +2565,17 @@ class dblink(object):
self.delete()
ensure_dirs(self.dbtmpdir)
+ scheduler = self._scheduler
+
# run preinst script
- a = doebuild(myebuild, "preinst", destroot, self.settings,
- use_cache=0, tree=self.treetype, mydbapi=mydbapi,
- vartree=self.vartree)
+ if scheduler is None:
+ writemsg_stdout(">>> Merging %s to %s\n" % (self.mycpv, destroot))
+ a = doebuild(myebuild, "preinst", destroot, self.settings,
+ use_cache=0, tree=self.treetype, mydbapi=mydbapi,
+ vartree=self.vartree)
+ else:
+ a = scheduler.dblinkEbuildPhase(
+ self, mydbapi, myebuild, "preinst")
# XXX: Decide how to handle failures here.
if a != os.EX_OK:
@@ -2722,9 +2728,18 @@ class dblink(object):
self.settings["PORTAGE_UPDATE_ENV"] = \
os.path.join(self.dbpkgdir, "environment.bz2")
self.settings.backup_changes("PORTAGE_UPDATE_ENV")
- a = doebuild(myebuild, "postinst", destroot, self.settings, use_cache=0,
- tree=self.treetype, mydbapi=mydbapi, vartree=self.vartree)
- self.settings.pop("PORTAGE_UPDATE_ENV", None)
+ try:
+ if scheduler is None:
+ a = doebuild(myebuild, "postinst", destroot, self.settings,
+ use_cache=0, tree=self.treetype, mydbapi=mydbapi,
+ vartree=self.vartree)
+ if a == os.EX_OK:
+ writemsg_stdout(">>> %s %s\n" % (self.mycpv, "merged."))
+ else:
+ a = scheduler.dblinkEbuildPhase(
+ self, mydbapi, myebuild, "postinst")
+ finally:
+ self.settings.pop("PORTAGE_UPDATE_ENV", None)
# XXX: Decide how to handle failures here.
if a != os.EX_OK:
@@ -2741,7 +2756,6 @@ class dblink(object):
target_root=self.settings["ROOT"], prev_mtimes=prev_mtimes,
contents=contents, env=self.settings.environ())
- writemsg_stdout(">>> %s %s\n" % (self.mycpv,"merged."))
return os.EX_OK
def mergeme(self, srcroot, destroot, outfile, secondhand, stufftomerge, cfgfiledict, thismtime):