diff options
author | Chris Larson <chris_larson@mentor.com> | 2011-05-05 17:43:38 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-06-08 20:38:25 +0100 |
commit | 96e2ee1d730fa19665cca34c2cc3deb3fa5dfd2d (patch) | |
tree | 9c75b5c023be0bb02681d09cf42b1d4f358364c4 /bitbake | |
parent | a3efbb96f23a222c58f2f4114a75d2f98d7da11f (diff) | |
download | poky-96e2ee1d730fa19665cca34c2cc3deb3fa5dfd2d.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.
(Bitbake rev: ee48d628ee038bd72e1cd94aa75f5ccbacbcee4c)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 10 | ||||
-rw-r--r-- | bitbake/lib/bb/event.py | 7 | ||||
-rw-r--r-- | bitbake/lib/bb/msg.py | 10 |
3 files changed, 19 insertions, 8 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index a15b81f233..641a839810 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -1225,7 +1225,7 @@ class CookerParser(object): | |||
1225 | raise | 1225 | raise |
1226 | except ParsingFailure as exc: | 1226 | except ParsingFailure as exc: |
1227 | self.shutdown(clean=False) | 1227 | self.shutdown(clean=False) |
1228 | bb.fatal('Error parsing %s: %s' % | 1228 | bb.fatal('Unable to parse %s: %s' % |
1229 | (exc.recipe, bb.exceptions.to_string(exc.realexception))) | 1229 | (exc.recipe, bb.exceptions.to_string(exc.realexception))) |
1230 | except bb.parse.ParseError as exc: | 1230 | except bb.parse.ParseError as exc: |
1231 | bb.fatal(str(exc)) | 1231 | bb.fatal(str(exc)) |
@@ -1233,13 +1233,11 @@ class CookerParser(object): | |||
1233 | logger.error('Unable to parse %s', exc.recipe) | 1233 | logger.error('Unable to parse %s', exc.recipe) |
1234 | sys.exit(1) | 1234 | sys.exit(1) |
1235 | except Exception as exc: | 1235 | except Exception as exc: |
1236 | import traceback | ||
1237 | etype, value, tb = sys.exc_info() | 1236 | etype, value, tb = sys.exc_info() |
1238 | formatted = bb.exceptions.format_extracted(value.traceback, limit=5) | 1237 | logger.error('Unable to parse %s', value.recipe, |
1239 | formatted.extend(traceback.format_exception_only(etype, value)) | 1238 | exc_info=(etype, value, exc.traceback)) |
1240 | |||
1241 | self.shutdown(clean=False) | 1239 | self.shutdown(clean=False) |
1242 | bb.fatal('Error parsing %s:\n%s' % (value.recipe, ''.join(formatted))) | 1240 | sys.exit(1) |
1243 | 1241 | ||
1244 | self.current += 1 | 1242 | self.current += 1 |
1245 | self.virtuals += len(result) | 1243 | self.virtuals += len(result) |
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 4ff530fcb4..a3288b619b 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
@@ -30,6 +30,7 @@ except ImportError: | |||
30 | import pickle | 30 | import pickle |
31 | import logging | 31 | import logging |
32 | import atexit | 32 | import atexit |
33 | import traceback | ||
33 | import bb.utils | 34 | import bb.utils |
34 | 35 | ||
35 | # This is the pid for which we should generate the event. This is set when | 36 | # This is the pid for which we should generate the event. This is set when |
@@ -423,6 +424,12 @@ class LogHandler(logging.Handler): | |||
423 | """Dispatch logging messages as bitbake events""" | 424 | """Dispatch logging messages as bitbake events""" |
424 | 425 | ||
425 | def emit(self, record): | 426 | def emit(self, record): |
427 | if record.exc_info: | ||
428 | etype, value, tb = record.exc_info | ||
429 | if hasattr(tb, 'tb_next'): | ||
430 | tb = list(bb.exceptions.extract_traceback(tb, context=3)) | ||
431 | record.bb_exc_info = (etype, value, tb) | ||
432 | record.exc_info = None | ||
426 | fire(record, None) | 433 | fire(record, None) |
427 | 434 | ||
428 | def filter(self, record): | 435 | def filter(self, record): |
diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index a7ac850790..12d19ff8e1 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py | |||
@@ -65,9 +65,15 @@ class BBLogFormatter(logging.Formatter): | |||
65 | def format(self, record): | 65 | def format(self, record): |
66 | record.levelname = self.getLevelName(record.levelno) | 66 | record.levelname = self.getLevelName(record.levelno) |
67 | if record.levelno == self.PLAIN: | 67 | if record.levelno == self.PLAIN: |
68 | return record.getMessage() | 68 | msg = record.getMessage() |
69 | else: | 69 | else: |
70 | return logging.Formatter.format(self, record) | 70 | msg = logging.Formatter.format(self, record) |
71 | |||
72 | if hasattr(record, 'bb_exc_info'): | ||
73 | etype, value, tb = record.bb_exc_info | ||
74 | formatted = bb.exceptions.format_exception(etype, value, tb, limit=5) | ||
75 | msg += '\n' + ''.join(formatted) | ||
76 | return msg | ||
71 | 77 | ||
72 | class Loggers(dict): | 78 | class Loggers(dict): |
73 | def __getitem__(self, key): | 79 | def __getitem__(self, key): |