Show More
@@ -359,6 +359,9 b" coreconfigitem('progress', 'delay'," | |||
|
359 | 359 | coreconfigitem('progress', 'disable', |
|
360 | 360 | default=False, |
|
361 | 361 | ) |
|
362 | coreconfigitem('progress', 'estimateinterval', | |
|
363 | default=60.0, | |
|
364 | ) | |
|
362 | 365 | coreconfigitem('progress', 'refresh', |
|
363 | 366 | default=0.1, |
|
364 | 367 | ) |
@@ -1613,6 +1613,10 b' have a definite end point.' | |||
|
1613 | 1613 | Minimum delay before showing a new topic. When set to less than 3 * refresh, |
|
1614 | 1614 | that value will be used instead. (default: 1) |
|
1615 | 1615 | |
|
1616 | ``estimateinterval`` | |
|
1617 | Maximum sampling interval in seconds for speed and estimated time | |
|
1618 | calculation. (default: 60) | |
|
1619 | ||
|
1616 | 1620 | ``refresh`` |
|
1617 | 1621 | Time in seconds between refreshes of the progress bar. (default: 0.1) |
|
1618 | 1622 |
@@ -104,6 +104,8 b' class progbar(object):' | |||
|
104 | 104 | self.order = self.ui.configlist( |
|
105 | 105 | 'progress', 'format', |
|
106 | 106 | default=['topic', 'bar', 'number', 'estimate']) |
|
107 | self.estimateinterval = self.ui.configwith( | |
|
108 | float, 'progress', 'estimateinterval') | |
|
107 | 109 | |
|
108 | 110 | def show(self, now, topic, pos, item, unit, total): |
|
109 | 111 | if not shouldprint(self.ui): |
@@ -238,6 +240,32 b' class progbar(object):' | |||
|
238 | 240 | else: |
|
239 | 241 | return False |
|
240 | 242 | |
|
243 | def _calibrateestimate(self, topic, now, pos): | |
|
244 | '''Adjust starttimes and startvals for topic so ETA works better | |
|
245 | ||
|
246 | If progress is non-linear (ex. get much slower in the last minute), | |
|
247 | it's more friendly to only use a recent time span for ETA and speed | |
|
248 | calculation. | |
|
249 | ||
|
250 | [======================================> ] | |
|
251 | ^^^^^^^ | |
|
252 | estimateinterval, only use this for estimation | |
|
253 | ''' | |
|
254 | interval = self.estimateinterval | |
|
255 | if interval <= 0: | |
|
256 | return | |
|
257 | elapsed = now - self.starttimes[topic] | |
|
258 | if elapsed > interval: | |
|
259 | delta = pos - self.startvals[topic] | |
|
260 | newdelta = delta * interval / elapsed | |
|
261 | # If a stall happens temporarily, ETA could change dramatically | |
|
262 | # frequently. This is to avoid such dramatical change and make ETA | |
|
263 | # smoother. | |
|
264 | if newdelta < 0.1: | |
|
265 | return | |
|
266 | self.startvals[topic] = pos - newdelta | |
|
267 | self.starttimes[topic] = now - interval | |
|
268 | ||
|
241 | 269 | def progress(self, topic, pos, item='', unit='', total=None): |
|
242 | 270 | now = time.time() |
|
243 | 271 | self._refreshlock.acquire() |
@@ -268,6 +296,7 b' class progbar(object):' | |||
|
268 | 296 | self.topics.append(topic) |
|
269 | 297 | self.topicstates[topic] = pos, item, unit, total |
|
270 | 298 | self.curtopic = topic |
|
299 | self._calibrateestimate(topic, now, pos) | |
|
271 | 300 | if now - self.lastprint >= self.refresh and self.topics: |
|
272 | 301 | if self._oktoprint(now): |
|
273 | 302 | self.lastprint = now |
@@ -260,17 +260,17 b' Non-linear progress:' | |||
|
260 | 260 | loop [===========> ] 6/20 4m41s\r (no-eol) (esc) |
|
261 | 261 | loop [=============> ] 7/20 4m21s\r (no-eol) (esc) |
|
262 | 262 | loop [===============> ] 8/20 4m01s\r (no-eol) (esc) |
|
263 |
loop [================> ] 9/20 |
|
|
264 |
loop [==================> ] 10/20 1 |
|
|
265 |
loop [====================> ] 11/20 |
|
|
266 |
loop [======================> ] 12/20 |
|
|
267 |
loop [========================> ] 13/20 |
|
|
268 |
loop [==========================> ] 14/20 |
|
|
269 |
loop [============================> ] 15/20 |
|
|
270 |
loop [==============================> ] 16/20 |
|
|
271 |
loop [=================================> ] 17/20 |
|
|
272 |
loop [===================================> ] 18/20 5 |
|
|
273 |
loop [=====================================> ] 19/20 2 |
|
|
263 | loop [================> ] 9/20 25m40s\r (no-eol) (esc) | |
|
264 | loop [===================> ] 10/20 1h06m\r (no-eol) (esc) | |
|
265 | loop [=====================> ] 11/20 1h13m\r (no-eol) (esc) | |
|
266 | loop [=======================> ] 12/20 1h07m\r (no-eol) (esc) | |
|
267 | loop [========================> ] 13/20 58m19s\r (no-eol) (esc) | |
|
268 | loop [===========================> ] 14/20 7m09s\r (no-eol) (esc) | |
|
269 | loop [=============================> ] 15/20 3m38s\r (no-eol) (esc) | |
|
270 | loop [===============================> ] 16/20 2m15s\r (no-eol) (esc) | |
|
271 | loop [=================================> ] 17/20 1m27s\r (no-eol) (esc) | |
|
272 | loop [====================================> ] 18/20 52s\r (no-eol) (esc) | |
|
273 | loop [======================================> ] 19/20 25s\r (no-eol) (esc) | |
|
274 | 274 | \r (no-eol) (esc) |
|
275 | 275 | |
|
276 | 276 | Time estimates should not fail when there's no end point: |
General Comments 0
You need to be logged in to leave comments.
Login now