from __future__ import absolute_import, print_function
-from array import array
from binascii import hexlify
from traceback import print_exception
import os, sys
if py3:
+ # pylint: disable=unused-import
from os import environb as environ
from os import fsdecode, fsencode
from shlex import quote
+ # pylint: disable=undefined-variable
+ # (for python2 looking here)
ModuleNotFoundError = ModuleNotFoundError
input = input
range = range
return ex
class pending_raise:
- """Rethrow either the provided ex, or any exception raised by the with
- statement body. (Supports Python 2 compatibility.)
+ """If rethrow is true, rethrow ex (if any), unless the body throws.
+
+ (Supports Python 2 compatibility.)
"""
- def __init__(self, ex):
+ def __init__(self, ex, rethrow=True):
self.ex = ex
+ self.rethrow = rethrow
def __enter__(self):
return None
def __exit__(self, exc_type, exc_value, traceback):
- if not exc_type:
+ if not exc_type and self.ex and self.rethrow:
raise self.ex
- return None
def items(x):
return x.items()
return x
from pipes import quote
+ # pylint: disable=unused-import
from os import environ, getcwd
+ # pylint: disable=unused-import
from bup.py2raise import reraise
+ # on py3 this causes errors, obviously
+ # pylint: disable=undefined-variable
input = raw_input
+ # pylint: disable=undefined-variable
range = xrange
+ # pylint: disable=undefined-variable
str_type = basestring
+ # pylint: disable=undefined-variable
int_types = (int, long)
hexstr = hexlify
return ex
class pending_raise:
- """Rethrow either the provided ex, or any exception raised by the with
- statement body, after making ex the __context__ of the newer
- exception (assuming there's no existing __context__). Ensure
- the exceptions have __tracebacks__. (Supports Python 2
- compatibility.)
+ """If rethrow is true, rethrow ex (if any), unless the body throws.
+
+ If the body does throw, make any provided ex the __context__
+ of the newer exception (assuming there's no existing
+ __context__). Ensure the exceptions have __tracebacks__.
+ (Supports Python 2 compatibility.)
"""
- def __init__(self, ex):
+ def __init__(self, ex, rethrow=True):
self.ex = ex
+ self.rethrow = rethrow
def __enter__(self):
- add_ex_tb(self.ex)
- return None
+ if self.ex:
+ add_ex_tb(self.ex)
def __exit__(self, exc_type, exc_value, traceback):
- if not exc_type:
+ if exc_value:
+ if self.ex:
+ add_ex_tb(exc_value)
+ add_ex_ctx(exc_value, self.ex)
+ return
+ if self.rethrow and self.ex:
raise self.ex
- add_ex_tb(exc_value)
- add_ex_ctx(exc_value, self.ex)
- return None
def dump_traceback(ex):
stack = [ex]