336 if user is None: |
336 if user is None: |
337 user = revcache[rev] = ui.shortuser(name) |
337 user = revcache[rev] = ui.shortuser(name) |
338 return user |
338 return user |
339 |
339 |
340 class changeset_templater(object): |
340 class changeset_templater(object): |
|
341 '''use templater module to format changeset information.''' |
|
342 |
341 def __init__(self, ui, repo, mapfile): |
343 def __init__(self, ui, repo, mapfile): |
342 self.t = templater.templater(mapfile, templater.common_filters) |
344 self.t = templater.templater(mapfile, templater.common_filters) |
343 self.ui = ui |
345 self.ui = ui |
344 self.repo = repo |
346 self.repo = repo |
345 |
347 |
346 def use_template(self, t): |
348 def use_template(self, t): |
|
349 '''set template string to use''' |
347 self.t.cache['template'] = t |
350 self.t.cache['template'] = t |
348 |
351 |
349 def write(self, thing): |
352 def write(self, thing): |
|
353 '''write expanded template. |
|
354 uses in-order recursive traverse of iterators.''' |
350 for t in thing: |
355 for t in thing: |
351 if hasattr(t, '__iter__'): |
356 if hasattr(t, '__iter__'): |
352 self.write(t) |
357 self.write(t) |
353 else: |
358 else: |
354 self.ui.write(t) |
359 self.ui.write(t) |
355 |
360 |
356 def show(self, rev=0, changenode=None, brinfo=None): |
361 def show(self, rev=0, changenode=None, brinfo=None): |
357 """show a single changeset or file revision""" |
362 '''show a single changeset or file revision''' |
358 log = self.repo.changelog |
363 log = self.repo.changelog |
359 if changenode is None: |
364 if changenode is None: |
360 changenode = log.node(rev) |
365 changenode = log.node(rev) |
361 elif not rev: |
366 elif not rev: |
362 rev = log.rev(changenode) |
367 rev = log.rev(changenode) |
363 |
368 |
364 changes = log.read(changenode) |
369 changes = log.read(changenode) |
365 |
370 |
366 def showlist(name, values, plural=None, **args): |
371 def showlist(name, values, plural=None, **args): |
|
372 '''expand set of values. |
|
373 name is name of key in template map. |
|
374 values is list of strings or dicts. |
|
375 plural is plural of name, if not simply name + 's'. |
|
376 |
|
377 expansion works like this, given name 'foo'. |
|
378 |
|
379 if values is empty, expand 'no_foos'. |
|
380 |
|
381 if 'foo' not in template map, return values as a string, |
|
382 joined by space. |
|
383 |
|
384 expand 'start_foos'. |
|
385 |
|
386 for each value, expand 'foo'. if 'last_foo' in template |
|
387 map, expand it instead of 'foo' for last key. |
|
388 |
|
389 expand 'end_foos'. |
|
390 ''' |
367 if plural: names = plural |
391 if plural: names = plural |
368 else: names = name + 's' |
392 else: names = name + 's' |
369 if not values: |
393 if not values: |
370 noname = 'no_' + names |
394 noname = 'no_' + names |
371 if noname in self.t: |
395 if noname in self.t: |
372 yield self.t(noname, **args) |
396 yield self.t(noname, **args) |
373 return |
397 return |
374 vargs = args.copy() |
|
375 if name not in self.t: |
398 if name not in self.t: |
376 yield ' '.join(values) |
399 yield ' '.join(values) |
377 return |
400 return |
378 startname = 'start_' + names |
401 startname = 'start_' + names |
379 if startname in self.t: |
402 if startname in self.t: |
380 yield self.t(startname, **args) |
403 yield self.t(startname, **args) |
|
404 vargs = args.copy() |
381 def one(v, tag=name): |
405 def one(v, tag=name): |
382 try: |
406 try: |
383 vargs.update(v) |
407 vargs.update(v) |
384 except ValueError: |
408 except ValueError: |
385 vargs.update([(name, v)]) |
409 vargs.update([(name, v)]) |
462 inst.args[0])) |
486 inst.args[0])) |
463 except SyntaxError, inst: |
487 except SyntaxError, inst: |
464 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
488 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
465 |
489 |
466 class changeset_printer(object): |
490 class changeset_printer(object): |
|
491 '''show changeset information when templating not requested.''' |
|
492 |
467 def __init__(self, ui, repo): |
493 def __init__(self, ui, repo): |
468 self.ui = ui |
494 self.ui = ui |
469 self.repo = repo |
495 self.repo = repo |
470 |
496 |
471 def show(self, rev=0, changenode=None, brinfo=None): |
497 def show(self, rev=0, changenode=None, brinfo=None): |
472 """show a single changeset or file revision""" |
498 '''show a single changeset or file revision''' |
473 log = self.repo.changelog |
499 log = self.repo.changelog |
474 if changenode is None: |
500 if changenode is None: |
475 changenode = log.node(rev) |
501 changenode = log.node(rev) |
476 elif not rev: |
502 elif not rev: |
477 rev = log.rev(changenode) |
503 rev = log.rev(changenode) |
528 self.ui.status(_("summary: %s\n") % |
554 self.ui.status(_("summary: %s\n") % |
529 description.splitlines()[0]) |
555 description.splitlines()[0]) |
530 self.ui.status("\n") |
556 self.ui.status("\n") |
531 |
557 |
532 def show_changeset(ui, repo, opts): |
558 def show_changeset(ui, repo, opts): |
|
559 '''show one changeset. uses template or regular display. caller |
|
560 can pass in 'map_file' and 'template' options in opts.''' |
|
561 |
533 tmpl = opts.get('template') |
562 tmpl = opts.get('template') |
534 if tmpl: |
563 if tmpl: |
535 tmpl = templater.parsestring(tmpl, quoted=False) |
564 tmpl = templater.parsestring(tmpl, quoted=False) |
536 else: |
565 else: |
537 tmpl = ui.config('ui', 'logtemplate') |
566 tmpl = ui.config('ui', 'logtemplate') |