aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Laplante <chris.laplante@agilent.com>2019-06-07 14:24:03 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-06-11 10:08:03 +0100
commitbf522ad3e0c52cdb69b406226840d870ff4f2766 (patch)
tree7a561dabbd7027cbe7e9449c224ac408a63f71bb
parenta841efa50d3aaf7c57446806327b2b687371cb29 (diff)
downloadbitbake-bf522ad3e0c52cdb69b406226840d870ff4f2766.tar.gz
build/progress: use context managers for progress handlers
It seems context management support was half-implemented, but never finished. For example, LogTee has __enter__ and __exit__ but they haven't been exercised until now. Signed-off-by: Chris Laplante <chris.laplante@agilent.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/build.py31
-rw-r--r--lib/bb/progress.py16
2 files changed, 42 insertions, 5 deletions
diff --git a/lib/bb/build.py b/lib/bb/build.py
index a0a764a7c..85ad8ea68 100644
--- a/lib/bb/build.py
+++ b/lib/bb/build.py
@@ -163,12 +163,35 @@ class LogTee(object):
def __repr__(self):
return '<LogTee {0}>'.format(self.name)
+
def flush(self):
self.outfile.flush()
+
+class StdoutNoopContextManager:
+ """
+ This class acts like sys.stdout, but adds noop __enter__ and __exit__ methods.
+ """
+ def __enter__(self):
+ return sys.stdout
+
+ def __exit__(self, *exc_info):
+ pass
+
+ def write(self, string):
+ return sys.stdout.write(string)
+
+ def flush(self):
+ sys.stdout.flush()
+
+ @property
+ def name(self):
+ return sys.stdout.name
+
+
#
# pythonexception allows the python exceptions generated to be raised
-# as the real exceptions (not FuncFailed) and without a backtrace at the
+# as the real exceptions (not FuncFailed) and without a backtrace at the
# origin of the failure.
#
def exec_func(func, d, dirs = None, pythonexception=False):
@@ -375,9 +398,9 @@ exit $ret
cmd = [fakerootcmd, runfile]
if bb.msg.loggerDefaultVerbose:
- logfile = LogTee(logger, sys.stdout)
+ logfile = LogTee(logger, StdoutNoopContextManager())
else:
- logfile = sys.stdout
+ logfile = StdoutNoopContextManager()
progress = d.getVarFlag(func, 'progress')
if progress:
@@ -433,7 +456,7 @@ exit $ret
bb.debug(2, "Executing shell function %s" % func)
try:
- with open(os.devnull, 'r+') as stdin:
+ with open(os.devnull, 'r+') as stdin, logfile:
bb.process.run(cmd, shell=False, stdin=stdin, log=logfile, extrafiles=[(fifo,readfifo)])
except bb.process.CmdError:
logfn = d.getVar('BB_LOGFILE')
diff --git a/lib/bb/progress.py b/lib/bb/progress.py
index e9b72e28b..4022caa71 100644
--- a/lib/bb/progress.py
+++ b/lib/bb/progress.py
@@ -13,6 +13,7 @@ import time
import inspect
import bb.event
import bb.build
+from bb.build import StdoutNoopContextManager
class ProgressHandler(object):
"""
@@ -27,7 +28,14 @@ class ProgressHandler(object):
if outfile:
self._outfile = outfile
else:
- self._outfile = sys.stdout
+ self._outfile = StdoutNoopContextManager()
+
+ def __enter__(self):
+ self._outfile.__enter__()
+ return self
+
+ def __exit__(self, *excinfo):
+ self._outfile.__exit__(*excinfo)
def _fire_progress(self, taskprogress, rate=None):
"""Internal function to fire the progress event"""
@@ -147,6 +155,12 @@ class MultiStageProgressReporter(object):
self._stage_total = None
self._callers = []
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *excinfo):
+ pass
+
def _fire_progress(self, taskprogress):
bb.event.fire(bb.build.TaskProgress(taskprogress), self._data)