~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

  • Committer: Robert Collins
  • Date: 2005-10-24 13:59:18 UTC
  • mfrom: (1185.20.1)
  • Revision ID: robertc@robertcollins.net-20051024135918-024629d7ee347b5c
fix upgrading of trees with no commits

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
42
43
 
43
44
 
44
45
def _width():
94
95
        self.show_eta = show_eta
95
96
        self.show_bar = show_bar
96
97
        self.show_count = show_count
97
 
        
 
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
98
114
        
99
115
    
100
116
class DotsProgressBar(_BaseProgressBar):
151
167
        self.width = _width()
152
168
        self.start_time = None
153
169
        self.last_update = None
 
170
        self.last_updates = deque()
154
171
    
155
172
 
156
173
    def throttle(self):
164
181
            if interval > 0 and interval < self.MIN_PAUSE:
165
182
                return True
166
183
 
 
184
        self.last_updates.append(now - self.last_update)
167
185
        self.last_update = now
168
186
        return False
169
187
        
176
194
    def update(self, msg, current_cnt=None, total_cnt=None):
177
195
        """Update and redraw progress bar."""
178
196
 
 
197
        if current_cnt < 0:
 
198
            current_cnt = 0
 
199
            
 
200
        if current_cnt > total_cnt:
 
201
            total_cnt = current_cnt
 
202
 
179
203
        # save these for the tick() function
180
204
        self.last_msg = msg
181
205
        self.last_cnt = current_cnt
184
208
        if self.throttle():
185
209
            return 
186
210
        
187
 
        if total_cnt:
188
 
            assert current_cnt <= total_cnt
189
 
        if current_cnt:
190
 
            assert current_cnt >= 0
191
 
        
192
211
        if self.show_eta and self.start_time and total_cnt:
193
 
            eta = get_eta(self.start_time, current_cnt, total_cnt)
 
212
            eta = get_eta(self.start_time, current_cnt, total_cnt,
 
213
                    last_updates = self.last_updates)
194
214
            eta_str = " " + str_tdelta(eta)
195
215
        else:
196
216
            eta_str = ""
264
284
                             delt % 60)
265
285
 
266
286
 
267
 
def get_eta(start_time, current, total, enough_samples=3):
 
287
def get_eta(start_time, current, total, enough_samples=3, last_updates=None, n_recent=10):
268
288
    if start_time is None:
269
289
        return None
270
290
 
286
306
 
287
307
    assert total_duration >= elapsed
288
308
 
 
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
 
289
320
    return total_duration - elapsed
290
321
 
291
322