##// END OF EJS Templates
wireproto: separate commands tables for version 1 and 2 commands...
wireproto: separate commands tables for version 1 and 2 commands We can't easily reuse existing command handlers for version 2 commands because the response types will be different. e.g. many commands return nodes encoded as hex. Our new wire protocol is binary safe, so we'll wish to encode nodes as binary. We /could/ teach each command handler to look at the protocol handler and change behavior based on the version in use. However, this would make logic a bit unwieldy over time and would make it harder to design a unified protocol handler interface. I think it's better to create a clean break between version 1 and version 2 of commands on the server. What I imagine happening is we will have separate @wireprotocommand functions for each protocol generation. Those functions will parse the request, dispatch to a common function to process it, then generate the response in its own, transport-specific manner. This commit establishes a separate table for tracking version 1 commands from version 2 commands. The HTTP server pieces have been updated to use this new table. Most commands are marked as both version 1 and version 2, so there is little practical impact to this change. A side-effect of this change is we now rely on transport registration in wireprototypes.TRANSPORTS and certain properties of the protocol interface. So a test had to be updated to conform. Differential Revision: https://phab.mercurial-scm.org/D2982

File last commit:

r37292:45987e2b default
r37311:45b39c69 default
Show More
templatekw.py
801 lines | 29.6 KiB | text/x-python | PythonLexer
Patrick Mezard
cmdutil: replace showlist() closure with a function
r10053 # templatekw.py - common changeset template keywords
#
# Copyright 2005-2009 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Merge with stable
r10264 # GNU General Public License version 2 or any later version.
Patrick Mezard
cmdutil: replace showlist() closure with a function
r10053
Gregory Szorc
templatekw: use absolute_import
r25984 from __future__ import absolute_import
Yuya Nishihara
templater: provide loop counter as "index" keyword...
r31807 from .i18n import _
Yuya Nishihara
scmutil: introduce binnode(ctx) as paired function with intrev(ctx)...
r32656 from .node import (
hex,
nullid,
)
Gregory Szorc
templatekw: use absolute_import
r25984 from . import (
Yuya Nishihara
templatekw: workaround for utf-8 round-trip of {desc}...
r28239 encoding,
Gregory Szorc
templatekw: use absolute_import
r25984 error,
hbisect,
Yuya Nishihara
log: translate column labels at once (issue5750)...
r35213 i18n,
Boris Feld
template: add predecessors template...
r32879 obsutil,
Gregory Szorc
templatekw: use absolute_import
r25984 patch,
Pulkit Goyal
py3: convert keys of kwargs in template keywords functions to bytes...
r32972 pycompat,
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 registrar,
Gregory Szorc
templatekw: use absolute_import
r25984 scmutil,
Yuya Nishihara
templater: move hybrid class and functions to templateutil module...
r36939 templateutil,
Gregory Szorc
templatekw: use absolute_import
r25984 util,
)
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 from .utils import (
stringutil,
)
Patrick Mezard
cmdutil: replace showlist() closure with a function
r10053
Yuya Nishihara
templater: move hybrid class and functions to templateutil module...
r36939 _hybrid = templateutil.hybrid
_mappable = templateutil.mappable
hybriddict = templateutil.hybriddict
hybridlist = templateutil.hybridlist
compatdict = templateutil.compatdict
compatlist = templateutil.compatlist
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 _showcompatlist = templateutil._showcompatlist
def _showlist(name, values, templ, mapping, plural=None, separator=' '):
Yuya Nishihara
templatekw: mark _showlist() as deprecated (API)...
r37089 ui = mapping.get('ui')
if ui:
ui.deprecwarn("templatekw._showlist() is deprecated, use "
"templateutil._showcompatlist()", '4.6')
Yuya Nishihara
templater: drop 'templ' from resources dict...
r37088 context = templ # this is actually a template context, not a templater
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 return _showcompatlist(context, mapping, name, values, plural, separator)
Yuya Nishihara
templatekw: add compatlist() as a replacement for showlist()...
r36538
Yuya Nishihara
templatekw: factor out showdict() helper...
r32038 def showdict(name, data, mapping, plural=None, key='key', value='value',
Yuya Nishihara
templater: allow dynamically switching the default dict/list formatting...
r36651 fmt=None, separator=' '):
Yuya Nishihara
templatekw: deprecate showdict() and showlist() (API)...
r36617 ui = mapping.get('ui')
if ui:
Yuya Nishihara
templater: move hybrid class and functions to templateutil module...
r36939 ui.deprecwarn("templatekw.showdict() is deprecated, use "
"templateutil.compatdict()", '4.6')
Yuya Nishihara
templatekw: factor out showdict() helper...
r32038 c = [{key: k, value: v} for k, v in data.iteritems()]
Yuya Nishihara
templatekw: pass templater to _showlist() by an explicit argument...
r36536 f = _showlist(name, c, mapping['templ'], mapping, plural, separator)
Yuya Nishihara
templatekw: factor out showdict() helper...
r32038 return hybriddict(data, key=key, value=value, fmt=fmt, gen=f)
Yuya Nishihara
templatekw: have showlist() take mapping dict with no **kwargs expansion (API)...
r32037 def showlist(name, values, mapping, plural=None, element=None, separator=' '):
Yuya Nishihara
templatekw: deprecate showdict() and showlist() (API)...
r36617 ui = mapping.get('ui')
if ui:
Yuya Nishihara
templater: move hybrid class and functions to templateutil module...
r36939 ui.deprecwarn("templatekw.showlist() is deprecated, use "
"templateutil.compatlist()", '4.6')
Matt Mackall
templating: make new-style templating features work with command line lists
r17631 if not element:
element = name
Yuya Nishihara
templatekw: pass templater to _showlist() by an explicit argument...
r36536 f = _showlist(name, values, mapping['templ'], mapping, plural, separator)
Yuya Nishihara
templatekw: add public function to wrap a list by _hybrid object
r31924 return hybridlist(values, name=element, gen=f)
Matt Mackall
templating: make new-style templating features work with command line lists
r17631
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 def getlatesttags(context, mapping, pattern=None):
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057 '''return date, distance and name for the latest tag of rev'''
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
cache = context.resource(mapping, 'cache')
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057
Matt Harbison
templatekw: allow getlatesttags() to match a specific tag pattern...
r26482 cachename = 'latesttags'
if pattern is not None:
cachename += '-' + pattern
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 match = stringutil.stringmatcher(pattern)[2]
Matt Harbison
templatekw: allow getlatesttags() to match a specific tag pattern...
r26482 else:
match = util.always
if cachename not in cache:
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057 # Cache mapping from rev to a tuple with tag date, tag
# distance and tag name
Matt Harbison
templatekw: allow getlatesttags() to match a specific tag pattern...
r26482 cache[cachename] = {-1: (0, 0, ['null'])}
latesttags = cache[cachename]
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057
rev = ctx.rev()
todo = [rev]
while todo:
rev = todo.pop()
if rev in latesttags:
continue
ctx = repo[rev]
Andrew Shadura
templatekw: allow tagtypes other than global in getlatesttags...
r20218 tags = [t for t in ctx.tags()
Matt Harbison
templatekw: allow getlatesttags() to match a specific tag pattern...
r26482 if (repo.tagtype(t) and repo.tagtype(t) != 'local'
and match(t))]
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057 if tags:
Matt Harbison
templatekw: use a list of tags in getlatesttags() instead of joining them...
r25700 latesttags[rev] = ctx.date()[0], 0, [t for t in sorted(tags)]
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057 continue
try:
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 ptags = [latesttags[p.rev()] for p in ctx.parents()]
if len(ptags) > 1:
if ptags[0][2] == ptags[1][2]:
# The tuples are laid out so the right one can be found by
# comparison in this case.
pdate, pdist, ptag = max(ptags)
else:
def key(x):
changessincetag = len(repo.revs('only(%d, %s)',
ctx.rev(), x[2][0]))
# Smallest number of changes since tag wins. Date is
# used as tiebreaker.
return [-changessincetag, x[0]]
pdate, pdist, ptag = max(ptags, key=key)
else:
pdate, pdist, ptag = ptags[0]
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057 except KeyError:
# Cache miss - recurse
todo.append(rev)
todo.extend(p.rev() for p in ctx.parents())
continue
latesttags[rev] = pdate, pdist + 1, ptag
return latesttags[rev]
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060 def getrenamedfn(repo, endrev=None):
rcache = {}
if endrev is None:
endrev = len(repo)
def getrenamed(fn, rev):
'''looks up all renames for a file (up to endrev) the first
time the file is given. It indexes on the changerev and only
parses the manifest if linkrev != changerev.
Returns rename info for fn at changerev rev.'''
if fn not in rcache:
rcache[fn] = {}
fl = repo.file(fn)
for i in fl:
lr = fl.linkrev(i)
renamed = fl.renamed(fl.node(i))
rcache[fn][lr] = renamed
if lr >= endrev:
break
if rev in rcache[fn]:
return rcache[fn][rev]
# If linkrev != rev (i.e. rev not found in rcache) fallback to
# filectx logic.
try:
return repo[rev][fn].renamed()
except error.LookupError:
return None
return getrenamed
Yuya Nishihara
log: translate column labels at once (issue5750)...
r35213 def getlogcolumns():
"""Return a dict of log column labels"""
_ = pycompat.identity # temporarily disable gettext
# i18n: column positioning for "hg log"
columns = _('bookmark: %s\n'
'branch: %s\n'
'changeset: %s\n'
'copies: %s\n'
'date: %s\n'
'extra: %s=%s\n'
'files+: %s\n'
'files-: %s\n'
'files: %s\n'
'instability: %s\n'
'manifest: %s\n'
'obsolete: %s\n'
'parent: %s\n'
'phase: %s\n'
'summary: %s\n'
'tag: %s\n'
'user: %s\n')
return dict(zip([s.split(':', 1)[0] for s in columns.splitlines()],
i18n._(columns).splitlines(True)))
Yuya Nishihara
templatekw: move defaulttmpl constant from changeset_templater...
r31171 # default templates internally used for rendering of lists
defaulttempl = {
'parent': '{rev}:{node|formatnode} ',
'manifest': '{rev}:{node|formatnode}',
'file_copy': '{name} ({source})',
'envvar': '{key}={value}',
'extra': '{key}={value|stringescape}'
}
# filecopy is preserved for compatibility reasons
defaulttempl['filecopy'] = defaulttempl['file_copy']
Yuya Nishihara
templatekw: add 'requires' flag to switch to exception-safe interface...
r36463 # keywords are callables (see registrar.templatekeyword for details)
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 keywords = {}
templatekeyword = registrar.templatekeyword(keywords)
Yuya Nishihara
templatekw: add 'requires' flag to switch to exception-safe interface...
r36463 @templatekeyword('author', requires={'ctx'})
def showauthor(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The unmodified author of the changeset."""
Yuya Nishihara
templatekw: add 'requires' flag to switch to exception-safe interface...
r36463 ctx = context.resource(mapping, 'ctx')
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054 return ctx.user()
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('bisect', requires={'repo', 'ctx'})
def showbisect(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The changeset bisection status."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
"Yann E. MORIN"
templates: add 'bisect' keyword to return a cset's bisect status...
r15155 return hbisect.label(repo, ctx.node())
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('branch', requires={'ctx'})
def showbranch(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The name of the branch on which the changeset was
Patrick Mezard
templates: generate keyword help dynamically
r13585 committed.
"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
return ctx.branch()
Eric Eisner
template: add showbranch template for {branch}...
r13156
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('branches', requires={'ctx'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showbranches(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. The name of the branch on which the
Patrick Mezard
templates: generate keyword help dynamically
r13585 changeset was committed. Will be empty if the branch name was
Yuya Nishihara
templatekw: hide help of "branches" by DEPRECATED marker...
r26437 default. (DEPRECATED)
Patrick Mezard
templates: generate keyword help dynamically
r13585 """
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 ctx = context.resource(mapping, 'ctx')
branch = ctx.branch()
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054 if branch != 'default':
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return compatlist(context, mapping, 'branch', [branch],
plural='branches')
return compatlist(context, mapping, 'branch', [], plural='branches')
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('bookmarks', requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 def showbookmarks(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Any bookmarks associated with the
Ryan McElroy
templatekw: introduce active subkeyword from bookmarks keyword...
r25348 changeset. Also sets 'active', the name of the active bookmark.
Patrick Mezard
templates: document missing keywords or filters...
r13592 """
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
bookmarks = ctx.bookmarks()
Ryan McElroy
templatekw: introduce active subkeyword from bookmarks keyword...
r25348 active = repo._activebookmark
makemap = lambda v: {'bookmark': v, 'active': active, 'current': active}
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'bookmark', bookmarks)
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 return _hybrid(f, bookmarks, makemap, pycompat.identity)
David Soria Parra
templater: add bookmarks to templates and default output...
r13386
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('children', requires={'ctx'})
Yuya Nishihara
templatekw: add compatlist() as a replacement for showlist()...
r36538 def showchildren(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. The children of the changeset."""
Yuya Nishihara
templatekw: add compatlist() as a replacement for showlist()...
r36538 ctx = context.resource(mapping, 'ctx')
Gregory Szorc
templatekw: use ctx.rev() instead of casting context to int...
r36419 childrevs = ['%d:%s' % (cctx.rev(), cctx) for cctx in ctx.children()]
Yuya Nishihara
templatekw: add compatlist() as a replacement for showlist()...
r36538 return compatlist(context, mapping, 'children', childrevs, element='child')
Jason Harris
templates: 'children' keyword...
r11655
Ryan McElroy
templatekw: introduce activebookmark keyword...
r25013 # Deprecated, but kept alive for help generation a purpose.
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('currentbookmark', requires={'repo', 'ctx'})
def showcurrentbookmark(context, mapping):
Yuya Nishihara
help: fix formatting of template keywords...
r34657 """String. The active bookmark, if it is associated with the changeset.
(DEPRECATED)"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 return showactivebookmark(context, mapping)
Ryan McElroy
templatekw: introduce activebookmark keyword...
r25013
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('activebookmark', requires={'repo', 'ctx'})
def showactivebookmark(context, mapping):
Yuya Nishihara
help: fix formatting of template keywords...
r34657 """String. The active bookmark, if it is associated with the changeset."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
active = repo._activebookmark
if active and active in ctx.bookmarks():
Ryan McElroy
templatekw: display active bookmark more consistently (issue4552) (BC)...
r25387 return active
FUJIWARA Katsunori
templatekw: add 'currentbookmark' keyword to show current bookmark easily...
r21896 return ''
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('date', requires={'ctx'})
def showdate(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Date information. The date when the changeset was committed."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054 return ctx.date()
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('desc', requires={'ctx'})
def showdescription(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The text of the changeset description."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
templatekw: workaround for utf-8 round-trip of {desc}...
r28239 s = ctx.description()
if isinstance(s, encoding.localstr):
# try hard to preserve utf-8 bytes
return encoding.tolocal(encoding.fromlocal(s).strip())
else:
return s.strip()
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('diffstat', requires={'ctx'})
def showdiffstat(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. Statistics of changes with the following format:
Patrick Mezard
templates: generate keyword help dynamically
r13585 "modified files: +added/-removed lines"
"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Matthieu Laneuville
templatekw: force noprefix=False to insure diffstat consistency (issue4755)...
r30811 stats = patch.diffstatdata(util.iterlines(ctx.diff(noprefix=False)))
Steven Brown
patch: restore the previous output of 'diff --stat'...
r14437 maxname, maxtotal, adds, removes, binary = patch.diffstatsum(stats)
Yuya Nishihara
py3: use '%d' to format diffstat sum
r36517 return '%d: +%d/-%d' % (len(stats), adds, removes)
Patrick Mezard
cmdutil: extract repo dependent closures in templatekw
r10055
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('envvars', requires={'ui'})
Yuya Nishihara
templatekw: add compatdict() as a replacement for showdict()...
r36537 def showenvvars(context, mapping):
Matt Harbison
templater: add '{envvars}' to access environment variables...
r30833 """A dictionary of environment variables. (EXPERIMENTAL)"""
Yuya Nishihara
templatekw: add compatdict() as a replacement for showdict()...
r36537 ui = context.resource(mapping, 'ui')
Yuya Nishihara
templatekw: minimize resource dependency of {envvars} and {termwidth}...
r36460 env = ui.exportableenviron()
Matt Harbison
templater: add '{envvars}' to access environment variables...
r30833 env = util.sortdict((k, env[k]) for k in sorted(env))
Yuya Nishihara
templatekw: add compatdict() as a replacement for showdict()...
r36537 return compatdict(context, mapping, 'envvar', env, plural='envvars')
Matt Harbison
templater: add '{envvars}' to access environment variables...
r30833
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('extras', requires={'ctx'})
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 def showextras(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of dicts with key, value entries of the 'extras'
Matthew Turk
help: document about {extras} template keyword...
r20015 field of this changeset."""
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 ctx = context.resource(mapping, 'ctx')
extras = ctx.extra()
Yuya Nishihara
templatekw: convert list of key/value pairs to sortdict...
r24237 extras = util.sortdict((k, extras[k]) for k in sorted(extras))
Yuya Nishihara
templatekw: give name to lambda that constructs variables map of templater...
r24238 makemap = lambda k: {'key': k, 'value': extras[k]}
c = [makemap(k) for k in extras]
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'extra', c, plural='extras')
Yuya Nishihara
templatekw: keep raw list or dict in _hybrid object...
r24239 return _hybrid(f, extras, makemap,
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 lambda k: '%s=%s' % (k, stringutil.escapestr(extras[k])))
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def _showfilesbystat(context, mapping, name, index):
repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
revcache = context.resource(mapping, 'revcache')
Yuya Nishihara
templatekw: inline getfiles()...
r36533 if 'files' not in revcache:
revcache['files'] = repo.status(ctx.p1(), ctx)[:3]
files = revcache['files'][index]
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return compatlist(context, mapping, name, files, element='file')
Yuya Nishihara
templatekw: factor out function to build a list of files per status...
r36532
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('file_adds', requires={'repo', 'ctx', 'revcache'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showfileadds(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Files added by this changeset."""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return _showfilesbystat(context, mapping, 'file_add', 1)
Patrick Mezard
cmdutil: extract file changes closures into templatekw
r10056
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 @templatekeyword('file_copies',
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 requires={'repo', 'ctx', 'cache', 'revcache'})
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 def showfilecopies(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Files copied in this changeset with
Patrick Mezard
templates: generate keyword help dynamically
r13585 their sources.
"""
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
cache = context.resource(mapping, 'cache')
copies = context.resource(mapping, 'revcache').get('copies')
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060 if copies is None:
if 'getrenamed' not in cache:
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 cache['getrenamed'] = getrenamedfn(repo)
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060 copies = []
getrenamed = cache['getrenamed']
for fn in ctx.files():
rename = getrenamed(fn, ctx.rev())
if rename:
copies.append((fn, rename[0]))
Matt Mackall
many, many trivial check-code fixups
r10282
Yuya Nishihara
templatekw: convert list of key/value pairs to sortdict...
r24237 copies = util.sortdict(copies)
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 return compatdict(context, mapping, 'file_copy', copies,
key='name', value='source', fmt='%s (%s)',
plural='file_copies')
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060
# showfilecopiesswitch() displays file copies only if copy records are
# provided before calling the templater, usually with a --copies
# command line switch.
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('file_copies_switch', requires={'revcache'})
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 def showfilecopiesswitch(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Like "file_copies" but displayed
Patrick Mezard
templates: generate keyword help dynamically
r13585 only if the --copied switch is set.
"""
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 copies = context.resource(mapping, 'revcache').get('copies') or []
Yuya Nishihara
templatekw: convert list of key/value pairs to sortdict...
r24237 copies = util.sortdict(copies)
Yuya Nishihara
templatekw: switch showdict template keywords to new API
r36608 return compatdict(context, mapping, 'file_copy', copies,
key='name', value='source', fmt='%s (%s)',
plural='file_copies')
Patrick Mezard
cmdutil: extract file copies closure into templatekw
r10058
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('file_dels', requires={'repo', 'ctx', 'revcache'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showfiledels(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Files removed by this changeset."""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return _showfilesbystat(context, mapping, 'file_del', 2)
Patrick Mezard
cmdutil: extract file changes closures into templatekw
r10056
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('file_mods', requires={'repo', 'ctx', 'revcache'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showfilemods(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Files modified by this changeset."""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return _showfilesbystat(context, mapping, 'file_mod', 0)
Patrick Mezard
cmdutil: extract file changes closures into templatekw
r10056
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('files', requires={'ctx'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showfiles(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. All files modified, added, or removed by this
Patrick Mezard
templates: generate keyword help dynamically
r13585 changeset.
"""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 ctx = context.resource(mapping, 'ctx')
return compatlist(context, mapping, 'file', ctx.files())
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('graphnode', requires={'repo', 'ctx'})
def showgraphnode(context, mapping):
Yuya Nishihara
help: fix formatting of template keywords...
r34657 """String. The character representing the changeset node in an ASCII
revision graph."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
templatekw: extract non-templatekw function as getgraphnode()...
r36530 return getgraphnode(repo, ctx)
def getgraphnode(repo, ctx):
Yuya Nishihara
templatekw: avoid slow creation of changectx objects in showgraphnode()...
r27215 wpnodes = repo.dirstate.parents()
if wpnodes[1] == nullid:
wpnodes = wpnodes[:1]
Yuya Nishihara
graphlog: extract "graphnode" template keyword that represents node symbol...
r27214 if ctx.node() in wpnodes:
return '@'
elif ctx.obsolete():
return 'x'
av6
graphlog: add another graph node type, unstable, using character "*" (BC)
r35524 elif ctx.isunstable():
return '*'
Yuya Nishihara
graphlog: extract "graphnode" template keyword that represents node symbol...
r27214 elif ctx.closesbranch():
return '_'
else:
return 'o'
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('graphwidth', requires=())
def showgraphwidth(context, mapping):
Danny Hooper
log: add a "graphwidth" template variable...
r33860 """Integer. The width of the graph drawn by 'log --graph' or zero."""
Yuya Nishihara
templatekw: simply override {graphwidth} function by mapping variable
r36459 # just hosts documentation; should be overridden by template mapping
return 0
Danny Hooper
log: add a "graphwidth" template variable...
r33860
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('index', requires=())
def showindex(context, mapping):
Yuya Nishihara
templater: provide loop counter as "index" keyword...
r31807 """Integer. The current iteration of the loop. (0 indexed)"""
# just hosts documentation; should be overridden by template mapping
raise error.Abort(_("can't use index in this context"))
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('latesttag', requires={'repo', 'ctx', 'cache'})
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 def showlatesttag(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. The global tags on the most recent globally
Matt Harbison
templatekw: clarify the result of {latesttag} when no tag exists...
r31850 tagged ancestor of this changeset. If no such tags exist, the list
consists of the single string "null".
Patrick Mezard
templates: generate keyword help dynamically
r13585 """
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 return showlatesttags(context, mapping, None)
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 def showlatesttags(context, mapping, pattern):
Matt Harbison
templatekw: introduce showlatesttags() to handle {latesttag} keywords...
r26484 """helper method for the latesttag keyword and function"""
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 latesttags = getlatesttags(context, mapping, pattern)
Matt Harbison
templatekw: introduce showlatesttags() to handle {latesttag} keywords...
r26484
# latesttag[0] is an implementation detail for sorting csets on different
# branches in a stable manner- it is the date the tagged cset was created,
# not the date the tag was created. Therefore it isn't made visible here.
makemap = lambda v: {
'changes': _showchangessincetag,
'distance': latesttags[1],
'latesttag': v, # BC with {latesttag % '{latesttag}'}
'tag': v
}
tags = latesttags[2]
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'latesttag', tags, separator=':')
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 return _hybrid(f, tags, makemap, pycompat.identity)
Matt Harbison
templatekw: introduce showlatesttags() to handle {latesttag} keywords...
r26484
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 @templatekeyword('latesttagdistance', requires={'repo', 'ctx', 'cache'})
def showlatesttagdistance(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Integer. Longest path to the latest tag."""
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 return getlatesttags(context, mapping)[1]
Patrick Mezard
cmdutil: extract latest tags closures in templatekw
r10057
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 @templatekeyword('changessincelatesttag', requires={'repo', 'ctx', 'cache'})
def showchangessincelatesttag(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Integer. All ancestors not in the latest tag."""
Yuya Nishihara
templater: factor out function to create mapping dict for nested evaluation...
r37092 tag = getlatesttags(context, mapping)[2][0]
mapping = context.overlaymap(mapping, {'tag': tag})
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 return _showchangessincetag(context, mapping)
Matt Harbison
templatekw: factor out the changessincetag calculation to a private method...
r26483
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 def _showchangessincetag(context, mapping):
repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Matt Harbison
templatekw: introduce the changessincelatesttag keyword...
r25724 offset = 0
revs = [ctx.rev()]
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 tag = context.symbol(mapping, 'tag')
Matt Harbison
templatekw: introduce the changessincelatesttag keyword...
r25724
# The only() revset doesn't currently support wdir()
if ctx.rev() is None:
offset = 1
revs = [p.rev() for p in ctx.parents()]
Matt Harbison
templatekw: factor out the changessincetag calculation to a private method...
r26483 return len(repo.revs('only(%ld, %s)', revs, tag)) + offset
Matt Harbison
templatekw: introduce the changessincelatesttag keyword...
r25724
Yuya Nishihara
templatekw: switch latesttags template keywords to new API
r36614 # teach templater latesttags.changes is switched to (context, mapping) API
_showchangessincetag._requires = {'repo', 'ctx'}
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('manifest', requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch manifest template keyword to new API
r36615 def showmanifest(context, mapping):
repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
templatekw: have {manifest} use ctx.manifestnode() for consistency...
r24676 mnode = ctx.manifestnode()
Yuya Nishihara
templatekw: apply manifest template only if ctx.manifestnode() exists...
r25736 if mnode is None:
# just avoid crash, we might want to use the 'ff...' hash in future
return
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331 mrev = repo.manifestlog._revlog.rev(mnode)
mhex = hex(mnode)
Yuya Nishihara
templater: factor out function to create mapping dict for nested evaluation...
r37092 mapping = context.overlaymap(mapping, {'rev': mrev, 'node': mhex})
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 f = context.process('manifest', mapping)
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331 # TODO: perhaps 'ctx' should be dropped from mapping because manifest
# rev and node are completely different from changeset's.
Yuya Nishihara
templater: wrap get/min/max result so map operation can apply to element...
r34535 return _mappable(f, None, f, lambda x: {'rev': mrev, 'node': mhex})
Patrick Mezard
cmdutil: extract repo dependent closures in templatekw
r10055
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('obsfate', requires={'ui', 'repo', 'ctx'})
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 def showobsfate(context, mapping):
Boris Feld
templatekw: introduce obsfate keyword...
r34848 # this function returns a list containing pre-formatted obsfate strings.
#
# This function will be replaced by templates fragments when we will have
# the verbosity templatekw available.
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 succsandmarkers = showsuccsandmarkers(context, mapping)
Boris Feld
templatekw: introduce obsfate keyword...
r34848
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 ui = context.resource(mapping, 'ui')
Boris Feld
templatekw: introduce obsfate keyword...
r34848 values = []
for x in succsandmarkers:
values.append(obsutil.obsfateprinter(x['successors'], x['markers'], ui))
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 return compatlist(context, mapping, "fate", values)
Boris Feld
templatekw: introduce obsfate keyword...
r34848
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 def shownames(context, mapping, namespace):
Yuya Nishihara
templatekw: move shownames() helper to be sorted alphabetically...
r27893 """helper method to generate a template keyword for a namespace"""
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
templatekw: move shownames() helper to be sorted alphabetically...
r27893 ns = repo.names[namespace]
names = ns.names(repo, ctx.node())
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 return compatlist(context, mapping, ns.templatename, names,
plural=namespace)
Yuya Nishihara
templatekw: move shownames() helper to be sorted alphabetically...
r27893
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('namespaces', requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 def shownamespaces(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Dict of lists. Names attached to this changeset per
Yuya Nishihara
templatekw: add {namespaces} keyword...
r27894 namespace."""
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
namespaces = util.sortdict()
Yuya Nishihara
templatekw: allow accessing to nested namespace item by its template name...
r34542 def makensmapfn(ns):
# 'name' for iterating over namespaces, templatename for local reference
return lambda v: {'name': v, ns.templatename: v}
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
for k, ns in repo.names.iteritems():
Yuya Nishihara
templatekw: allow accessing to nested namespace item by its template name...
r34542 names = ns.names(repo, ctx.node())
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'name', names)
Yuya Nishihara
templatekw: allow accessing to nested namespace item by its template name...
r34542 namespaces[k] = _hybrid(f, names, makensmapfn(ns), pycompat.identity)
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'namespace', list(namespaces))
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047
def makemap(ns):
return {
'namespace': ns,
'names': namespaces[ns],
Yuya Nishihara
templatekw: get rid of temporary dicts from shownamespaces()
r34541 'builtin': repo.names[ns].builtin,
'colorname': repo.names[ns].colorname,
Gregory Szorc
templatekw: expose color name in {namespaces} entries...
r33047 }
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 return _hybrid(f, namespaces, makemap, pycompat.identity)
Yuya Nishihara
templatekw: add {namespaces} keyword...
r27894
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('node', requires={'ctx'})
def shownode(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The changeset identification hash, as a 40 hexadecimal
Patrick Mezard
templates: generate keyword help dynamically
r13585 digit string.
"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054 return ctx.hex()
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('obsolete', requires={'ctx'})
def showobsolete(context, mapping):
Yuya Nishihara
help: hide template keywords of obsolescence as they are still experimental
r34658 """String. Whether the changeset is obsolete. (EXPERIMENTAL)"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Denis Laxalde
templatekw: add an "obsolete" keyword...
r31699 if ctx.obsolete():
return 'obsolete'
return ''
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('peerurls', requires={'repo'})
def showpeerurls(context, mapping):
Yuya Nishihara
templatekw: export ui.paths as {peerpaths}...
r33414 """A dictionary of repository locations defined in the [paths] section
Yuya Nishihara
templatekw: rename peerpaths to peerurls per naming convention (BC)...
r34540 of your configuration file."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
Yuya Nishihara
templatekw: export ui.paths as {peerpaths}...
r33414 # see commands.paths() for naming of dictionary keys
Yuya Nishihara
templatekw: make experimental {peerpaths} return a single-level dict (BC)...
r34539 paths = repo.ui.paths
urls = util.sortdict((k, p.rawloc) for k, p in sorted(paths.iteritems()))
def makemap(k):
p = paths[k]
d = {'name': k, 'url': p.rawloc}
Yuya Nishihara
templatekw: export ui.paths as {peerpaths}...
r33414 d.update((o, v) for o, v in sorted(p.suboptions.iteritems()))
Yuya Nishihara
templatekw: make experimental {peerpaths} return a single-level dict (BC)...
r34539 return d
return _hybrid(None, urls, makemap, lambda k: '%s=%s' % (k, urls[k]))
Yuya Nishihara
templatekw: export ui.paths as {peerpaths}...
r33414
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword("predecessors", requires={'repo', 'ctx'})
def showpredecessors(context, mapping):
Yuya Nishihara
help: hide template keywords of obsolescence as they are still experimental
r34658 """Returns the list if the closest visible successors. (EXPERIMENTAL)"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Boris Feld
template: add predecessors template...
r32879 predecessors = sorted(obsutil.closestpredecessors(repo, ctx.node()))
predecessors = map(hex, predecessors)
Yuya Nishihara
templatekw: populate all keywords depending on predecessor in map operation...
r32910 return _hybrid(None, predecessors,
Yuya Nishihara
templater: switch 'revcache' based on new mapping items...
r37121 lambda x: {'ctx': repo[x]},
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 lambda x: scmutil.formatchangeid(repo[x]))
Boris Feld
template: add predecessors template...
r32879
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('reporoot', requires={'repo'})
def showreporoot(context, mapping):
Yuya Nishihara
templatekw: add {reporoot} keyword...
r36261 """String. The root directory of the current repository."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
Yuya Nishihara
templatekw: add {reporoot} keyword...
r36261 return repo.root
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword("successorssets", requires={'repo', 'ctx'})
def showsuccessorssets(context, mapping):
Yuya Nishihara
help: fix formatting of template keywords...
r34657 """Returns a string of sets of successors for a changectx. Format used
is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and ctx2
Yuya Nishihara
help: hide template keywords of obsolescence as they are still experimental
r34658 while also diverged into ctx3. (EXPERIMENTAL)"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Boris Feld
template: add successors template...
r33276 if not ctx.obsolete():
return ''
ssets = obsutil.successorssets(repo, ctx.node(), closest=True)
ssets = [[hex(n) for n in ss] for ss in ssets]
data = []
for ss in ssets:
Yuya Nishihara
templater: switch 'revcache' based on new mapping items...
r37121 h = _hybrid(None, ss, lambda x: {'ctx': repo[x]},
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 lambda x: scmutil.formatchangeid(repo[x]))
Boris Feld
template: add successors template...
r33276 data.append(h)
# Format the successorssets
def render(d):
Yuya Nishihara
templatekw: do not directly call .gen
r37292 return templateutil.stringify(context, mapping, d)
Boris Feld
template: add successors template...
r33276
def gen(data):
yield "; ".join(render(d) for d in data)
return _hybrid(gen(data), data, lambda x: {'successorset': x},
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 pycompat.identity)
Boris Feld
template: add successors template...
r33276
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword("succsandmarkers", requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 def showsuccsandmarkers(context, mapping):
Yuya Nishihara
help: fix formatting of template keywords...
r34657 """Returns a list of dict for each final successor of ctx. The dict
contains successors node id in "successors" keys and the list of
obs-markers from ctx to the set of successors in "markers".
Boris Feld
template: add minimal obsfate template function...
r33913 (EXPERIMENTAL)
"""
Yuya Nishihara
templatekw: switch obsfate-related template keywords to new API
r36612 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Boris Feld
template: add minimal obsfate template function...
r33913
values = obsutil.successorsandmarkers(repo, ctx)
if values is None:
values = []
# Format successors and markers to avoid exposing binary to templates
data = []
for i in values:
# Format successors
successors = i['successors']
successors = [hex(n) for n in successors]
successors = _hybrid(None, successors,
Yuya Nishihara
templater: switch 'revcache' based on new mapping items...
r37121 lambda x: {'ctx': repo[x]},
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 lambda x: scmutil.formatchangeid(repo[x]))
Boris Feld
template: add minimal obsfate template function...
r33913
# Format markers
finalmarkers = []
for m in i['markers']:
hexprec = hex(m[0])
hexsucs = tuple(hex(n) for n in m[1])
hexparents = None
if m[5] is not None:
hexparents = tuple(hex(n) for n in m[5])
newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:]
finalmarkers.append(newmarker)
data.append({'successors': successors, 'markers': finalmarkers})
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'succsandmarkers', data)
Yuya Nishihara
templatekw: just pass underlying value (or key) to joinfmt() function...
r34329 return _hybrid(f, data, lambda x: x, pycompat.identity)
Boris Feld
template: add minimal obsfate template function...
r33913
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('p1rev', requires={'ctx'})
def showp1rev(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Integer. The repository-local revision number of the changeset's
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 first parent, or -1 if the changeset has no parents."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 return ctx.p1().rev()
epriestley
templatekw: add parent1, parent1node, parent2, parent2node keywords...
r17355
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('p2rev', requires={'ctx'})
def showp2rev(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Integer. The repository-local revision number of the changeset's
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 second parent, or -1 if the changeset has no second parent."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 return ctx.p2().rev()
epriestley
templatekw: add parent1, parent1node, parent2, parent2node keywords...
r17355
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('p1node', requires={'ctx'})
def showp1node(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The identification hash of the changeset's first parent,
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 as a 40 digit hexadecimal string. If the changeset has no parents, all
digits are 0."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 return ctx.p1().hex()
epriestley
templatekw: add parent1, parent1node, parent2, parent2node keywords...
r17355
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('p2node', requires={'ctx'})
def showp2node(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The identification hash of the changeset's second
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 parent, as a 40 digit hexadecimal string. If the changeset has no second
parent, all digits are 0."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
epriestley
templatekw: add p1rev, p1node, p2rev, p2node keywords...
r17357 return ctx.p2().hex()
epriestley
templatekw: add parent1, parent1node, parent2, parent2node keywords...
r17355
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 @templatekeyword('parents', requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 def showparents(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. The parents of the changeset in "rev:node"
Yuya Nishihara
templatekw: reorder stub of showparents() function...
r26434 format. If the changeset has only one "natural" parent (the predecessor
revision) nothing is shown."""
Yuya Nishihara
templatekw: switch remainder of _showlist template keywords to new API
r36616 repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 pctxs = scmutil.meaningfulparents(repo, ctx)
Yuya Nishihara
templater: store revisions as ints so min/max won't compare them as strings...
r34582 prevs = [p.rev() for p in pctxs]
Yuya Nishihara
templatekw: port implementation of showparents() from changeset_templater...
r26435 parents = [[('rev', p.rev()),
('node', p.hex()),
('phase', p.phasestr())]
Yuya Nishihara
templatekw: switch ctx of list expression to rev of {parents} (BC)...
r28270 for p in pctxs]
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, 'parent', parents)
Yuya Nishihara
templater: switch 'revcache' based on new mapping items...
r37121 return _hybrid(f, prevs, lambda x: {'ctx': repo[x]},
Yuya Nishihara
templater: store revisions as ints so min/max won't compare them as strings...
r34582 lambda x: scmutil.formatchangeid(repo[x]), keytype=int)
Yuya Nishihara
templatekw: reorder stub of showparents() function...
r26434
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('phase', requires={'ctx'})
def showphase(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """String. The changeset phase name."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Pierre-Yves David
phases: ``{phase}`` template keyword display the phase name...
r15823 return ctx.phasestr()
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('phaseidx', requires={'ctx'})
def showphaseidx(context, mapping):
Yuya Nishihara
help: hide phaseidx template keyword...
r34992 """Integer. The changeset phase index. (ADVANCED)"""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Pierre-Yves David
phases: add a phase template keyword
r15422 return ctx.phase()
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('rev', requires={'ctx'})
def showrev(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """Integer. The repository-local changeset revision number."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
scmutil: pass ctx object to intrev()...
r32654 return scmutil.intrev(ctx)
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: switch revset() to new API
r36613 def showrevslist(context, mapping, name, revs):
Yuya Nishihara
templater: switch ctx of list expression to rev of revset() (BC)...
r26234 """helper to generate a list of revisions in which a mapped template will
be evaluated"""
Yuya Nishihara
templatekw: switch revset() to new API
r36613 repo = context.resource(mapping, 'repo')
Yuya Nishihara
templatekw: stop using _showlist() which is about to be deprecated...
r37087 f = _showcompatlist(context, mapping, name, ['%d' % r for r in revs])
Yuya Nishihara
templater: switch ctx of list expression to rev of revset() (BC)...
r26234 return _hybrid(f, revs,
Yuya Nishihara
templater: switch 'revcache' based on new mapping items...
r37121 lambda x: {name: x, 'ctx': repo[x]},
Yuya Nishihara
templater: store revisions as ints so min/max won't compare them as strings...
r34582 pycompat.identity, keytype=int)
Yuya Nishihara
templater: switch ctx of list expression to rev of revset() (BC)...
r26234
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('subrepos', requires={'ctx'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showsubrepos(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Updated subrepositories in the changeset."""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 ctx = context.resource(mapping, 'ctx')
FUJIWARA Katsunori
templatekw: add 'subrepos' keyword to show updated subrepositories...
r21897 substate = ctx.substate
if not substate:
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return compatlist(context, mapping, 'subrepo', [])
FUJIWARA Katsunori
templatekw: add 'subrepos' keyword to show updated subrepositories...
r21897 psubstate = ctx.parents()[0].substate or {}
subrepos = []
for sub in substate:
if sub not in psubstate or substate[sub] != psubstate[sub]:
subrepos.append(sub) # modified or newly added in ctx
for sub in psubstate:
if sub not in substate:
subrepos.append(sub) # removed in ctx
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 return compatlist(context, mapping, 'subrepo', sorted(subrepos))
FUJIWARA Katsunori
templatekw: add 'subrepos' keyword to show updated subrepositories...
r21897
FUJIWARA Katsunori
templatekw: re-add showtags() to list tags keyword up in online help...
r23977 # don't remove "showtags" definition, even though namespaces will put
# a helper function for "tags" keyword into "keywords" map automatically,
# because online help text is built without namespaces initialization
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('tags', requires={'repo', 'ctx'})
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 def showtags(context, mapping):
FUJIWARA Katsunori
templatekw: use templatekeyword to mark a function as template keyword...
r28539 """List of strings. Any tags associated with the changeset."""
Yuya Nishihara
templatekw: switch namespace template keywords to new API
r36611 return shownames(context, mapping, 'tags')
FUJIWARA Katsunori
templatekw: re-add showtags() to list tags keyword up in online help...
r23977
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('termwidth', requires={'ui'})
def showtermwidth(context, mapping):
Simon Farnsworth
template: provide a termwidth keyword (issue5395)...
r30088 """Integer. The width of the current terminal."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ui = context.resource(mapping, 'ui')
Yuya Nishihara
templatekw: minimize resource dependency of {envvars} and {termwidth}...
r36460 return ui.termwidth()
Simon Farnsworth
template: provide a termwidth keyword (issue5395)...
r30088
Yuya Nishihara
templater: use template context to render old-style list template...
r37086 @templatekeyword('instabilities', requires={'ctx'})
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 def showinstabilities(context, mapping):
Boris Feld
template: rename troubles templatekw into instabilities...
r33675 """List of strings. Evolution instabilities affecting the changeset.
Denis Laxalde
templatekw: add a "troubles" template keyword...
r30712 (EXPERIMENTAL)
"""
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 ctx = context.resource(mapping, 'ctx')
return compatlist(context, mapping, 'instability', ctx.instabilities(),
plural='instabilities')
Denis Laxalde
templatekw: add a "troubles" template keyword...
r30712
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 @templatekeyword('verbosity', requires={'ui'})
def showverbosity(context, mapping):
Yuya Nishihara
templatekw: add verbosity keyword to select template by -q/-v/--debug flag...
r34994 """String. The current output verbosity in 'debug', 'quiet', 'verbose',
or ''."""
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ui = context.resource(mapping, 'ui')
Yuya Nishihara
cmdutil: drop aliases for logcmdutil functions (API)...
r35906 # see logcmdutil.changesettemplater for priority of these flags
Yuya Nishihara
templatekw: add verbosity keyword to select template by -q/-v/--debug flag...
r34994 if ui.debugflag:
return 'debug'
elif ui.quiet:
return 'quiet'
elif ui.verbose:
return 'verbose'
return ''
Yuya Nishihara
templatekw: move loadkeyword() to bottom...
r34993 def loadkeyword(ui, extname, registrarobj):
"""Load template keyword from specified registrarobj
"""
for name, func in registrarobj._table.iteritems():
keywords[name] = func
Patrick Mezard
templates: generate keyword help dynamically
r13585 # tell hggettext to extract docstrings from these functions:
Yuya Nishihara
templatekw: remove dockeywords hack...
r26436 i18nfunctions = keywords.values()