~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/progress.py

  • Committer: Alexander Belchenko
  • Date: 2008-02-16 10:03:17 UTC
  • mfrom: (3224 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3230.
  • Revision ID: bialix@ukr.net-20080216100317-xg1hdw306evlgt94
merge bzr.dev; update for 1.3; $BZR_LOG used in trace.py module (again), not in the main bzr script (req. by Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
18
 
19
 
"""Simple text-mode progress indicator.
20
 
 
21
 
To display an indicator, create a ProgressBar object.  Call it,
22
 
passing Progress objects indicating the current state.  When done,
23
 
call clear().
24
 
 
25
 
Progress is suppressed when output is not sent to a terminal, so as
26
 
not to clutter log files.
 
19
"""Progress indicators.
 
20
 
 
21
The usual way to use this is via bzrlib.ui.ui_factory.nested_progress_bar which
 
22
will maintain a ProgressBarStack for you.
 
23
 
 
24
For direct use, the factory ProgressBar will return an auto-detected progress
 
25
bar that should match your terminal type. You can manually create a
 
26
ProgressBarStack too if you need multiple levels of cooperating progress bars.
 
27
Note that bzrlib's internal functions use the ui module, so if you are using
 
28
bzrlib it really is best to use bzrlib.ui.ui_factory.
27
29
"""
28
30
 
29
 
# TODO: should be a global option e.g. --silent that disables progress
30
 
# indicators, preferably without needing to adjust all code that
31
 
# potentially calls them.
32
 
 
33
 
# TODO: If not on a tty perhaps just print '......' for the benefit of IDEs, etc
34
 
 
35
31
# TODO: Optionally show elapsed time instead/as well as ETA; nicer
36
32
# when the rate is unpredictable
37
33
 
298
294
        self.child_fraction = 0
299
295
        self._have_output = False
300
296
    
301
 
 
302
297
    def throttle(self, old_msg):
303
298
        """Return True if the bar was updated too recently"""
304
299
        # time.time consistently takes 40/4000 ms = 0.01 ms.
320
315
        return False
321
316
        
322
317
    def tick(self):
323
 
        self.update(self.last_msg, self.last_cnt, self.last_total, 
 
318
        self.update(self.last_msg, self.last_cnt, self.last_total,
324
319
                    self.child_fraction)
325
320
 
326
321
    def child_update(self, message, current, total):
336
331
            self.last_msg = ''
337
332
        self.tick()
338
333
 
339
 
    def update(self, msg, current_cnt=None, total_cnt=None, 
 
334
    def update(self, msg, current_cnt=None, total_cnt=None,
340
335
               child_fraction=0):
341
336
        """Update and redraw progress bar."""
342
337
        if msg is None:
438
433
        self._have_output = True
439
434
        #self.to_file.flush()
440
435
            
441
 
    def clear(self):        
 
436
    def clear(self):
442
437
        if self._have_output:
443
438
            self.to_file.write('\r%s\r' % (' ' * (self.width - 1)))
444
439
        self._have_output = False
568
563
            self.cur_phase += 1
569
564
        assert self.cur_phase < self.total
570
565
        self.pb.update(self.message, self.cur_phase, self.total)
571
 
 
572
 
 
573
 
def run_tests():
574
 
    import doctest
575
 
    result = doctest.testmod()
576
 
    if result[1] > 0:
577
 
        if result[0] == 0:
578
 
            print "All tests passed"
579
 
    else:
580
 
        print "No tests to run"
581
 
 
582
 
 
583
 
def demo():
584
 
    sleep = time.sleep
585
 
    
586
 
    print 'dumb-terminal test:'
587
 
    pb = DotsProgressBar()
588
 
    for i in range(100):
589
 
        pb.update('Leoparden', i, 99)
590
 
        sleep(0.1)
591
 
    sleep(1.5)
592
 
    pb.clear()
593
 
    sleep(1.5)
594
 
    
595
 
    print 'smart-terminal test:'
596
 
    pb = ProgressBar(show_pct=True, show_bar=True, show_spinner=False)
597
 
    for i in range(100):
598
 
        pb.update('Elephanten', i, 99)
599
 
        sleep(0.1)
600
 
    sleep(2)
601
 
    pb.clear()
602
 
    sleep(1)
603
 
 
604
 
    print 'done!'
605
 
 
606
 
if __name__ == "__main__":
607
 
    demo()