mercurial/commands.py
changeset 1909 37b9f80a5fbb
parent 1908 be71c04d62c0
child 1910 e2fe1953f417
equal deleted inserted replaced
1908:be71c04d62c0 1909:37b9f80a5fbb
   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')