Index: pym/portage/dbapi/vartree.py |
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py |
index ae26f7602735b909bcd1ae867000eb1376c07a27..85ff53dfa81f4eb468afff06b152c6eb54997627 100644 |
--- a/pym/portage/dbapi/vartree.py |
+++ b/pym/portage/dbapi/vartree.py |
@@ -13,7 +13,8 @@ portage.proxy.lazyimport.lazyimport(globals(), |
'portage.dbapi._MergeProcess:MergeProcess', |
'portage.dep:dep_getkey,isjustname,match_from_list,' + \ |
'use_reduce,_slot_re', |
- 'portage.elog:elog_process,_preload_elog_modules', |
+ 'portage.elog:collect_ebuild_messages,collect_messages,' + \ |
+ 'elog_process,_merge_logentries,_preload_elog_modules', |
'portage.locks:lockdir,unlockdir', |
'portage.output:bold,colorize', |
'portage.package.ebuild.doebuild:doebuild_environment,' + \ |
@@ -1200,7 +1201,7 @@ class dblink(object): |
_file_merge_yield_interval = 20 |
def __init__(self, cat, pkg, myroot=None, settings=None, treetype=None, |
- vartree=None, blockers=None, scheduler=None): |
+ vartree=None, blockers=None, scheduler=None, pipe=None): |
""" |
Creates a DBlink object for a given CPV. |
The given CPV may not be present in the database already. |
@@ -1259,6 +1260,7 @@ class dblink(object): |
self._md5_merge_map = {} |
self._hash_key = (self.myroot, self.mycpv) |
self._protect_obj = None |
+ self._pipe = pipe |
def __hash__(self): |
return hash(self._hash_key) |
@@ -1503,7 +1505,7 @@ class dblink(object): |
continue |
others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1], |
settings=self.settings, vartree=self.vartree, |
- treetype="vartree")) |
+ treetype="vartree", pipe=self._pipe)) |
retval = self._security_check([self] + others_in_slot) |
if retval: |
@@ -1667,9 +1669,7 @@ class dblink(object): |
self._eerror(ebuild_phase, msg_lines) |
- # process logs created during pre/postrm |
- elog_process(self.mycpv, self.settings, |
- phasefilter=('prerm', 'postrm')) |
+ self._elog_process() |
if retval == os.EX_OK: |
# myebuildpath might be None, so ensure |
@@ -1766,7 +1766,7 @@ class dblink(object): |
continue |
others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1], |
settings=self.settings, |
- vartree=self.vartree, treetype="vartree")) |
+ vartree=self.vartree, treetype="vartree", pipe=self._pipe)) |
dest_root = self._eroot |
dest_root_len = len(dest_root) - 1 |
@@ -2786,19 +2786,34 @@ class dblink(object): |
self._scheduler.dblinkElog(self, |
phase, _eerror, lines) |
- def _elog_subprocess(self, funcname, phase, lines): |
- """ |
- Subprocesses call this in order to create elog messages in |
- $T, for collection by the main process. |
- """ |
- cmd = "source %s/isolated-functions.sh ; " % \ |
- portage._shell_quote(self.settings["PORTAGE_BIN_PATH"]) |
- for line in lines: |
- cmd += "%s %s ; " % (funcname, portage._shell_quote(line)) |
- env = self.settings.environ() |
- env['EBUILD_PHASE'] = phase |
- subprocess.call([portage.const.BASH_BINARY, "-c", cmd], |
- env=env) |
+ def _elog_process(self): |
+ cpv = self.mycpv |
+ if self._pipe is None: |
+ elog_process(cpv, self.settings) |
+ else: |
+ logdir = os.path.join(self.settings["T"], "logging") |
+ ebuild_logentries = collect_ebuild_messages(logdir) |
+ py_logentries = collect_messages(key=cpv).get(cpv, {}) |
+ logentries = _merge_logentries(py_logentries, ebuild_logentries) |
+ funcnames = { |
+ "INFO": "einfo", |
+ "LOG": "elog", |
+ "WARN": "ewarn", |
+ "QA": "eqawarn", |
+ "ERROR": "eerror" |
+ } |
+ buffer = [] |
+ for phase, messages in logentries.items(): |
+ for key, lines in messages: |
+ funcname = funcnames[key] |
+ if isinstance(lines, basestring): |
+ lines = [lines] |
+ for line in lines: |
+ fields = (funcname, phase, cpv, line.rstrip('\n')) |
+ buffer.append(' '.join(fields)) |
+ buffer.append('\n') |
+ if buffer: |
+ os.write(self._pipe, ''.join(buffer)) |
def treewalk(self, srcroot, destroot, inforoot, myebuild, cleanup=0, |
mydbapi=None, prev_mtimes=None): |
@@ -2813,7 +2828,6 @@ class dblink(object): |
unmerges old version (if required) |
calls doebuild(mydo=pkg_postinst) |
calls env_update |
- calls elog_process |
@param srcroot: Typically this is ${D} |
@type srcroot: String (Path) |
@@ -2923,7 +2937,7 @@ class dblink(object): |
others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1], |
settings=config(clone=self.settings), |
vartree=self.vartree, treetype="vartree", |
- scheduler=self._scheduler)) |
+ scheduler=self._scheduler, pipe=self._pipe)) |
retval = self._security_check(others_in_slot) |
if retval: |
@@ -3071,8 +3085,6 @@ class dblink(object): |
# check for package collisions |
blockers = None |
if self._blockers is not None: |
- # This is only supposed to be called when |
- # the vdb is locked, like it is here. |
blockers = self._blockers() |
if blockers is None: |
blockers = [] |
@@ -3244,16 +3256,8 @@ class dblink(object): |
cfgfiledict["IGNORE"] = 1 |
break |
- merge_task = MergeProcess( |
- background=(self.settings.get('PORTAGE_BACKGROUND') == '1'), |
- cfgfiledict=cfgfiledict, conf_mem_file=conf_mem_file, dblink=self, |
- destroot=destroot, |
- logfile=self.settings.get('PORTAGE_LOG_FILE'), |
- scheduler=(scheduler or PollScheduler().sched_iface), |
- srcroot=srcroot) |
- |
- merge_task.start() |
- rval = merge_task.wait() |
+ rval = self._merge_contents(srcroot, destroot, cfgfiledict, |
+ conf_mem_file) |
if rval != os.EX_OK: |
return rval |
@@ -3454,7 +3458,7 @@ class dblink(object): |
return backup_p |
- def _merge_process(self, srcroot, destroot, cfgfiledict, conf_mem_file): |
+ def _merge_contents(self, srcroot, destroot, cfgfiledict, conf_mem_file): |
cfgfiledict_orig = cfgfiledict.copy() |
@@ -3683,7 +3687,7 @@ class dblink(object): |
msg.append(_("This file will be renamed to a different name:")) |
msg.append(" '%s'" % backup_dest) |
msg.append("") |
- self._elog_subprocess("eerror", "preinst", msg) |
+ self._eerror("preinst", msg) |
if movefile(mydest, backup_dest, |
mysettings=self.settings, |
encoding=_encodings['merge']) is None: |
@@ -3761,7 +3765,7 @@ class dblink(object): |
msg.append(_("This file will be merged with a different name:")) |
msg.append(" '%s'" % newdest) |
msg.append("") |
- self._elog_subprocess("eerror", "preinst", msg) |
+ self._eerror("preinst", msg) |
mydest = newdest |
elif stat.S_ISREG(mydmode) or (stat.S_ISLNK(mydmode) and os.path.exists(mydest) and stat.S_ISREG(os.stat(mydest)[stat.ST_MODE])): |
@@ -3945,7 +3949,7 @@ class dblink(object): |
self._scheduler.dblinkEbuildPhase( |
self, mydbapi, myebuild, phase) |
- elog_process(self.mycpv, self.settings) |
+ self._elog_process() |
if 'noclean' not in self.settings.features and \ |
(retval == os.EX_OK or \ |
@@ -4045,10 +4049,16 @@ def merge(mycat, mypkg, pkgloc, infloc, |
writemsg(_("Permission denied: access('%s', W_OK)\n") % settings['EROOT'], |
noiselevel=-1) |
return errno.EACCES |
- mylink = dblink(mycat, mypkg, settings=settings, treetype=mytree, |
- vartree=vartree, blockers=blockers, scheduler=scheduler) |
- return mylink.merge(pkgloc, infloc, myebuild=myebuild, |
- mydbapi=mydbapi, prev_mtimes=prev_mtimes) |
+ background = (settings.get('PORTAGE_BACKGROUND') == '1') |
+ merge_task = MergeProcess( |
+ dblink=dblink, mycat=mycat, mypkg=mypkg, settings=settings, |
+ treetype=mytree, vartree=vartree, scheduler=scheduler, |
+ background=background, blockers=blockers, pkgloc=pkgloc, |
+ infloc=infloc, myebuild=myebuild, mydbapi=mydbapi, |
+ prev_mtimes=prev_mtimes, logfile=settings.get('PORTAGE_LOG_FILE')) |
+ merge_task.start() |
+ retcode = merge_task.wait() |
+ return retcode |
def unmerge(cat, pkg, myroot=None, settings=None, |
mytrimworld=None, vartree=None, |