~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

merge 2.0 branch rev 4647

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
import sys
26
26
import time
27
27
import os
28
 
import warnings
29
28
 
30
29
 
31
30
from bzrlib import (
32
31
    errors,
33
 
    osutils,
34
 
    trace,
35
 
    ui,
36
32
    )
37
33
from bzrlib.trace import mutter
38
34
from bzrlib.symbol_versioning import (
39
35
    deprecated_function,
40
36
    deprecated_in,
41
 
    deprecated_method,
42
37
    )
43
38
 
44
39
 
45
 
# XXX: deprecated; can be removed when the ProgressBar factory is removed
46
40
def _supports_progress(f):
47
 
    """Detect if we can use pretty progress bars on the output stream f.
 
41
    """Detect if we can use pretty progress bars on file F.
48
42
 
49
43
    If this returns true we expect that a human may be looking at that
50
44
    output, and that we can repaint a line to update it.
 
45
 
 
46
    This doesn't check the policy for whether we *should* use them.
51
47
    """
52
48
    isatty = getattr(f, 'isatty', None)
53
49
    if isatty is None:
54
50
        return False
55
51
    if not isatty():
56
52
        return False
 
53
    # The following case also handles Win32 - on that platform $TERM is
 
54
    # typically never set, so the case None is treated as a smart terminal,
 
55
    # not dumb.  <https://bugs.launchpad.net/bugs/334808>  win32 files do have
 
56
    # isatty methods that return true.
57
57
    if os.environ.get('TERM') == 'dumb':
58
58
        # e.g. emacs compile window
59
59
        return False
69
69
    Code updating the task may also set fields as hints about how to display
70
70
    it: show_pct, show_spinner, show_eta, show_count, show_bar.  UIs
71
71
    will not necessarily respect all these fields.
 
72
    
 
73
    :ivar update_latency: The interval (in seconds) at which the PB should be
 
74
        updated.  Setting this to zero suggests every update should be shown
 
75
        synchronously.
 
76
 
 
77
    :ivar show_transport_activity: If true (default), transport activity
 
78
        will be shown when this task is drawn.  Disable it if you're sure 
 
79
        that only irrelevant or uninteresting transport activity can occur
 
80
        during this task.
72
81
    """
73
82
 
74
 
    def __init__(self, parent_task=None, ui_factory=None):
 
83
    def __init__(self, parent_task=None, ui_factory=None, progress_view=None):
75
84
        """Construct a new progress task.
76
85
 
 
86
        :param parent_task: Enclosing ProgressTask or None.
 
87
 
 
88
        :param progress_view: ProgressView to display this ProgressTask.
 
89
 
 
90
        :param ui_factory: The UI factory that will display updates; 
 
91
            deprecated in favor of passing progress_view directly.
 
92
 
77
93
        Normally you should not call this directly but rather through
78
94
        `ui_factory.nested_progress_bar`.
79
95
        """
82
98
        self.total_cnt = None
83
99
        self.current_cnt = None
84
100
        self.msg = ''
 
101
        # TODO: deprecate passing ui_factory
85
102
        self.ui_factory = ui_factory
 
103
        self.progress_view = progress_view
86
104
        self.show_pct = False
87
105
        self.show_spinner = True
88
106
        self.show_eta = False,
89
107
        self.show_count = True
90
108
        self.show_bar = True
 
109
        self.update_latency = 0.1
 
110
        self.show_transport_activity = True
91
111
 
92
112
    def __repr__(self):
93
113
        return '%s(%r/%r, msg=%r)' % (
101
121
        self.current_cnt = current_cnt
102
122
        if total_cnt:
103
123
            self.total_cnt = total_cnt
104
 
        self.ui_factory._progress_updated(self)
 
124
        if self.progress_view:
 
125
            self.progress_view.show_progress(self)
 
126
        else:
 
127
            self.ui_factory._progress_updated(self)
105
128
 
106
129
    def tick(self):
107
130
        self.update(self.msg)
108
131
 
109
132
    def finished(self):
110
 
        self.ui_factory._progress_finished(self)
 
133
        if self.progress_view:
 
134
            self.progress_view.task_finished(self)
 
135
        else:
 
136
            self.ui_factory._progress_finished(self)
111
137
 
112
138
    def make_sub_task(self):
113
 
        return ProgressTask(self, self.ui_factory)
 
139
        return ProgressTask(self, ui_factory=self.ui_factory,
 
140
            progress_view=self.progress_view)
114
141
 
115
142
    def _overall_completion_fraction(self, child_fraction=0.0):
116
143
        """Return fractional completion of this task and its parents
139
166
 
140
167
    def clear(self):
141
168
        # XXX: shouldn't be here; put it in mutter or the ui instead
142
 
        self.ui_factory.clear_term()
 
169
        if self.progress_view:
 
170
            self.progress_view.clear()
 
171
        else:
 
172
            self.ui_factory.clear_term()
143
173
 
144
174
 
145
175
@deprecated_function(deprecated_in((1, 16, 0)))
146
176
def ProgressBar(to_file=None, **kwargs):
147
 
    """Abstract factory"""
 
177
    """Construct a progress bar.
 
178
 
 
179
    Deprecated; ask the ui_factory for a progress task instead.
 
180
    """
148
181
    if to_file is None:
149
182
        to_file = sys.stderr
150
183
    requested_bar_type = os.environ.get('BZR_PROGRESS_BAR')
166
199
        return _progress_bar_types[requested_bar_type](to_file=to_file, **kwargs)
167
200
 
168
201
 
 
202
# NOTE: This is also deprecated; you should provide a ProgressView instead.
169
203
class _BaseProgressBar(object):
170
204
 
171
205
    def __init__(self,
453
487
        #self.to_file.flush()
454
488
 
455
489
 
 
490
 
 
491
# DEPRECATED
456
492
class ChildProgress(_BaseProgressBar):
457
493
    """A progress indicator that pushes its data to the parent"""
458
494