/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/progress.py

  • Committer: Jonathan Lange
  • Date: 2009-12-09 09:20:42 UTC
  • mfrom: (4881 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4907.
  • Revision ID: jml@canonical.com-20091209092042-s2zgqcf8f39yzxpj
Merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
from bzrlib.symbol_versioning import (
35
35
    deprecated_function,
36
36
    deprecated_in,
 
37
    deprecated_method,
37
38
    )
38
39
 
39
40
 
40
 
# XXX: deprecated; can be removed when the ProgressBar factory is removed
41
41
def _supports_progress(f):
42
 
    """Detect if we can use pretty progress bars on the output stream f.
 
42
    """Detect if we can use pretty progress bars on file F.
43
43
 
44
44
    If this returns true we expect that a human may be looking at that
45
45
    output, and that we can repaint a line to update it.
 
46
 
 
47
    This doesn't check the policy for whether we *should* use them.
46
48
    """
47
49
    isatty = getattr(f, 'isatty', None)
48
50
    if isatty is None:
49
51
        return False
50
52
    if not isatty():
51
53
        return False
 
54
    # The following case also handles Win32 - on that platform $TERM is
 
55
    # typically never set, so the case None is treated as a smart terminal,
 
56
    # not dumb.  <https://bugs.launchpad.net/bugs/334808>  win32 files do have
 
57
    # isatty methods that return true.
52
58
    if os.environ.get('TERM') == 'dumb':
53
59
        # e.g. emacs compile window
54
60
        return False
64
70
    Code updating the task may also set fields as hints about how to display
65
71
    it: show_pct, show_spinner, show_eta, show_count, show_bar.  UIs
66
72
    will not necessarily respect all these fields.
 
73
    
 
74
    :ivar update_latency: The interval (in seconds) at which the PB should be
 
75
        updated.  Setting this to zero suggests every update should be shown
 
76
        synchronously.
 
77
 
 
78
    :ivar show_transport_activity: If true (default), transport activity
 
79
        will be shown when this task is drawn.  Disable it if you're sure 
 
80
        that only irrelevant or uninteresting transport activity can occur
 
81
        during this task.
67
82
    """
68
83
 
69
 
    def __init__(self, parent_task=None, ui_factory=None):
 
84
    def __init__(self, parent_task=None, ui_factory=None, progress_view=None):
70
85
        """Construct a new progress task.
71
86
 
 
87
        :param parent_task: Enclosing ProgressTask or None.
 
88
 
 
89
        :param progress_view: ProgressView to display this ProgressTask.
 
90
 
 
91
        :param ui_factory: The UI factory that will display updates; 
 
92
            deprecated in favor of passing progress_view directly.
 
93
 
72
94
        Normally you should not call this directly but rather through
73
95
        `ui_factory.nested_progress_bar`.
74
96
        """
77
99
        self.total_cnt = None
78
100
        self.current_cnt = None
79
101
        self.msg = ''
 
102
        # TODO: deprecate passing ui_factory
80
103
        self.ui_factory = ui_factory
 
104
        self.progress_view = progress_view
81
105
        self.show_pct = False
82
106
        self.show_spinner = True
83
107
        self.show_eta = False,
84
108
        self.show_count = True
85
109
        self.show_bar = True
 
110
        self.update_latency = 0.1
 
111
        self.show_transport_activity = True
86
112
 
87
113
    def __repr__(self):
88
114
        return '%s(%r/%r, msg=%r)' % (
96
122
        self.current_cnt = current_cnt
97
123
        if total_cnt:
98
124
            self.total_cnt = total_cnt
99
 
        self.ui_factory._progress_updated(self)
 
125
        if self.progress_view:
 
126
            self.progress_view.show_progress(self)
 
127
        else:
 
128
            self.ui_factory._progress_updated(self)
100
129
 
101
130
    def tick(self):
102
131
        self.update(self.msg)
103
132
 
104
133
    def finished(self):
105
 
        self.ui_factory._progress_finished(self)
 
134
        if self.progress_view:
 
135
            self.progress_view.task_finished(self)
 
136
        else:
 
137
            self.ui_factory._progress_finished(self)
106
138
 
107
139
    def make_sub_task(self):
108
 
        return ProgressTask(self, self.ui_factory)
 
140
        return ProgressTask(self, ui_factory=self.ui_factory,
 
141
            progress_view=self.progress_view)
109
142
 
110
143
    def _overall_completion_fraction(self, child_fraction=0.0):
111
144
        """Return fractional completion of this task and its parents
124
157
                own_fraction = 0.0
125
158
            return self._parent_task._overall_completion_fraction(own_fraction)
126
159
 
 
160
    @deprecated_method(deprecated_in((2, 1, 0)))
127
161
    def note(self, fmt_string, *args):
128
 
        """Record a note without disrupting the progress bar."""
129
 
        # XXX: shouldn't be here; put it in mutter or the ui instead
 
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
        """
130
168
        if args:
131
169
            self.ui_factory.note(fmt_string % args)
132
170
        else:
133
171
            self.ui_factory.note(fmt_string)
134
172
 
135
173
    def clear(self):
136
 
        # XXX: shouldn't be here; put it in mutter or the ui instead
137
 
        self.ui_factory.clear_term()
 
174
        # TODO: deprecate this method; the model object shouldn't be concerned
 
175
        # with whether it's shown or not.  Most callers use this because they
 
176
        # want to write some different non-progress output to the screen, but
 
177
        # they should probably instead use a stream that's synchronized with
 
178
        # the progress output.  It may be there is a model-level use for
 
179
        # saying "this task's not active at the moment" but I don't see it. --
 
180
        # mbp 20090623
 
181
        if self.progress_view:
 
182
            self.progress_view.clear()
 
183
        else:
 
184
            self.ui_factory.clear_term()
138
185
 
139
186
 
140
187
@deprecated_function(deprecated_in((1, 16, 0)))
141
188
def ProgressBar(to_file=None, **kwargs):
142
 
    """Abstract factory"""
 
189
    """Construct a progress bar.
 
190
 
 
191
    Deprecated; ask the ui_factory for a progress task instead.
 
192
    """
143
193
    if to_file is None:
144
194
        to_file = sys.stderr
145
195
    requested_bar_type = os.environ.get('BZR_PROGRESS_BAR')
161
211
        return _progress_bar_types[requested_bar_type](to_file=to_file, **kwargs)
162
212
 
163
213
 
 
214
# NOTE: This is also deprecated; you should provide a ProgressView instead.
164
215
class _BaseProgressBar(object):
165
216
 
166
217
    def __init__(self,
448
499
        #self.to_file.flush()
449
500
 
450
501
 
 
502
 
 
503
# DEPRECATED
451
504
class ChildProgress(_BaseProgressBar):
452
505
    """A progress indicator that pushes its data to the parent"""
453
506