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: