comparison mercurial/templater.py @ 3644:54d27caf6a78

templater: speed up changeset writes and stringify
author Matt Mackall <mpm@selenic.com>
date Mon, 13 Nov 2006 13:26:57 -0600
parents 1b2cd5dceca2
children b2c47652e8e3
comparison
equal deleted inserted replaced
3643:1b2cd5dceca2 3644:54d27caf6a78
153 if n >= 2 or s == 1: 153 if n >= 2 or s == 1:
154 return fmt(t, n) 154 return fmt(t, n)
155 155
156 def stringify(thing): 156 def stringify(thing):
157 '''turn nested template iterator into string.''' 157 '''turn nested template iterator into string.'''
158 def flatten(thing): 158 if hasattr(thing, '__iter__'):
159 if hasattr(thing, '__iter__'): 159 return "".join([stringify(t) for t in thing])
160 for t in thing: 160 return str(thing)
161 for i in flatten(t):
162 yield i
163 else:
164 yield str(thing)
165 return "".join(flatten(thing))
166 161
167 para_re = None 162 para_re = None
168 space_re = None 163 space_re = None
169 164
170 def fill(text, width): 165 def fill(text, width):
307 self.repo = repo 302 self.repo = repo
308 303
309 def use_template(self, t): 304 def use_template(self, t):
310 '''set template string to use''' 305 '''set template string to use'''
311 self.t.cache['changeset'] = t 306 self.t.cache['changeset'] = t
312
313 def write(self, thing, header=False):
314 '''write expanded template.
315 uses in-order recursive traverse of iterators.'''
316 dest = self.dest or self.ui
317 for t in thing:
318 if hasattr(t, '__iter__'):
319 self.write(t, header=header)
320 elif header:
321 dest.write_header(t)
322 else:
323 dest.write(t)
324
325 def write_header(self, thing):
326 self.write(thing, header=True)
327 307
328 def show(self, rev=0, changenode=None, brinfo=None, copies=[], **props): 308 def show(self, rev=0, changenode=None, brinfo=None, copies=[], **props):
329 '''show a single changeset or file revision''' 309 '''show a single changeset or file revision'''
330 log = self.repo.changelog 310 log = self.repo.changelog
331 if changenode is None: 311 if changenode is None:
476 } 456 }
477 props = props.copy() 457 props = props.copy()
478 props.update(defprops) 458 props.update(defprops)
479 459
480 try: 460 try:
461 dest = self.dest or self.ui
481 if self.ui.debugflag and 'header_debug' in self.t: 462 if self.ui.debugflag and 'header_debug' in self.t:
482 key = 'header_debug' 463 key = 'header_debug'
483 elif self.ui.quiet and 'header_quiet' in self.t: 464 elif self.ui.quiet and 'header_quiet' in self.t:
484 key = 'header_quiet' 465 key = 'header_quiet'
485 elif self.ui.verbose and 'header_verbose' in self.t: 466 elif self.ui.verbose and 'header_verbose' in self.t:
487 elif 'header' in self.t: 468 elif 'header' in self.t:
488 key = 'header' 469 key = 'header'
489 else: 470 else:
490 key = '' 471 key = ''
491 if key: 472 if key:
492 self.write_header(self.t(key, **props)) 473 dest.write_header(stringify(self.t(key, **props)))
493 if self.ui.debugflag and 'changeset_debug' in self.t: 474 if self.ui.debugflag and 'changeset_debug' in self.t:
494 key = 'changeset_debug' 475 key = 'changeset_debug'
495 elif self.ui.quiet and 'changeset_quiet' in self.t: 476 elif self.ui.quiet and 'changeset_quiet' in self.t:
496 key = 'changeset_quiet' 477 key = 'changeset_quiet'
497 elif self.ui.verbose and 'changeset_verbose' in self.t: 478 elif self.ui.verbose and 'changeset_verbose' in self.t:
498 key = 'changeset_verbose' 479 key = 'changeset_verbose'
499 else: 480 else:
500 key = 'changeset' 481 key = 'changeset'
501 self.write(self.t(key, **props)) 482 dest.write(stringify(self.t(key, **props)))
502 except KeyError, inst: 483 except KeyError, inst:
503 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, 484 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile,
504 inst.args[0])) 485 inst.args[0]))
505 except SyntaxError, inst: 486 except SyntaxError, inst:
506 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) 487 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0]))