if py3:
# pylint: disable=unused-import
+ from contextlib import ExitStack, nullcontext
from os import environb as environ
from os import fsdecode, fsencode
from shlex import quote
"""
def __init__(self, ex, rethrow=True):
+ self.closed = False
self.ex = ex
self.rethrow = rethrow
def __enter__(self):
return None
def __exit__(self, exc_type, exc_value, traceback):
+ self.closed = True
if not exc_type and self.ex and self.rethrow:
raise self.ex
+ def __del__(self):
+ assert self.closed
def items(x):
return x.items()
else: # Python 2
+ from contextlib import contextmanager
+
ModuleNotFoundError = ImportError
def fsdecode(x):
# pylint: disable=unused-import
from bup.py2raise import reraise
+ @contextmanager
+ def nullcontext(enter_result=None):
+ yield enter_result
+
# on py3 this causes errors, obviously
# pylint: disable=undefined-variable
input = raw_input
"""
def __init__(self, ex, rethrow=True):
+ self.closed = False
self.ex = ex
self.rethrow = rethrow
def __enter__(self):
if self.ex:
add_ex_tb(self.ex)
def __exit__(self, exc_type, exc_value, traceback):
+ self.closed = True
if exc_value:
if self.ex:
add_ex_tb(exc_value)
return
if self.rethrow and self.ex:
raise self.ex
+ def __del__(self):
+ assert self.closed
def dump_traceback(ex):
stack = [ex]
tb = getattr(ex, '__traceback__', None)
print_exception(type(ex), ex, tb)
+ class ExitStack:
+ def __init__(self):
+ self.contexts = []
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, value_type, value, traceback):
+ init_value = value
+ for ctx in reversed(self.contexts):
+ try:
+ ctx.__exit__(value_type, value, traceback)
+ except BaseException as ex:
+ add_ex_tb(ex)
+ if value:
+ add_ex_ctx(ex, value)
+ value_type = type(ex)
+ value = ex
+ traceback = ex.__traceback__
+ if value is not init_value:
+ raise value
+
+ def enter_context(self, x):
+ self.contexts.append(x)
+
def items(x):
return x.iteritems()