annotate hgext/progress.py @ 10815:32b213b9b22c

ui: add ui.write() output labeling API This adds output labeling support with the following methods: - ui.write(..., label='topic.name topic2.name2 ...') - ui.write_err(.., label=...) - ui.popbuffer(labeled=False) - ui.label(msg, label) By adding an API to label output directly, the color extension can forgo parsing command output and instead override the above methods to insert ANSI color codes. GUI tools can also override the above methods and use the labels to do GUI-specific styling. popbuffer gains a labeled argument that, when set to True, returns its buffered output with labels handled. In the case of the color extension, this would return output with color codes embedded. For existing users that use this method to capture and parse output, labels are discarded and output returned as normal when labeled is False (the default). Existing wrappers of ui.write() and ui.write_err() should make sure to accept its new **opts argument.
author Brodie Rao <brodie@bitheap.org>
date Fri, 02 Apr 2010 15:22:00 -0500
parents ca6ba6cac6cd
children 83af68e38be3
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 extensions
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
49 from mercurial import util
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
50
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
51 def spacejoin(*args):
10452
59f8fff4f887 progress: simplify spacejoin()
Brodie Rao <me+hg@dackz.net>
parents: 10450
diff changeset
52 return ' '.join(s for s in args if s)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
53
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
54 class progbar(object):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
55 def __init__(self, ui):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
56 self.ui = ui
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 self.resetstate()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
59 def resetstate(self):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
60 self.topics = []
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
61 self.printed = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 self.lastprint = time.time() + float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 'progress', 'delay', default=3))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
64 self.indetcount = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 self.refresh = float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 'progress', 'refresh', default=0.1))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67 self.order = self.ui.configlist(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68 'progress', 'format',
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
69 default=['topic', 'bar', 'number'])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
70
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
71 def show(self, topic, pos, item, unit, total):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
72 termwidth = self.width()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
73 self.printed = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
74 head = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
75 needprogress = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
76 tail = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
77 for indicator in self.order:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
78 add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
79 if indicator == 'topic':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
80 add = topic
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
81 elif indicator == 'number':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
82 if total:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
83 add = ('% ' + str(len(str(total))) +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
84 's/%s') % (pos, total)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
85 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
86 add = str(pos)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
87 elif indicator.startswith('item') and item:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
88 slice = 'end'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
89 if '-' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
90 wid = int(indicator.split('-')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
91 elif '+' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
92 slice = 'beginning'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
93 wid = int(indicator.split('+')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
94 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
95 wid = 20
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
96 if slice == 'end':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
97 add = item[-wid:]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
98 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
99 add = item[:wid]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
100 add += (wid - len(add)) * ' '
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
101 elif indicator == 'bar':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
102 add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
103 needprogress = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
104 elif indicator == 'unit' and unit:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
105 add = unit
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
106 if not needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
107 head = spacejoin(head, add)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
108 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
109 tail = spacejoin(add, tail)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
110 if needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
111 used = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
112 if head:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
113 used += len(head) + 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
114 if tail:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
115 used += len(tail) + 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
116 progwidth = termwidth - used - 3
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
117 if total:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
118 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
119 bar = '=' * (amt - 1)
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
120 if amt > 0:
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
121 bar += '>'
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
122 bar += ' ' * (progwidth - amt)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
123 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
124 progwidth -= 3
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
125 self.indetcount += 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
126 # mod the count by twice the width so we can make the
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
127 # cursor bounce between the right and left sides
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
128 amt = self.indetcount % (2 * progwidth)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
129 amt -= progwidth
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
130 bar = (' ' * int(progwidth - abs(amt)) + '<=>' +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
131 ' ' * int(abs(amt)))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
132 prog = ''.join(('[', bar , ']'))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
133 out = spacejoin(head, prog, tail)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
134 else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
135 out = spacejoin(head, tail)
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
136 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
137 sys.stderr.flush()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
138
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139 def clear(self):
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
140 sys.stderr.write('\r%s\r' % (' ' * self.width()))
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
141
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
142 def complete(self):
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
143 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
144 self.clear()
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
145 else:
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
146 sys.stderr.write('\n')
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
147 sys.stderr.flush()
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
148
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149 def width(self):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
150 tw = util.termwidth()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
151 return min(int(self.ui.config('progress', 'width', default=tw)), tw)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
152
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
153 def progress(self, orig, 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
154 if pos is None:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
155 if self.topics and self.topics[-1] == topic and self.printed:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
156 self.complete()
10441
dc0d1ca2d378 progress: only reset state if finishing progress for the current topic
Augie Fackler <durin42@gmail.com>
parents: 10439
diff changeset
157 self.resetstate()
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
158 else:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
159 if topic not in self.topics:
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
160 self.topics.append(topic)
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
161 now = time.time()
10464
149ad0a3ec91 progress: make progress.refresh=0 always display the progress line
Patrick Mezard <pmezard@gmail.com>
parents: 10463
diff changeset
162 if (now - self.lastprint >= self.refresh
149ad0a3ec91 progress: make progress.refresh=0 always display the progress line
Patrick Mezard <pmezard@gmail.com>
parents: 10463
diff changeset
163 and topic == self.topics[-1]):
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
164 self.lastprint = now
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
165 self.show(topic, pos, item, unit, total)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
166 return orig(topic, pos, item=item, unit=unit, total=total)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
167
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10788
diff changeset
168 def write(self, orig, *args, **opts):
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
169 if self.printed:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
170 self.clear()
10815
32b213b9b22c ui: add ui.write() output labeling API
Brodie Rao <brodie@bitheap.org>
parents: 10788
diff changeset
171 return orig(*args, **opts)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
172
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
173 sharedprog = None
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
174
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
175 def uisetup(ui):
10540
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
176 # 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
177 # 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
178 if ui.configbool('progress', 'disable'):
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
179 return
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
180 if ((sys.stderr.isatty() or ui.configbool('progress', 'assume-tty'))
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
181 and not ui.debugflag and not ui.quiet):
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
182 # we instantiate one globally shared progress bar to avoid
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
183 # competing progress bars when multiple UI objects get created
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
184 global sharedprog
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
185 if not sharedprog:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
186 sharedprog = progbar(ui)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
187 extensions.wrapfunction(ui, 'progress', sharedprog.progress)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
188 extensions.wrapfunction(ui, 'write', sharedprog.write)
10594
08716b8ba9fb progress: clear progress before writing to stderr
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10540
diff changeset
189 extensions.wrapfunction(ui, 'write_err', sharedprog.write)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
190
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
191 def reposetup(ui, repo):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
192 uisetup(repo.ui)