--- a/mercurial/util.py Thu Jul 13 18:31:35 2017 -0700
+++ b/mercurial/util.py Thu Jul 13 09:51:50 2017 -0700
@@ -3052,66 +3052,6 @@
yield path[:pos]
pos = path.rfind('/', 0, pos)
-class ctxmanager(object):
- '''A context manager for use in 'with' blocks to allow multiple
- contexts to be entered at once. This is both safer and more
- flexible than contextlib.nested.
-
- Once Mercurial supports Python 2.7+, this will become mostly
- unnecessary.
- '''
-
- def __init__(self, *args):
- '''Accepts a list of no-argument functions that return context
- managers. These will be invoked at __call__ time.'''
- self._pending = args
- self._atexit = []
-
- def __enter__(self):
- return self
-
- def enter(self):
- '''Create and enter context managers in the order in which they were
- passed to the constructor.'''
- values = []
- for func in self._pending:
- obj = func()
- values.append(obj.__enter__())
- self._atexit.append(obj.__exit__)
- del self._pending
- return values
-
- def atexit(self, func, *args, **kwargs):
- '''Add a function to call when this context manager exits. The
- ordering of multiple atexit calls is unspecified, save that
- they will happen before any __exit__ functions.'''
- def wrapper(exc_type, exc_val, exc_tb):
- func(*args, **kwargs)
- self._atexit.append(wrapper)
- return func
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- '''Context managers are exited in the reverse order from which
- they were created.'''
- received = exc_type is not None
- suppressed = False
- pending = None
- self._atexit.reverse()
- for exitfunc in self._atexit:
- try:
- if exitfunc(exc_type, exc_val, exc_tb):
- suppressed = True
- exc_type = None
- exc_val = None
- exc_tb = None
- except BaseException:
- pending = sys.exc_info()
- exc_type, exc_val, exc_tb = pending = sys.exc_info()
- del self._atexit
- if pending:
- raise exc_val
- return received and suppressed
-
# compression code
SERVERROLE = 'server'