mercurial/templatekw.py
changeset 37069 724f2e21d870
parent 37068 aa97e06a1912
child 37070 1101d6747d2d
equal deleted inserted replaced
37068:aa97e06a1912 37069:724f2e21d870
   229     if branch != 'default':
   229     if branch != 'default':
   230         return compatlist(context, mapping, 'branch', [branch],
   230         return compatlist(context, mapping, 'branch', [branch],
   231                           plural='branches')
   231                           plural='branches')
   232     return compatlist(context, mapping, 'branch', [], plural='branches')
   232     return compatlist(context, mapping, 'branch', [], plural='branches')
   233 
   233 
   234 @templatekeyword('bookmarks', requires={'repo', 'ctx', 'templ'})
   234 @templatekeyword('bookmarks', requires={'repo', 'ctx'})
   235 def showbookmarks(context, mapping):
   235 def showbookmarks(context, mapping):
   236     """List of strings. Any bookmarks associated with the
   236     """List of strings. Any bookmarks associated with the
   237     changeset. Also sets 'active', the name of the active bookmark.
   237     changeset. Also sets 'active', the name of the active bookmark.
   238     """
   238     """
   239     repo = context.resource(mapping, 'repo')
   239     repo = context.resource(mapping, 'repo')
   240     ctx = context.resource(mapping, 'ctx')
   240     ctx = context.resource(mapping, 'ctx')
   241     templ = context.resource(mapping, 'templ')
       
   242     bookmarks = ctx.bookmarks()
   241     bookmarks = ctx.bookmarks()
   243     active = repo._activebookmark
   242     active = repo._activebookmark
   244     makemap = lambda v: {'bookmark': v, 'active': active, 'current': active}
   243     makemap = lambda v: {'bookmark': v, 'active': active, 'current': active}
   245     f = _showlist('bookmark', bookmarks, templ, mapping)
   244     f = _showcompatlist(context, mapping, 'bookmark', bookmarks)
   246     return _hybrid(f, bookmarks, makemap, pycompat.identity)
   245     return _hybrid(f, bookmarks, makemap, pycompat.identity)
   247 
   246 
   248 @templatekeyword('children', requires={'ctx'})
   247 @templatekeyword('children', requires={'ctx'})
   249 def showchildren(context, mapping):
   248 def showchildren(context, mapping):
   250     """List of strings. The children of the changeset."""
   249     """List of strings. The children of the changeset."""
   302     ui = context.resource(mapping, 'ui')
   301     ui = context.resource(mapping, 'ui')
   303     env = ui.exportableenviron()
   302     env = ui.exportableenviron()
   304     env = util.sortdict((k, env[k]) for k in sorted(env))
   303     env = util.sortdict((k, env[k]) for k in sorted(env))
   305     return compatdict(context, mapping, 'envvar', env, plural='envvars')
   304     return compatdict(context, mapping, 'envvar', env, plural='envvars')
   306 
   305 
   307 @templatekeyword('extras', requires={'ctx', 'templ'})
   306 @templatekeyword('extras', requires={'ctx'})
   308 def showextras(context, mapping):
   307 def showextras(context, mapping):
   309     """List of dicts with key, value entries of the 'extras'
   308     """List of dicts with key, value entries of the 'extras'
   310     field of this changeset."""
   309     field of this changeset."""
   311     ctx = context.resource(mapping, 'ctx')
   310     ctx = context.resource(mapping, 'ctx')
   312     templ = context.resource(mapping, 'templ')
       
   313     extras = ctx.extra()
   311     extras = ctx.extra()
   314     extras = util.sortdict((k, extras[k]) for k in sorted(extras))
   312     extras = util.sortdict((k, extras[k]) for k in sorted(extras))
   315     makemap = lambda k: {'key': k, 'value': extras[k]}
   313     makemap = lambda k: {'key': k, 'value': extras[k]}
   316     c = [makemap(k) for k in extras]
   314     c = [makemap(k) for k in extras]
   317     f = _showlist('extra', c, templ, mapping, plural='extras')
   315     f = _showcompatlist(context, mapping, 'extra', c, plural='extras')
   318     return _hybrid(f, extras, makemap,
   316     return _hybrid(f, extras, makemap,
   319                    lambda k: '%s=%s' % (k, util.escapestr(extras[k])))
   317                    lambda k: '%s=%s' % (k, util.escapestr(extras[k])))
   320 
   318 
   321 def _showfilesbystat(context, mapping, name, index):
   319 def _showfilesbystat(context, mapping, name, index):
   322     repo = context.resource(mapping, 'repo')
   320     repo = context.resource(mapping, 'repo')
   422 def showindex(context, mapping):
   420 def showindex(context, mapping):
   423     """Integer. The current iteration of the loop. (0 indexed)"""
   421     """Integer. The current iteration of the loop. (0 indexed)"""
   424     # just hosts documentation; should be overridden by template mapping
   422     # just hosts documentation; should be overridden by template mapping
   425     raise error.Abort(_("can't use index in this context"))
   423     raise error.Abort(_("can't use index in this context"))
   426 
   424 
   427 @templatekeyword('latesttag', requires={'repo', 'ctx', 'cache', 'templ'})
   425 @templatekeyword('latesttag', requires={'repo', 'ctx', 'cache'})
   428 def showlatesttag(context, mapping):
   426 def showlatesttag(context, mapping):
   429     """List of strings. The global tags on the most recent globally
   427     """List of strings. The global tags on the most recent globally
   430     tagged ancestor of this changeset.  If no such tags exist, the list
   428     tagged ancestor of this changeset.  If no such tags exist, the list
   431     consists of the single string "null".
   429     consists of the single string "null".
   432     """
   430     """
   445         'latesttag': v,   # BC with {latesttag % '{latesttag}'}
   443         'latesttag': v,   # BC with {latesttag % '{latesttag}'}
   446         'tag': v
   444         'tag': v
   447     }
   445     }
   448 
   446 
   449     tags = latesttags[2]
   447     tags = latesttags[2]
   450     templ = context.resource(mapping, 'templ')
   448     f = _showcompatlist(context, mapping, 'latesttag', tags, separator=':')
   451     f = _showlist('latesttag', tags, templ, mapping, separator=':')
       
   452     return _hybrid(f, tags, makemap, pycompat.identity)
   449     return _hybrid(f, tags, makemap, pycompat.identity)
   453 
   450 
   454 @templatekeyword('latesttagdistance', requires={'repo', 'ctx', 'cache'})
   451 @templatekeyword('latesttagdistance', requires={'repo', 'ctx', 'cache'})
   455 def showlatesttagdistance(context, mapping):
   452 def showlatesttagdistance(context, mapping):
   456     """Integer. Longest path to the latest tag."""
   453     """Integer. Longest path to the latest tag."""
   495     f = context.process('manifest', mapping)
   492     f = context.process('manifest', mapping)
   496     # TODO: perhaps 'ctx' should be dropped from mapping because manifest
   493     # TODO: perhaps 'ctx' should be dropped from mapping because manifest
   497     # rev and node are completely different from changeset's.
   494     # rev and node are completely different from changeset's.
   498     return _mappable(f, None, f, lambda x: {'rev': mrev, 'node': mhex})
   495     return _mappable(f, None, f, lambda x: {'rev': mrev, 'node': mhex})
   499 
   496 
   500 @templatekeyword('obsfate', requires={'ui', 'repo', 'ctx', 'templ'})
   497 @templatekeyword('obsfate', requires={'ui', 'repo', 'ctx'})
   501 def showobsfate(context, mapping):
   498 def showobsfate(context, mapping):
   502     # this function returns a list containing pre-formatted obsfate strings.
   499     # this function returns a list containing pre-formatted obsfate strings.
   503     #
   500     #
   504     # This function will be replaced by templates fragments when we will have
   501     # This function will be replaced by templates fragments when we will have
   505     # the verbosity templatekw available.
   502     # the verbosity templatekw available.
   520     ns = repo.names[namespace]
   517     ns = repo.names[namespace]
   521     names = ns.names(repo, ctx.node())
   518     names = ns.names(repo, ctx.node())
   522     return compatlist(context, mapping, ns.templatename, names,
   519     return compatlist(context, mapping, ns.templatename, names,
   523                       plural=namespace)
   520                       plural=namespace)
   524 
   521 
   525 @templatekeyword('namespaces', requires={'repo', 'ctx', 'templ'})
   522 @templatekeyword('namespaces', requires={'repo', 'ctx'})
   526 def shownamespaces(context, mapping):
   523 def shownamespaces(context, mapping):
   527     """Dict of lists. Names attached to this changeset per
   524     """Dict of lists. Names attached to this changeset per
   528     namespace."""
   525     namespace."""
   529     repo = context.resource(mapping, 'repo')
   526     repo = context.resource(mapping, 'repo')
   530     ctx = context.resource(mapping, 'ctx')
   527     ctx = context.resource(mapping, 'ctx')
   531     templ = context.resource(mapping, 'templ')
       
   532 
   528 
   533     namespaces = util.sortdict()
   529     namespaces = util.sortdict()
   534     def makensmapfn(ns):
   530     def makensmapfn(ns):
   535         # 'name' for iterating over namespaces, templatename for local reference
   531         # 'name' for iterating over namespaces, templatename for local reference
   536         return lambda v: {'name': v, ns.templatename: v}
   532         return lambda v: {'name': v, ns.templatename: v}
   537 
   533 
   538     for k, ns in repo.names.iteritems():
   534     for k, ns in repo.names.iteritems():
   539         names = ns.names(repo, ctx.node())
   535         names = ns.names(repo, ctx.node())
   540         f = _showlist('name', names, templ, mapping)
   536         f = _showcompatlist(context, mapping, 'name', names)
   541         namespaces[k] = _hybrid(f, names, makensmapfn(ns), pycompat.identity)
   537         namespaces[k] = _hybrid(f, names, makensmapfn(ns), pycompat.identity)
   542 
   538 
   543     f = _showlist('namespace', list(namespaces), templ, mapping)
   539     f = _showcompatlist(context, mapping, 'namespace', list(namespaces))
   544 
   540 
   545     def makemap(ns):
   541     def makemap(ns):
   546         return {
   542         return {
   547             'namespace': ns,
   543             'namespace': ns,
   548             'names': namespaces[ns],
   544             'names': namespaces[ns],
   631         yield "; ".join(render(d) for d in data)
   627         yield "; ".join(render(d) for d in data)
   632 
   628 
   633     return _hybrid(gen(data), data, lambda x: {'successorset': x},
   629     return _hybrid(gen(data), data, lambda x: {'successorset': x},
   634                    pycompat.identity)
   630                    pycompat.identity)
   635 
   631 
   636 @templatekeyword("succsandmarkers", requires={'repo', 'ctx', 'templ'})
   632 @templatekeyword("succsandmarkers", requires={'repo', 'ctx'})
   637 def showsuccsandmarkers(context, mapping):
   633 def showsuccsandmarkers(context, mapping):
   638     """Returns a list of dict for each final successor of ctx. The dict
   634     """Returns a list of dict for each final successor of ctx. The dict
   639     contains successors node id in "successors" keys and the list of
   635     contains successors node id in "successors" keys and the list of
   640     obs-markers from ctx to the set of successors in "markers".
   636     obs-markers from ctx to the set of successors in "markers".
   641     (EXPERIMENTAL)
   637     (EXPERIMENTAL)
   642     """
   638     """
   643     repo = context.resource(mapping, 'repo')
   639     repo = context.resource(mapping, 'repo')
   644     ctx = context.resource(mapping, 'ctx')
   640     ctx = context.resource(mapping, 'ctx')
   645     templ = context.resource(mapping, 'templ')
       
   646 
   641 
   647     values = obsutil.successorsandmarkers(repo, ctx)
   642     values = obsutil.successorsandmarkers(repo, ctx)
   648 
   643 
   649     if values is None:
   644     if values is None:
   650         values = []
   645         values = []
   671             newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:]
   666             newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:]
   672             finalmarkers.append(newmarker)
   667             finalmarkers.append(newmarker)
   673 
   668 
   674         data.append({'successors': successors, 'markers': finalmarkers})
   669         data.append({'successors': successors, 'markers': finalmarkers})
   675 
   670 
   676     f = _showlist('succsandmarkers', data, templ, mapping)
   671     f = _showcompatlist(context, mapping, 'succsandmarkers', data)
   677     return _hybrid(f, data, lambda x: x, pycompat.identity)
   672     return _hybrid(f, data, lambda x: x, pycompat.identity)
   678 
   673 
   679 @templatekeyword('p1rev', requires={'ctx'})
   674 @templatekeyword('p1rev', requires={'ctx'})
   680 def showp1rev(context, mapping):
   675 def showp1rev(context, mapping):
   681     """Integer. The repository-local revision number of the changeset's
   676     """Integer. The repository-local revision number of the changeset's
   704     parent, as a 40 digit hexadecimal string. If the changeset has no second
   699     parent, as a 40 digit hexadecimal string. If the changeset has no second
   705     parent, all digits are 0."""
   700     parent, all digits are 0."""
   706     ctx = context.resource(mapping, 'ctx')
   701     ctx = context.resource(mapping, 'ctx')
   707     return ctx.p2().hex()
   702     return ctx.p2().hex()
   708 
   703 
   709 @templatekeyword('parents', requires={'repo', 'ctx', 'templ'})
   704 @templatekeyword('parents', requires={'repo', 'ctx'})
   710 def showparents(context, mapping):
   705 def showparents(context, mapping):
   711     """List of strings. The parents of the changeset in "rev:node"
   706     """List of strings. The parents of the changeset in "rev:node"
   712     format. If the changeset has only one "natural" parent (the predecessor
   707     format. If the changeset has only one "natural" parent (the predecessor
   713     revision) nothing is shown."""
   708     revision) nothing is shown."""
   714     repo = context.resource(mapping, 'repo')
   709     repo = context.resource(mapping, 'repo')
   715     ctx = context.resource(mapping, 'ctx')
   710     ctx = context.resource(mapping, 'ctx')
   716     templ = context.resource(mapping, 'templ')
       
   717     pctxs = scmutil.meaningfulparents(repo, ctx)
   711     pctxs = scmutil.meaningfulparents(repo, ctx)
   718     prevs = [p.rev() for p in pctxs]
   712     prevs = [p.rev() for p in pctxs]
   719     parents = [[('rev', p.rev()),
   713     parents = [[('rev', p.rev()),
   720                 ('node', p.hex()),
   714                 ('node', p.hex()),
   721                 ('phase', p.phasestr())]
   715                 ('phase', p.phasestr())]
   722                for p in pctxs]
   716                for p in pctxs]
   723     f = _showlist('parent', parents, templ, mapping)
   717     f = _showcompatlist(context, mapping, 'parent', parents)
   724     return _hybrid(f, prevs, lambda x: {'ctx': repo[x], 'revcache': {}},
   718     return _hybrid(f, prevs, lambda x: {'ctx': repo[x], 'revcache': {}},
   725                    lambda x: scmutil.formatchangeid(repo[x]), keytype=int)
   719                    lambda x: scmutil.formatchangeid(repo[x]), keytype=int)
   726 
   720 
   727 @templatekeyword('phase', requires={'ctx'})
   721 @templatekeyword('phase', requires={'ctx'})
   728 def showphase(context, mapping):
   722 def showphase(context, mapping):
   744 
   738 
   745 def showrevslist(context, mapping, name, revs):
   739 def showrevslist(context, mapping, name, revs):
   746     """helper to generate a list of revisions in which a mapped template will
   740     """helper to generate a list of revisions in which a mapped template will
   747     be evaluated"""
   741     be evaluated"""
   748     repo = context.resource(mapping, 'repo')
   742     repo = context.resource(mapping, 'repo')
   749     templ = context.resource(mapping, 'templ')
   743     f = _showcompatlist(context, mapping, name, ['%d' % r for r in revs])
   750     f = _showlist(name, ['%d' % r for r in revs], templ, mapping)
       
   751     return _hybrid(f, revs,
   744     return _hybrid(f, revs,
   752                    lambda x: {name: x, 'ctx': repo[x], 'revcache': {}},
   745                    lambda x: {name: x, 'ctx': repo[x], 'revcache': {}},
   753                    pycompat.identity, keytype=int)
   746                    pycompat.identity, keytype=int)
   754 
   747 
   755 @templatekeyword('subrepos', requires={'ctx'})
   748 @templatekeyword('subrepos', requires={'ctx'})