##// END OF EJS Templates
store: introduce _matchtrackedpath() and use it to filter store files...
store: introduce _matchtrackedpath() and use it to filter store files This patch introduces a function to filter store files on the basis of the path which they are tracking. The function assumes that the entries can be of two types, 'meta/*' and 'data/*' which means it will just work on revlog based storage and not with another storage ways. For the 'data/*' entries, we remove the 'data/' part and '.i/.d' part from the beginning and the end then pass that to matcher. For the 'meta/*' entries, we remove the 'meta/' and '/00manifest.(i/d)' part from beginning and end then call matcher.visitdir() with it to make sure all the parent directories are also downloaded. Since the storage filtering for narrow stream clones is implemented with this patch, we remove the un-implemented error message, add some more tests and add the treemanifest case to tests too. The tests demonstrate that it works correctly. After this patch, we have now narrow stream clones working. Narrow stream clones are a very important feature for large repositories who have good internet connection because they use streamclones for cloning and if they do normal narrow clone, that takes more time then a full streamclone. Also narrow-stream clone will drastically speed up clone timings. Differential Revision: https://phab.mercurial-scm.org/D5139

File last commit:

r40511:592feb3f default
r40529:9aeb9e2d default
Show More
templatekw.py
874 lines | 32.3 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):
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))
Martin von Zweigbergk
templatekw: make getrenamed() return only filename, not nodeid...
r38185 rcache[fn][lr] = renamed and renamed[0]
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060 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:
Martin von Zweigbergk
templatekw: make getrenamed() return only filename, not nodeid...
r38185 renamed = repo[rev][fn].renamed()
return renamed and renamed[0]
Patrick Mezard
templatekw: change {file_copies} behaviour, add {file_copies_switch}...
r10060 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: 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: extract function that computes and caches file status
r39633 def _showfilesbystat(context, mapping, name, index):
stat = _getfilestatus(context, mapping)
files = stat[index]
Yuya Nishihara
templatekw: alias {file} of files list to {path}...
r39403 return templateutil.compatfileslist(context, mapping, name, files)
Yuya Nishihara
templatekw: factor out function to build a list of files per status...
r36532
Martin von Zweigbergk
templatekw: use ctx1.status(ctx2) instead of repo.status(ctx1, ctx2)...
r38797 @templatekeyword('file_adds', requires={'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:
Martin von Zweigbergk
templatekw: make getrenamed() return only filename, not nodeid...
r38185 copies.append((fn, rename))
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: 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."""
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
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."""
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')
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
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):
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()))
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
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: 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
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
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()