summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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