/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/cleanup.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-12-18 10:09:49 UTC
  • mfrom: (4871.5.4 admin-guide-submit)
  • Revision ID: pqm@pqm.ubuntu.com-20091218100949-2c1ityvnbqjtdf3g
(nmb) Add backup section to admin-guide

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
31
31
If you want to be certain that the first, and only the first, error is raised,
32
32
then use::
33
33
 
34
 
    operation = OperationWithCleanups(do_something)
 
34
    operation = OperationWithCleanups(lambda operation: do_something())
35
35
    operation.add_cleanup(cleanup_something)
36
 
    operation.run_simple()
 
36
    operation.run()
37
37
 
38
38
This is more inconvenient (because you need to make every try block a
39
39
function), but will ensure that the first error encountered is the one raised,
78
78
        _run_cleanup(func, *args, **kwargs)
79
79
 
80
80
 
81
 
class ObjectWithCleanups(object):
82
 
    """A mixin for objects that hold a cleanup list.
83
 
 
84
 
    Subclass or client code can call add_cleanup and then later `cleanup_now`.
85
 
    """
86
 
    def __init__(self):
87
 
        self.cleanups = deque()
88
 
 
89
 
    def add_cleanup(self, cleanup_func, *args, **kwargs):
90
 
        """Add a cleanup to run.
91
 
 
92
 
        Cleanups may be added at any time.  
93
 
        Cleanups will be executed in LIFO order.
94
 
        """
95
 
        self.cleanups.appendleft((cleanup_func, args, kwargs))
96
 
 
97
 
    def cleanup_now(self):
98
 
        _run_cleanups(self.cleanups)
99
 
        self.cleanups.clear()
100
 
 
101
 
 
102
 
class OperationWithCleanups(ObjectWithCleanups):
 
81
class OperationWithCleanups(object):
103
82
    """A way to run some code with a dynamic cleanup list.
104
83
 
105
84
    This provides a way to add cleanups while the function-with-cleanups is
112
91
 
113
92
    where `some_func` is::
114
93
 
115
 
        def some_func(operation, args, ...):
 
94
        def some_func(operation, args, ...)
116
95
            do_something()
117
96
            operation.add_cleanup(something)
118
97
            # etc
119
98
 
120
99
    Note that the first argument passed to `some_func` will be the
121
 
    OperationWithCleanups object.  To invoke `some_func` without that, use
122
 
    `run_simple` instead of `run`.
 
100
    OperationWithCleanups object.
123
101
    """
124
102
 
125
103
    def __init__(self, func):
126
 
        super(OperationWithCleanups, self).__init__()
127
104
        self.func = func
 
105
        self.cleanups = deque()
 
106
 
 
107
    def add_cleanup(self, cleanup_func, *args, **kwargs):
 
108
        """Add a cleanup to run.
 
109
 
 
110
        Cleanups may be added at any time before or during the execution of
 
111
        self.func.  Cleanups will be executed in LIFO order.
 
112
        """
 
113
        self.cleanups.appendleft((cleanup_func, args, kwargs))
128
114
 
129
115
    def run(self, *args, **kwargs):
130
116
        return _do_with_cleanups(
131
117
            self.cleanups, self.func, self, *args, **kwargs)
132
118
 
133
 
    def run_simple(self, *args, **kwargs):
134
 
        return _do_with_cleanups(
135
 
            self.cleanups, self.func, *args, **kwargs)
136
 
 
137
119
 
138
120
def _do_with_cleanups(cleanup_funcs, func, *args, **kwargs):
139
121
    """Run `func`, then call all the cleanup_funcs.