summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/exceptions.py
diff options
context:
space:
mode:
authorChris Larson <chris_larson@mentor.com>2011-05-05 16:53:52 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-06-08 20:38:23 +0100
commit22522d5f0db604674f48998bd8a057e50a70a17d (patch)
treeeb5417af4476cb93f0790563575fc96566107d95 /bitbake/lib/bb/exceptions.py
parent83708e43c2cd647dfded66338bfa61ea2000d030 (diff)
downloadpoky-22522d5f0db604674f48998bd8a057e50a70a17d.tar.gz
bb.exceptions: add code to create pickleable traceback entries
This lets you get as much useful information as possible from traceback entries while staying pickleable. In addition, it has improved traceback formatting. It shows the values of the arguments for the functions, lines of context from the file for the code, and has an optional formatter to do things like syntax highlighting for the code lines. (Bitbake rev: ad8ad3fcae29eafbdc09286984495d693a4b73ef) Signed-off-by: Chris Larson <chris_larson@mentor.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/exceptions.py')
-rw-r--r--bitbake/lib/bb/exceptions.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/bitbake/lib/bb/exceptions.py b/bitbake/lib/bb/exceptions.py
new file mode 100644
index 0000000000..13269de8c1
--- /dev/null
+++ b/bitbake/lib/bb/exceptions.py
@@ -0,0 +1,55 @@
1from __future__ import absolute_import
2import inspect
3import traceback
4import bb.namedtuple_with_abc
5from collections import namedtuple
6
7
8class TracebackEntry(namedtuple.abc):
9 """Pickleable representation of a traceback entry"""
10 _fields = 'filename lineno function args code_context index'
11 _header = ' File "{0.filename}", line {0.lineno}, in {0.function}{0.args}:\n'
12
13 def format(self, formatter=None):
14 formatted = [self._header.format(self)]
15
16 for lineindex, line in enumerate(self.code_context):
17 if formatter:
18 line = formatter(line)
19
20 if lineindex == self.index:
21 formatted.append(' >%s' % line)
22 else:
23 formatted.append(' %s' % line)
24 return formatted
25
26 def __str__(self):
27 return ''.join(self.format())
28
29
30def extract_traceback(tb, context=1):
31 frames = inspect.getinnerframes(tb, context)
32 for frame, filename, lineno, function, code_context, index in frames:
33 args = inspect.formatargvalues(*inspect.getargvalues(frame))
34 yield TracebackEntry(filename, lineno, function, args, code_context, index)
35
36
37def format_extracted(extracted, formatter=None, limit=None):
38 if limit:
39 extracted = extracted[-limit:]
40
41 formatted = []
42 for tracebackinfo in extracted:
43 formatted.extend(tracebackinfo.format(formatter))
44 return formatted
45
46
47def format_exception(etype, value, tb, context=1, limit=None, formatter=None):
48 formatted = ['Traceback (most recent call last):\n']
49
50 if hasattr(tb, 'tb_next'):
51 tb = extract_traceback(tb, context)
52
53 formatted.extend(format_extracted(tb, formatter, limit))
54 formatted.extend(traceback.format_exception_only(etype, value))
55 return formatted