Mercurial > hg
comparison mercurial/cmdutil.py @ 3738:cb48cd27d3f4
use ui buffering in changeset printer
delete old uibuffer class
delete old stringio class
move show to _show
add new show that uses ui.pushbuffer to buffer
add new flush that writes buffered data
add props arg to changeset_printer to match _templater
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 01 Dec 2006 01:28:19 -0600 |
parents | 7db88b094b14 |
children | 120be84f33de |
comparison
equal
deleted
inserted
replaced
3737:9f5c46c50118 | 3738:cb48cd27d3f4 |
---|---|
7 | 7 |
8 from demandload import demandload | 8 from demandload import demandload |
9 from node import * | 9 from node import * |
10 from i18n import gettext as _ | 10 from i18n import gettext as _ |
11 demandload(globals(), 'os sys') | 11 demandload(globals(), 'os sys') |
12 demandload(globals(), 'mdiff util templater cStringIO patch') | 12 demandload(globals(), 'mdiff util templater patch') |
13 | 13 |
14 revrangesep = ':' | 14 revrangesep = ':' |
15 | 15 |
16 def revpair(repo, revs): | 16 def revpair(repo, revs): |
17 '''return pair of nodes, given list of revisions. second item can | 17 '''return pair of nodes, given list of revisions. second item can |
194 '(%d%% similar)\n') % | 194 '(%d%% similar)\n') % |
195 (oldrel, newrel, score * 100)) | 195 (oldrel, newrel, score * 100)) |
196 if not dry_run: | 196 if not dry_run: |
197 repo.copy(old, new, wlock=wlock) | 197 repo.copy(old, new, wlock=wlock) |
198 | 198 |
199 class uibuffer(object): | |
200 # Implement and delegate some ui protocol. Save hunks of | |
201 # output for later display in the desired order. | |
202 def __init__(self, ui): | |
203 self.ui = ui | |
204 self.hunk = {} | |
205 self.header = {} | |
206 self.quiet = ui.quiet | |
207 self.verbose = ui.verbose | |
208 self.debugflag = ui.debugflag | |
209 self.lastheader = None | |
210 def note(self, *args): | |
211 if self.verbose: | |
212 self.write(*args) | |
213 def status(self, *args): | |
214 if not self.quiet: | |
215 self.write(*args) | |
216 def debug(self, *args): | |
217 if self.debugflag: | |
218 self.write(*args) | |
219 def write(self, *args): | |
220 self.hunk.setdefault(self.rev, []).extend(args) | |
221 def write_header(self, *args): | |
222 self.header.setdefault(self.rev, []).extend(args) | |
223 def mark(self, rev): | |
224 self.rev = rev | |
225 def flush(self, rev): | |
226 if rev in self.header: | |
227 h = "".join(self.header[rev]) | |
228 if h != self.lastheader: | |
229 self.lastheader = h | |
230 self.ui.write(h) | |
231 del self.header[rev] | |
232 if rev in self.hunk: | |
233 self.ui.write("".join(self.hunk[rev])) | |
234 del self.hunk[rev] | |
235 return 1 | |
236 return 0 | |
237 | |
238 class changeset_printer(object): | 199 class changeset_printer(object): |
239 '''show changeset information when templating not requested.''' | 200 '''show changeset information when templating not requested.''' |
240 | 201 |
241 def __init__(self, ui, repo, patch, brinfo, buffered): | 202 def __init__(self, ui, repo, patch, brinfo, buffered): |
242 self.ui = ui | 203 self.ui = ui |
243 self.repo = repo | 204 self.repo = repo |
244 self.buffered = buffered | 205 self.buffered = buffered |
245 self.patch = patch | 206 self.patch = patch |
246 self.brinfo = brinfo | 207 self.brinfo = brinfo |
247 if buffered: | 208 self.header = {} |
248 self.ui = uibuffer(ui) | 209 self.hunk = {} |
210 self.lastheader = None | |
249 | 211 |
250 def flush(self, rev): | 212 def flush(self, rev): |
251 return self.ui.flush(rev) | 213 if rev in self.header: |
252 | 214 h = self.header[rev] |
253 def show(self, rev=0, changenode=None, copies=None): | 215 if h != self.lastheader: |
216 self.lastheader = h | |
217 self.ui.write(h) | |
218 del self.header[rev] | |
219 if rev in self.hunk: | |
220 self.ui.write(self.hunk[rev]) | |
221 del self.hunk[rev] | |
222 return 1 | |
223 return 0 | |
224 | |
225 def show(self, rev=0, changenode=None, copies=None, **props): | |
226 if self.buffered: | |
227 self.ui.pushbuffer() | |
228 self._show(rev, changenode, copies, props) | |
229 self.hunk[rev] = self.ui.popbuffer() | |
230 else: | |
231 self._show(rev, changenode, copies, props) | |
232 | |
233 def _show(self, rev, changenode, copies, props): | |
254 '''show a single changeset or file revision''' | 234 '''show a single changeset or file revision''' |
255 if self.buffered: | |
256 self.ui.mark(rev) | |
257 log = self.repo.changelog | 235 log = self.repo.changelog |
258 if changenode is None: | 236 if changenode is None: |
259 changenode = log.node(rev) | 237 changenode = log.node(rev) |
260 elif not rev: | 238 elif not rev: |
261 rev = log.rev(changenode) | 239 rev = log.rev(changenode) |
350 | 328 |
351 def use_template(self, t): | 329 def use_template(self, t): |
352 '''set template string to use''' | 330 '''set template string to use''' |
353 self.t.cache['changeset'] = t | 331 self.t.cache['changeset'] = t |
354 | 332 |
355 def show(self, rev=0, changenode=None, copies=[], **props): | 333 def _show(self, rev, changenode, copies, props): |
356 '''show a single changeset or file revision''' | 334 '''show a single changeset or file revision''' |
357 if self.buffered: | |
358 self.ui.mark(rev) | |
359 log = self.repo.changelog | 335 log = self.repo.changelog |
360 if changenode is None: | 336 if changenode is None: |
361 changenode = log.node(rev) | 337 changenode = log.node(rev) |
362 elif not rev: | 338 elif not rev: |
363 rev = log.rev(changenode) | 339 rev = log.rev(changenode) |
511 else: | 487 else: |
512 key = '' | 488 key = '' |
513 if key: | 489 if key: |
514 h = templater.stringify(self.t(key, **props)) | 490 h = templater.stringify(self.t(key, **props)) |
515 if self.buffered: | 491 if self.buffered: |
516 self.ui.write_header(h) | 492 self.header[rev] = h |
517 else: | 493 else: |
518 self.ui.write(h) | 494 self.ui.write(h) |
519 if self.ui.debugflag and 'changeset_debug' in self.t: | 495 if self.ui.debugflag and 'changeset_debug' in self.t: |
520 key = 'changeset_debug' | 496 key = 'changeset_debug' |
521 elif self.ui.quiet and 'changeset_quiet' in self.t: | 497 elif self.ui.quiet and 'changeset_quiet' in self.t: |
529 except KeyError, inst: | 505 except KeyError, inst: |
530 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, | 506 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
531 inst.args[0])) | 507 inst.args[0])) |
532 except SyntaxError, inst: | 508 except SyntaxError, inst: |
533 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) | 509 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
534 | |
535 class stringio(object): | |
536 '''wrap cStringIO for use by changeset_templater.''' | |
537 def __init__(self): | |
538 self.fp = cStringIO.StringIO() | |
539 | |
540 def write(self, *args): | |
541 for a in args: | |
542 self.fp.write(a) | |
543 | |
544 write_header = write | |
545 | |
546 def __getattr__(self, key): | |
547 return getattr(self.fp, key) | |
548 | 510 |
549 def show_changeset(ui, repo, opts, buffered=False): | 511 def show_changeset(ui, repo, opts, buffered=False): |
550 """show one changeset using template or regular display. | 512 """show one changeset using template or regular display. |
551 | 513 |
552 Display format will be the first non-empty hit of: | 514 Display format will be the first non-empty hit of: |