annotate hgext/progress.py @ 13130:f139f34ba330

progress: react more reasonably to nested progress topics Previously, we'd reset the entire progress bar state when a topic was completed, even if it wasn't the outermost progress topic. Now we print the state of the next progress topic on the stack if one is left rather than reset the progress bar.
author Augie Fackler <durin42@gmail.com>
date Fri, 10 Dec 2010 16:56:12 -0600
parents c52c629ce19e
children c9ae7e096994
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1 # progress.py show progress bars for some actions
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2 #
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3 # Copyright (C) 2010 Augie Fackler <durin42@gmail.com>
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4 #
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5 # This program is free software; you can redistribute it and/or modify it
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6 # under the terms of the GNU General Public License as published by the
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7 # Free Software Foundation; either version 2 of the License, or (at your
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8 # option) any later version.
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9 #
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10 # This program is distributed in the hope that it will be useful, but
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13 # Public License for more details.
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
14 #
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License along
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
16 # with this program; if not, write to the Free Software Foundation, Inc.,
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
18
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19 """show progress bars for some actions
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
20
10450
b4fd900569b1 progress: fix description
timeless <timeless@mozdev.org>
parents: 10441
diff changeset
21 This extension uses the progress information logged by hg commands
b4fd900569b1 progress: fix description
timeless <timeless@mozdev.org>
parents: 10441
diff changeset
22 to draw progress bars that are as informative as possible. Some progress
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23 bars only offer indeterminate information, while others have a definite
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
24 end point.
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
25
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
26 The following settings are available::
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
27
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
28 [progress]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
29 delay = 3 # number of seconds (float) before showing the progress bar
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
30 refresh = 0.1 # time in seconds between refreshes of the progress bar
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
31 format = topic bar number # format of the progress bar
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
32 width = <none> # if set, the maximum width of the progress information
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
33 # (that is, min(width, term width) will be used)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
34 clear-complete = True # clear the progress bar after it's done
10656
f6ee02933af9 progress: document progress.disable config option
Augie Fackler <durin42@gmail.com>
parents: 10594
diff changeset
35 disable = False # if true, don't show a progress bar
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
36 assume-tty = False # if true, ALWAYS show a progress bar, unless
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
37 # disable is given
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
38
10471
132eb7128ad5 progress: use inline literals in help string
Martin Geisler <mg@lazybytes.net>
parents: 10464
diff changeset
39 Valid entries for the format field are topic, bar, number, unit, and
132eb7128ad5 progress: use inline literals in help string
Martin Geisler <mg@lazybytes.net>
parents: 10464
diff changeset
40 item. item defaults to the last 20 characters of the item, but this
132eb7128ad5 progress: use inline literals in help string
Martin Geisler <mg@lazybytes.net>
parents: 10464
diff changeset
41 can be changed by adding either ``-<num>`` which would take the last
132eb7128ad5 progress: use inline literals in help string
Martin Geisler <mg@lazybytes.net>
parents: 10464
diff changeset
42 num characters, or ``+<num>`` for the first num characters.
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
43 """
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
44
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
45 import sys
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
46 import time
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
47
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
48 from mercurial import util
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
49
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
50 def spacejoin(*args):
10452
59f8fff4f887 progress: simplify spacejoin()
Brodie Rao <me+hg@dackz.net>
parents: 10450
diff changeset
51 return ' '.join(s for s in args if s)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
52
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
53 def shouldprint(ui):
12654
646eb9337c87 progress: make sure stderr has isatty before calling (issue2191)
Augie Fackler <durin42@gmail.com>
parents: 11555
diff changeset
54 return (getattr(sys.stderr, 'isatty', None) and
646eb9337c87 progress: make sure stderr has isatty before calling (issue2191)
Augie Fackler <durin42@gmail.com>
parents: 11555
diff changeset
55 (sys.stderr.isatty() or ui.configbool('progress', 'assume-tty')))
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
56
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 class progbar(object):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58 def __init__(self, ui):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
59 self.ui = ui
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
60 self.resetstate()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
61
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 def resetstate(self):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 self.topics = []
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
64 self.topicstates = {}
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 self.printed = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 self.lastprint = time.time() + float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67 'progress', 'delay', default=3))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68 self.indetcount = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
69 self.refresh = float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
70 'progress', 'refresh', default=0.1))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
71 self.order = self.ui.configlist(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
72 'progress', 'format',
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
73 default=['topic', 'bar', 'number'])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
74
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
75 def show(self, topic, pos, item, unit, total):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
76 if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
77 return
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
78 termwidth = self.width()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
79 self.printed = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
80 head = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
81 needprogress = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
82 tail = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
83 for indicator in self.order:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
84 add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
85 if indicator == 'topic':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
86 add = topic
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
87 elif indicator == 'number':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
88 if total:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
89 add = ('% ' + str(len(str(total))) +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
90 's/%s') % (pos, total)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
91 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
92 add = str(pos)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
93 elif indicator.startswith('item') and item:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
94 slice = 'end'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
95 if '-' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
96 wid = int(indicator.split('-')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
97 elif '+' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
98 slice = 'beginning'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
99 wid = int(indicator.split('+')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
100 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
101 wid = 20
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
102 if slice == 'end':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
103 add = item[-wid:]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
104 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
105 add = item[:wid]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
106 add += (wid - len(add)) * ' '
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
107 elif indicator == 'bar':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
108 add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
109 needprogress = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
110 elif indicator == 'unit' and unit:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
111 add = unit
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
112 if not needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
113 head = spacejoin(head, add)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
114 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
115 tail = spacejoin(add, tail)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
116 if needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
117 used = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
118 if head:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
119 used += len(head) + 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
120 if tail:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
121 used += len(tail) + 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
122 progwidth = termwidth - used - 3
10891
83af68e38be3 progress: fall back to indeterminate progress if position is >= total
Augie Fackler <durin42@gmail.com>
parents: 10815
diff changeset
123 if total and pos <= total:
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
124 amt = pos * progwidth // total
10453
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
125 bar = '=' * (amt - 1)
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
126 if amt > 0:
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
127 bar += '>'
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
128 bar += ' ' * (progwidth - amt)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
129 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
130 progwidth -= 3
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
131 self.indetcount += 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
132 # mod the count by twice the width so we can make the
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
133 # cursor bounce between the right and left sides
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
134 amt = self.indetcount % (2 * progwidth)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
135 amt -= progwidth
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
136 bar = (' ' * int(progwidth - abs(amt)) + '<=>' +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
137 ' ' * int(abs(amt)))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
138 prog = ''.join(('[', bar , ']'))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139 out = spacejoin(head, prog, tail)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
140 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
141 out = spacejoin(head, tail)
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
142 sys.stderr.write('\r' + out[:termwidth])
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
143 sys.stderr.flush()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
144
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
145 def clear(self):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
146 if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
147 return
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
148 sys.stderr.write('\r%s\r' % (' ' * self.width()))
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
150 def complete(self):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
151 if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
152 return
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
153 if self.ui.configbool('progress', 'clear-complete', default=True):
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
154 self.clear()
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
155 else:
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
156 sys.stderr.write('\n')
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
157 sys.stderr.flush()
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
158
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
159 def width(self):
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12654
diff changeset
160 tw = self.ui.termwidth()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
161 return min(int(self.ui.config('progress', 'width', default=tw)), tw)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
162
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
163 def progress(self, topic, pos, item='', unit='', total=None):
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
164 if pos is None:
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
165 self.topicstates.pop(topic, None)
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
166 # reset the progress bar if this is the outermost topic
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
167 if self.topics and self.topics[0] == topic and self.printed:
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
168 self.complete()
10441
dc0d1ca2d378 progress: only reset state if finishing progress for the current topic
Augie Fackler <durin42@gmail.com>
parents: 10439
diff changeset
169 self.resetstate()
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
170 # truncate the list of topics assuming all topics within
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
171 # this one are also closed
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
172 if topic in self.topics:
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
173 self.topics = self.topics[:self.topics.index(topic)]
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
174 else:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
175 if topic not in self.topics:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
176 self.topics.append(topic)
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
177 now = time.time()
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
178 self.topicstates[topic] = pos, item, unit, total
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
179 if now - self.lastprint >= self.refresh and self.topics:
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
180 self.lastprint = now
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
181 current = self.topics[-1]
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
182 self.show(current, *self.topicstates[current])
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
183
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
184 def uisetup(ui):
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
185 class progressui(ui.__class__):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
186 _progbar = None
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
187
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
188 def progress(self, *args, **opts):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
189 self._progbar.progress(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
190 return super(progressui, self).progress(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
191
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
192 def write(self, *args, **opts):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
193 if self._progbar.printed:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
194 self._progbar.clear()
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
195 return super(progressui, self).write(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
196
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
197 def write_err(self, *args, **opts):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
198 if self._progbar.printed:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
199 self._progbar.clear()
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
200 return super(progressui, self).write_err(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
201
10540
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
202 # Apps that derive a class from ui.ui() can use
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
203 # setconfig('progress', 'disable', 'True') to disable this extension
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
204 if ui.configbool('progress', 'disable'):
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
205 return
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
206 if shouldprint(ui) and not ui.debugflag and not ui.quiet:
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
207 ui.__class__ = progressui
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
208 # we instantiate one globally shared progress bar to avoid
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
209 # competing progress bars when multiple UI objects get created
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
210 if not progressui._progbar:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
211 progressui._progbar = progbar(ui)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
212
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
213 def reposetup(ui, repo):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
214 uisetup(repo.ui)