##// END OF EJS Templates
notify: add option for deterministic message-id generation...
notify: add option for deterministic message-id generation Copied from email by durin42: > Pierre-Yves asked offline why I asked a new option for this and why it > is not the default. Message-Id is supposed to be unique world-wide and > while it is desirable to have a deterministic mechanism for them for > creating follow-up emails, it needs organisational control for ensuring > the uniqueness. Differential Revision: https://phab.mercurial-scm.org/D6824

File last commit:

r42703:88ba0ff9 default
r43174:d26a6706 default
Show More
templatekw.py
860 lines | 32.2 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,
Yuya Nishihara
log: fill in pseudo rev and node as wdir() manifest identifiers...
r39832 wdirid,
wdirrev,
Yuya Nishihara
scmutil: introduce binnode(ctx) as paired function with intrev(ctx)...
r32656 )
Gregory Szorc
templatekw: use absolute_import
r25984 from . import (
Yuya Nishihara
diffutil: move the module out of utils package...
r38607 diffutil,
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
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
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):
Yuya Nishihara
templatekw: fix crash on multiple latesttags resolution at wdir (issue6055)...
r41336 tag = x[2][0]
if ctx.rev() is None:
# only() doesn't support wdir
prevs = [c.rev() for c in ctx.parents()]
changes = repo.revs('only(%ld, %s)', prevs, tag)
changessincetag = len(changes) + 1
else:
changes = repo.revs('only(%d, %s)', ctx.rev(), tag)
changessincetag = len(changes)
Martin von Zweigbergk
templatekw: choose {latesttag} by len(changes), not date (issue5659)...
r33866 # 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]
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: extract internal "{rev}:{node|formatnode}" template to constant...
r40508 # basic internal templates
_changeidtmpl = '{rev}:{node|formatnode}'
Yuya Nishihara
templatekw: move defaulttmpl constant from changeset_templater...
r31171 # default templates internally used for rendering of lists
defaulttempl = {
Yuya Nishihara
templatekw: extract internal "{rev}:{node|formatnode}" template to constant...
r40508 'parent': _changeidtmpl + ' ',
'manifest': _changeidtmpl,
Yuya Nishihara
templatekw: move defaulttmpl constant from changeset_templater...
r31171 '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):
Yuya Nishihara
templatekw: copy {author} to {user} and document {author} as an alias...
r38983 """Alias for ``{user}``"""
return showuser(context, mapping)
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
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')
Yuya Nishihara
templater: restore the original string format of {date}...
r38318 # the default string format is '<float(unixtime)><tzoffset>' because
# python-hglib splits date at decimal separator.
return templateutil.date(ctx.date(), showfmt='%d.0%d')
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
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())
Yuya Nishihara
encoding: introduce tagging type for non-lossy non-ASCII string...
r37966 elif isinstance(s, encoding.safelocalstr):
return encoding.safelocalstr(s.strip())
Yuya Nishihara
templatekw: workaround for utf-8 round-trip of {desc}...
r28239 else:
return s.strip()
Patrick Mezard
cmdutil: extract ctx dependent closures into templatekw
r10054
Yuya Nishihara
templatekw: obtain ui directly from the template context
r38602 @templatekeyword('diffstat', requires={'ui', 'ctx'})
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 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: obtain ui directly from the template context
r38602 ui = context.resource(mapping, 'ui')
Yuya Nishihara
templatekw: switch non-showlist template keywords to new API
r36531 ctx = context.resource(mapping, 'ctx')
Yuya Nishihara
diffutil: remove diffopts() in favor of diffallopts()...
r38606 diffopts = diffutil.diffallopts(ui, {'noprefix': False})
Boris Feld
template: directly instantiate diff options for diffstat
r38583 diff = ctx.diff(opts=diffopts)
Boris Feld
context: explicitly take diffopts in `context.diff` (API)...
r38538 stats = patch.diffstatdata(util.iterlines(diff))
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: add option to include ignored/clean/unknown files in cache...
r39635 def _getfilestatus(context, mapping, listall=False):
Yuya Nishihara
templatekw: switch most of showlist template keywords to new API (issue5779)...
r36609 ctx = context.resource(mapping, 'ctx')
revcache = context.resource(mapping, 'revcache')
Yuya Nishihara
templatekw: add option to include ignored/clean/unknown files in cache...
r39635 if 'filestatus' not in revcache or revcache['filestatusall'] < listall:
stat = ctx.p1().status(ctx, listignored=listall, listclean=listall,
listunknown=listall)
revcache['filestatus'] = stat
revcache['filestatusall'] = listall
Yuya Nishihara
templatekw: keep status tuple in cache dict and rename cache key accordingly...
r39634 return revcache['filestatus']
Yuya Nishihara
templatekw: extract function that computes and caches file status
r39633
Yuya Nishihara
templatekw: add experimental {status} keyword...
r39636 def _getfilestatusmap(context, mapping, listall=False):
revcache = context.resource(mapping, 'revcache')
if 'filestatusmap' not in revcache or revcache['filestatusall'] < listall:
stat = _getfilestatus(context, mapping, listall=listall)
revcache['filestatusmap'] = statmap = {}
for char, files in zip(pycompat.iterbytestr('MAR!?IC'), stat):
statmap.update((f, char) for f in files)
return revcache['filestatusmap'] # {path: statchar}
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:
Martin von Zweigbergk
copies: create helper for getting all copies for changeset...
r42703 if 'getcopies' not in cache:
cache['getcopies'] = scmutil.getcopiesfn(repo)
getcopies = cache['getcopies']
copies = getcopies(ctx)
Yuya Nishihara
templatekw: alias {name} of file copies dict to {path}...
r39404 return templateutil.compatfilecopiesdict(context, mapping, 'file_copy',
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: alias {name} of file copies dict to {path}...
r39404 return templateutil.compatfilecopiesdict(context, mapping, 'file_copy',
copies)
Patrick Mezard
cmdutil: extract file copies closure into templatekw
r10058
Martin von Zweigbergk
templatekw: move showfileadds() close to showfile{mods,dels}()...
r42563 @templatekeyword('file_adds', requires={'ctx', 'revcache'})
def showfileadds(context, mapping):
"""List of strings. Files added by this changeset."""
Martin von Zweigbergk
templatekw: make {file_*} compare to both merge parents (issue4292)...
r42597 ctx = context.resource(mapping, 'ctx')
return templateutil.compatfileslist(context, mapping, 'file_add',
ctx.filesadded())
Martin von Zweigbergk
templatekw: move showfileadds() close to showfile{mods,dels}()...
r42563
Martin von Zweigbergk
templatekw: use ctx1.status(ctx2) instead of repo.status(ctx1, ctx2)...
r38797 @templatekeyword('file_dels', requires={'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."""
Martin von Zweigbergk
templatekw: make {file_*} compare to both merge parents (issue4292)...
r42597 ctx = context.resource(mapping, 'ctx')
return templateutil.compatfileslist(context, mapping, 'file_del',
ctx.filesremoved())
Patrick Mezard
cmdutil: extract file changes closures into templatekw
r10056
Martin von Zweigbergk
templatekw: use ctx1.status(ctx2) instead of repo.status(ctx1, ctx2)...
r38797 @templatekeyword('file_mods', requires={'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."""
Martin von Zweigbergk
templatekw: make {file_*} compare to both merge parents (issue4292)...
r42597 ctx = context.resource(mapping, 'ctx')
return templateutil.compatfileslist(context, mapping, 'file_mod',
ctx.filesmodified())
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')
Yuya Nishihara
templatekw: alias {file} of files list to {path}...
r39403 return templateutil.compatfileslist(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):
av6
templates: split getgraphnode() body into two functions...
r37927 return getgraphnodecurrent(repo, ctx) or getgraphnodesymbol(ctx)
def getgraphnodecurrent(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 '@'
av6
templates: split getgraphnode() body into two functions...
r37927 else:
return ''
def getgraphnodesymbol(ctx):
if ctx.obsolete():
Yuya Nishihara
graphlog: extract "graphnode" template keyword that represents node symbol...
r27214 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:
Yuya Nishihara
log: fill in pseudo rev and node as wdir() manifest identifiers...
r39832 mnode = wdirid
mrev = wdirrev
else:
mrev = repo.manifestlog.rev(mnode)
Yuya Nishihara
templatekw: add new-style template expansion to {manifest}...
r34331 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
templater: rename mappable to hybriditem as it is the primary use case...
r38302 return templateutil.hybriditem(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')
Yuya Nishihara
obsutil: make obsfateprinter() less dependent on templater...
r37344 repo = context.resource(mapping, 'repo')
Boris Feld
templatekw: introduce obsfate keyword...
r34848 values = []
Yuya Nishihara
templatekw: fix return type of {succsandmarkers} (BC)...
r37521 for x in succsandmarkers.tovalue(context, mapping):
Yuya Nishihara
obsutil: make obsfateprinter() less dependent on templater...
r37344 v = obsutil.obsfateprinter(ui, repo, x['successors'], x['markers'],
scmutil.formatchangeid)
values.append(v)
Boris Feld
templatekw: introduce obsfate keyword...
r34848
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
Jordi Gutiérrez Hermoso
templatekw: add a {negrev} keyword...
r41871 @templatekeyword('negrev', requires={'repo', 'ctx'})
def shownegrev(context, mapping):
"""Integer. The repository-local changeset negative revision number,
which counts in the opposite direction."""
ctx = context.resource(mapping, 'ctx')
Jordi Gutiérrez Hermoso
templatekw: make negrev return empty for wdir() and nullrev...
r41875 rev = ctx.rev()
if rev is None or rev < 0: # wdir() or nullrev?
return None
Jordi Gutiérrez Hermoso
templatekw: add a {negrev} keyword...
r41871 repo = context.resource(mapping, 'repo')
Jordi Gutiérrez Hermoso
templatekw: make negrev return empty for wdir() and nullrev...
r41875 return rev - len(repo)
Jordi Gutiérrez Hermoso
templatekw: add a {negrev} keyword...
r41871
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: add {path} keyword to host documentation...
r39407 @templatekeyword('path', requires={'fctx'})
def showpath(context, mapping):
"""String. Repository-absolute path of the current file. (EXPERIMENTAL)"""
fctx = context.resource(mapping, 'fctx')
return fctx.path()
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):
Joerg Sonnenberger
doc: fix description of "predecessors" to match reality...
r42629 """Returns the list of the closest visible predecessors. (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()))
Yuya Nishihara
py3: fix map() use in templatekw.showpredecessors()...
r38325 predecessors = pycompat.maplist(hex, predecessors)
Boris Feld
template: add predecessors template...
r32879
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: add {size} keyword as an example of fctx-based keyword...
r39623 @templatekeyword('size', requires={'fctx'})
def showsize(context, mapping):
"""Integer. Size of the current file in bytes. (EXPERIMENTAL)"""
fctx = context.resource(mapping, 'fctx')
return fctx.size()
Yuya Nishihara
templatekw: add experimental {status} keyword...
r39636 # requires 'fctx' to denote {status} depends on (ctx, path) pair
@templatekeyword('status', requires={'ctx', 'fctx', 'revcache'})
def showstatus(context, mapping):
"""String. Status code of the current file. (EXPERIMENTAL)"""
path = templateutil.runsymbol(context, mapping, 'path')
path = templateutil.stringify(context, mapping, path)
if not path:
return
statmap = _getfilestatusmap(context, mapping)
if path not in statmap:
statmap = _getfilestatusmap(context, mapping, listall=True)
return statmap.get(path)
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
Matt Harbison
templatekw: fix documentation typos
r41143 is: [ctx1, ctx2], [ctx3] if ctx has been split 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: fix return type of {succsandmarkers} (BC)...
r37521 return templateutil.mappinglist(data)
Boris Feld
template: add minimal obsfate template function...
r33913
Yuya Nishihara
templatekw: add p1/p2 keywords which switches the current ctx...
r40510 @templatekeyword('p1', requires={'ctx'})
def showp1(context, mapping):
"""Changeset. The changeset's first parent. ``{p1.rev}`` for the revision
number, and ``{p1.node}`` for the identification hash."""
ctx = context.resource(mapping, 'ctx')
return templateutil.mappingdict({'ctx': ctx.p1()}, tmpl=_changeidtmpl)
@templatekeyword('p2', requires={'ctx'})
def showp2(context, mapping):
"""Changeset. The changeset's second parent. ``{p2.rev}`` for the revision
number, and ``{p2.node}`` for the identification hash."""
ctx = context.resource(mapping, 'ctx')
return templateutil.mappingdict({'ctx': ctx.p2()}, tmpl=_changeidtmpl)
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
Yuya Nishihara
templatekw: deprecate p1rev/p2rev/p1node/p2node in favor of p1/p2
r40511 first parent, or -1 if the changeset has no parents. (DEPRECATED)"""
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
Yuya Nishihara
templatekw: deprecate p1rev/p2rev/p1node/p2node in favor of p1/p2
r40511 second parent, or -1 if the changeset has no second parent. (DEPRECATED)"""
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
Yuya Nishihara
templatekw: deprecate p1rev/p2rev/p1node/p2node in favor of p1/p2
r40511 digits are 0. (DEPRECATED)"""
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
Yuya Nishihara
templatekw: deprecate p1rev/p2rev/p1node/p2node in favor of p1/p2
r40511 parent, all digits are 0. (DEPRECATED)"""
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
templater: compute revset lazily...
r40553 # revs may be a smartset; don't compute it until f() has to be evaluated
def f():
srevs = ['%d' % r for r in revs]
return _showcompatlist(context, mapping, name, srevs)
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', [])
Martin von Zweigbergk
cleanup: use p1() and p2() instead of parents()[0] and parents()[1]...
r41442 psubstate = ctx.p1().substate or {}
FUJIWARA Katsunori
templatekw: add 'subrepos' keyword to show updated subrepositories...
r21897 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
templatekw: copy {author} to {user} and document {author} as an alias...
r38983 @templatekeyword('user', requires={'ctx'})
def showuser(context, mapping):
"""String. The unmodified author of the changeset."""
ctx = context.resource(mapping, 'ctx')
return ctx.user()
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 ''
av6
templates: add whyunstable template keyword
r37703 @templatekeyword('whyunstable', requires={'repo', 'ctx'})
def showwhyunstable(context, mapping):
"""List of dicts explaining all instabilities of a changeset.
(EXPERIMENTAL)
"""
repo = context.resource(mapping, 'repo')
ctx = context.resource(mapping, 'ctx')
def formatnode(ctx):
av6
templates: adjust white space amount in the output of {whyunstable}...
r37725 return '%s (%s)' % (scmutil.formatchangeid(ctx), ctx.phasestr())
av6
templates: add whyunstable template keyword
r37703
entries = obsutil.whyunstable(repo, ctx)
for entry in entries:
if entry.get('divergentnodes'):
dnodes = entry['divergentnodes']
av6
templates: make divergentnodes in whyunstable keyword be a hybrid list
r37704 dnhybrid = _hybrid(None, [dnode.hex() for dnode in dnodes],
lambda x: {'ctx': repo[x]},
lambda x: formatnode(repo[x]))
entry['divergentnodes'] = dnhybrid
av6
templates: add whyunstable template keyword
r37703
av6
templates: adjust white space amount in the output of {whyunstable}...
r37725 tmpl = ('{instability}:{if(divergentnodes, " ")}{divergentnodes} '
'{reason} {node|short}')
av6
templates: add whyunstable template keyword
r37703 return templateutil.mappinglist(entries, tmpl=tmpl, sep='\n')
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()