summaryrefslogtreecommitdiffstats
path: root/lib/bb
diff options
context:
space:
mode:
authorChris Larson <chris_larson@mentor.com>2011-05-05 17:43:38 -0700
committerChris Larson <chris_larson@mentor.com>2011-05-16 12:39:42 -0700
commitee48d628ee038bd72e1cd94aa75f5ccbacbcee4c (patch)
treeb7eeea9d13b7cbe51d1a7a8aa44b1e3d2f0a9df8 /lib/bb
parentcae6bf031dc83ba0439d07584fdbbd4a962408a3 (diff)
downloadbitbake-ee48d628ee038bd72e1cd94aa75f5ccbacbcee4c.tar.gz
Shift exception formatting into the UI
Now we use bb.exceptions to pass pickleable traceback entries to the UI, and the UI is free to do whatever it wants to do with this information. By default, the log formatter for the UIs formats it with bb.exceptions. This also means that all exceptions should now show 3 lines of context and limit to 5 entries. Signed-off-by: Chris Larson <chris_larson@mentor.com>
Diffstat (limited to 'lib/bb')
-rw-r--r--lib/bb/cooker.py10
-rw-r--r--lib/bb/event.py6
-rw-r--r--lib/bb/msg.py10
3 files changed, 16 insertions, 10 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index 5d2f2a88e..e0e8bf55a 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -1125,7 +1125,7 @@ class CookerParser(object):
return False
except ParsingFailure as exc:
self.shutdown(clean=False)
- bb.fatal('Error parsing %s: %s' %
+ bb.fatal('Unable to parse %s: %s' %
(exc.recipe, bb.exceptions.to_string(exc.realexception)))
except bb.parse.ParseError as exc:
bb.fatal(str(exc))
@@ -1133,13 +1133,11 @@ class CookerParser(object):
logger.error('Unable to parse %s', exc.recipe)
sys.exit(1)
except Exception as exc:
- import traceback
etype, value, tb = sys.exc_info()
- formatted = bb.exceptions.format_extracted(value.traceback, limit=5)
- formatted.extend(traceback.format_exception_only(etype, value))
-
+ logger.error('Unable to parse %s', value.recipe,
+ exc_info=(etype, value, exc.traceback))
self.shutdown(clean=False)
- bb.fatal('Error parsing %s:\n%s' % (value.recipe, ''.join(formatted)))
+ sys.exit(1)
self.current += 1
self.virtuals += len(result)
diff --git a/lib/bb/event.py b/lib/bb/event.py
index daca0a770..16d936c1b 100644
--- a/lib/bb/event.py
+++ b/lib/bb/event.py
@@ -422,8 +422,10 @@ class LogHandler(logging.Handler):
def emit(self, record):
if record.exc_info:
- lines = traceback.format_exception(*record.exc_info, limit=5)
- record.msg += '\n%s' % ''.join(lines)
+ etype, value, tb = record.exc_info
+ if hasattr(tb, 'tb_next'):
+ tb = list(bb.exceptions.extract_traceback(tb, context=3))
+ record.bb_exc_info = (etype, value, tb)
record.exc_info = None
fire(record, None)
diff --git a/lib/bb/msg.py b/lib/bb/msg.py
index a7ac85079..12d19ff8e 100644
--- a/lib/bb/msg.py
+++ b/lib/bb/msg.py
@@ -65,9 +65,15 @@ class BBLogFormatter(logging.Formatter):
def format(self, record):
record.levelname = self.getLevelName(record.levelno)
if record.levelno == self.PLAIN:
- return record.getMessage()
+ msg = record.getMessage()
else:
- return logging.Formatter.format(self, record)
+ msg = logging.Formatter.format(self, record)
+
+ if hasattr(record, 'bb_exc_info'):
+ etype, value, tb = record.bb_exc_info
+ formatted = bb.exceptions.format_exception(etype, value, tb, limit=5)
+ msg += '\n' + ''.join(formatted)
+ return msg
class Loggers(dict):
def __getitem__(self, key):