/breezy/unstable

To get this branch, use:
bzr branch https://code.breezy-vcs.org/breezy/unstable

« back to all changes in this revision

Viewing changes to breezy/cleanup.py

  • Committer: Jelmer Vernooij
  • Date: 2017-05-24 01:39:33 UTC
  • mfrom: (3815.3776.6)
  • Revision ID: jelmer@jelmer.uk-20170524013933-ir4y4tqtrsiz2ka2
New upstream snapshot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
 
46
46
from collections import deque
47
47
import sys
48
 
from bzrlib import (
 
48
from . import (
49
49
    debug,
50
50
    trace,
51
51
    )
67
67
        func(*args, **kwargs)
68
68
    except KeyboardInterrupt:
69
69
        raise
70
 
    except Exception, exc:
 
70
    except Exception as exc:
71
71
        _log_cleanup_error(exc)
72
72
        return False
73
73
    return True
161
161
    Unike `_run_cleanup`, `_do_with_cleanups` can propagate an exception from a
162
162
    cleanup, but only if there is no exception from func.
163
163
    """
164
 
    # As correct as Python 2.4 allows.
165
164
    try:
166
165
        result = func(*args, **kwargs)
167
166
    except:
168
167
        # We have an exception from func already, so suppress cleanup errors.
169
168
        _run_cleanups(cleanup_funcs)
170
169
        raise
171
 
    else:
172
 
        # No exception from func, so allow the first exception from
173
 
        # cleanup_funcs to propagate if one occurs (but only after running all
174
 
        # of them).
175
 
        exc_info = None
176
 
        for cleanup, c_args, c_kwargs in cleanup_funcs:
177
 
            # XXX: Hmm, if KeyboardInterrupt arrives at exactly this line, we
178
 
            # won't run all cleanups... perhaps we should temporarily install a
179
 
            # SIGINT handler?
180
 
            if exc_info is None:
181
 
                try:
182
 
                    cleanup(*c_args, **c_kwargs)
183
 
                except:
184
 
                    # This is the first cleanup to fail, so remember its
185
 
                    # details.
186
 
                    exc_info = sys.exc_info()
187
 
            else:
188
 
                # We already have an exception to propagate, so log any errors
189
 
                # but don't propagate them.
190
 
                _run_cleanup(cleanup, *c_args, **kwargs)
191
 
        if exc_info is not None:
192
 
            try:
193
 
                raise exc_info[0], exc_info[1], exc_info[2]
194
 
            finally:
195
 
                del exc_info
196
 
        # No error, so we can return the result
197
 
        return result
198
 
 
199
 
 
 
170
    # No exception from func, so allow first cleanup error to propgate.
 
171
    pending_cleanups = iter(cleanup_funcs)
 
172
    try:
 
173
        for cleanup, c_args, c_kwargs in pending_cleanups:
 
174
            cleanup(*c_args, **c_kwargs)
 
175
    except:
 
176
        # Still run the remaining cleanups but suppress any further errors.
 
177
        _run_cleanups(pending_cleanups)
 
178
        raise
 
179
    # No error, so we can return the result
 
180
    return result