~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-03-25 00:02:51 UTC
  • mfrom: (5106.1.1 version-bump)
  • Revision ID: pqm@pqm.ubuntu.com-20100325000251-bwsv5c5d3l9x3lnn
(Jelmer) Bump API version for 2.2.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
 
17
18
"""Progress indicators.
18
19
 
19
20
The usual way to use this is via bzrlib.ui.ui_factory.nested_progress_bar which
20
21
will manage a conceptual stack of nested activities.
21
22
"""
22
23
 
23
 
from __future__ import absolute_import
24
24
 
 
25
import sys
25
26
import time
26
27
import os
27
28
 
28
29
 
 
30
from bzrlib import (
 
31
    errors,
 
32
    )
 
33
from bzrlib.trace import mutter
 
34
from bzrlib.symbol_versioning import (
 
35
    deprecated_function,
 
36
    deprecated_in,
 
37
    deprecated_method,
 
38
    )
 
39
 
 
40
 
29
41
def _supports_progress(f):
30
42
    """Detect if we can use pretty progress bars on file F.
31
43
 
58
70
    Code updating the task may also set fields as hints about how to display
59
71
    it: show_pct, show_spinner, show_eta, show_count, show_bar.  UIs
60
72
    will not necessarily respect all these fields.
61
 
 
62
 
    The message given when updating a task must be unicode, not bytes.
63
 
 
 
73
    
64
74
    :ivar update_latency: The interval (in seconds) at which the PB should be
65
75
        updated.  Setting this to zero suggests every update should be shown
66
76
        synchronously.
108
118
            self.msg)
109
119
 
110
120
    def update(self, msg, current_cnt=None, total_cnt=None):
111
 
        """Report updated task message and if relevent progress counters
112
 
 
113
 
        The message given must be unicode, not a byte string.
114
 
        """
115
121
        self.msg = msg
116
122
        self.current_cnt = current_cnt
117
123
        if total_cnt:
151
157
                own_fraction = 0.0
152
158
            return self._parent_task._overall_completion_fraction(own_fraction)
153
159
 
 
160
    @deprecated_method(deprecated_in((2, 1, 0)))
 
161
    def note(self, fmt_string, *args):
 
162
        """Record a note without disrupting the progress bar.
 
163
        
 
164
        Deprecated: use ui_factory.note() instead or bzrlib.trace.  Note that
 
165
        ui_factory.note takes just one string as the argument, not a format
 
166
        string and arguments.
 
167
        """
 
168
        if args:
 
169
            self.ui_factory.note(fmt_string % args)
 
170
        else:
 
171
            self.ui_factory.note(fmt_string)
 
172
 
154
173
    def clear(self):
155
174
        # TODO: deprecate this method; the model object shouldn't be concerned
156
175
        # with whether it's shown or not.  Most callers use this because they
165
184
            self.ui_factory.clear_term()
166
185
 
167
186
 
 
187
# NOTE: This is also deprecated; you should provide a ProgressView instead.
 
188
class _BaseProgressBar(object):
 
189
 
 
190
    def __init__(self,
 
191
                 to_file=None,
 
192
                 show_pct=False,
 
193
                 show_spinner=False,
 
194
                 show_eta=False,
 
195
                 show_bar=True,
 
196
                 show_count=True,
 
197
                 to_messages_file=None,
 
198
                 _stack=None):
 
199
        object.__init__(self)
 
200
        if to_file is None:
 
201
            to_file = sys.stderr
 
202
        if to_messages_file is None:
 
203
            to_messages_file = sys.stdout
 
204
        self.to_file = to_file
 
205
        self.to_messages_file = to_messages_file
 
206
        self.last_msg = None
 
207
        self.last_cnt = None
 
208
        self.last_total = None
 
209
        self.show_pct = show_pct
 
210
        self.show_spinner = show_spinner
 
211
        self.show_eta = show_eta
 
212
        self.show_bar = show_bar
 
213
        self.show_count = show_count
 
214
        self._stack = _stack
 
215
        # seed throttler
 
216
        self.MIN_PAUSE = 0.1 # seconds
 
217
        now = time.time()
 
218
        # starting now
 
219
        self.start_time = now
 
220
        # next update should not throttle
 
221
        self.last_update = now - self.MIN_PAUSE - 1
 
222
 
 
223
    def finished(self):
 
224
        """Return this bar to its progress stack."""
 
225
        self.clear()
 
226
        self._stack.return_pb(self)
 
227
 
 
228
    def note(self, fmt_string, *args, **kwargs):
 
229
        """Record a note without disrupting the progress bar."""
 
230
        self.clear()
 
231
        self.to_messages_file.write(fmt_string % args)
 
232
        self.to_messages_file.write('\n')
 
233
 
 
234
 
168
235
class DummyProgress(object):
169
236
    """Progress-bar standin that does nothing.
170
237
 
186
253
    def clear(self):
187
254
        pass
188
255
 
 
256
    def note(self, fmt_string, *args, **kwargs):
 
257
        """See _BaseProgressBar.note()."""
 
258
 
189
259
    def child_progress(self, **kwargs):
190
260
        return DummyProgress(**kwargs)
191
261