34
34
from bzrlib.symbol_versioning import (
35
35
deprecated_function,
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.
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.
47
This doesn't check the policy for whether we *should* use them.
47
49
isatty = getattr(f, 'isatty', None)
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
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.
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
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
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.
87
:param parent_task: Enclosing ProgressTask or None.
89
:param progress_view: ProgressView to display this ProgressTask.
91
:param ui_factory: The UI factory that will display updates;
92
deprecated in favor of passing progress_view directly.
72
94
Normally you should not call this directly but rather through
73
95
`ui_factory.nested_progress_bar`.
77
99
self.total_cnt = None
78
100
self.current_cnt = None
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
87
113
def __repr__(self):
88
114
return '%s(%r/%r, msg=%r)' % (
96
122
self.current_cnt = current_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)
128
self.ui_factory._progress_updated(self)
102
131
self.update(self.msg)
104
133
def finished(self):
105
self.ui_factory._progress_finished(self)
134
if self.progress_view:
135
self.progress_view.task_finished(self)
137
self.ui_factory._progress_finished(self)
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)
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)
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.
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.
131
169
self.ui_factory.note(fmt_string % args)
133
171
self.ui_factory.note(fmt_string)
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. --
181
if self.progress_view:
182
self.progress_view.clear()
184
self.ui_factory.clear_term()
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.
191
Deprecated; ask the ui_factory for a progress task instead.
143
193
if to_file is None:
144
194
to_file = sys.stderr
145
195
requested_bar_type = os.environ.get('BZR_PROGRESS_BAR')