~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

  • Committer: Martin Pool
  • Date: 2005-08-18 05:52:29 UTC
  • Revision ID: mbp@sourcefrog.net-20050818055229-cac46ebce364d04c
- avoid compiling REs at module load time

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
import sys
40
40
import time
41
41
import os
42
 
from collections import deque
43
42
 
44
43
 
45
44
def _width():
95
94
        self.show_eta = show_eta
96
95
        self.show_bar = show_bar
97
96
        self.show_count = show_count
98
 
 
99
 
 
100
 
 
101
 
class DummyProgress(_BaseProgressBar):
102
 
    """Progress-bar standin that does nothing.
103
 
 
104
 
    This can be used as the default argument for methods that
105
 
    take an optional progress indicator."""
106
 
    def tick(self):
107
 
        pass
108
 
 
109
 
    def update(self, msg=None, current=None, total=None):
110
 
        pass
111
 
 
112
 
    def clear(self):
113
 
        pass
 
97
        
114
98
        
115
99
    
116
100
class DotsProgressBar(_BaseProgressBar):
167
151
        self.width = _width()
168
152
        self.start_time = None
169
153
        self.last_update = None
170
 
        self.last_updates = deque()
171
154
    
172
155
 
173
156
    def throttle(self):
181
164
            if interval > 0 and interval < self.MIN_PAUSE:
182
165
                return True
183
166
 
184
 
        self.last_updates.append(now - self.last_update)
185
167
        self.last_update = now
186
168
        return False
187
169
        
194
176
    def update(self, msg, current_cnt=None, total_cnt=None):
195
177
        """Update and redraw progress bar."""
196
178
 
197
 
        if current_cnt < 0:
198
 
            current_cnt = 0
199
 
            
200
 
        if current_cnt > total_cnt:
201
 
            total_cnt = current_cnt
202
 
 
203
179
        # save these for the tick() function
204
180
        self.last_msg = msg
205
181
        self.last_cnt = current_cnt
208
184
        if self.throttle():
209
185
            return 
210
186
        
 
187
        if total_cnt:
 
188
            assert current_cnt <= total_cnt
 
189
        if current_cnt:
 
190
            assert current_cnt >= 0
 
191
        
211
192
        if self.show_eta and self.start_time and total_cnt:
212
 
            eta = get_eta(self.start_time, current_cnt, total_cnt,
213
 
                    last_updates = self.last_updates)
 
193
            eta = get_eta(self.start_time, current_cnt, total_cnt)
214
194
            eta_str = " " + str_tdelta(eta)
215
195
        else:
216
196
            eta_str = ""
284
264
                             delt % 60)
285
265
 
286
266
 
287
 
def get_eta(start_time, current, total, enough_samples=3, last_updates=None, n_recent=10):
 
267
def get_eta(start_time, current, total, enough_samples=3):
288
268
    if start_time is None:
289
269
        return None
290
270
 
306
286
 
307
287
    assert total_duration >= elapsed
308
288
 
309
 
    if last_updates and len(last_updates) >= n_recent:
310
 
        while len(last_updates) > n_recent:
311
 
            last_updates.popleft()
312
 
        avg = sum(last_updates) / float(len(last_updates))
313
 
        time_left = avg * (total - current)
314
 
 
315
 
        old_time_left = total_duration - elapsed
316
 
 
317
 
        # We could return the average, or some other value here
318
 
        return (time_left + old_time_left) / 2
319
 
 
320
289
    return total_duration - elapsed
321
290
 
322
291