# HG changeset patch # User Patrick Mezard # Date 2009-12-13 17:06:23 # Node ID 1a85861f59af94eee7ff56cf636ae12cb83ef2f9 # Parent 5c5c6295533d00d3d406dcb5b90a805d5632a543 cmdutil: extract ctx dependent closures into templatekw diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -812,28 +812,12 @@ class changeset_templater(changeset_prin showlist = templatekw.showlist - def showbranches(templ, **args): - branch = ctx.branch() - if branch != 'default': - branch = encoding.tolocal(branch) - return showlist(templ, 'branch', [branch], plural='branches', - **args) - - def showparents(templ, **args): + def showparents(ctx, templ, **args): parents = [[('rev', p.rev()), ('node', p.hex())] for p in self._meaningful_parentrevs(ctx)] return showlist(templ, 'parent', parents, **args) - def showtags(templ, **args): - return showlist(templ, 'tag', ctx.tags(), **args) - - def showextras(templ, **args): - for key, value in sorted(ctx.extra().items()): - args = args.copy() - args.update(dict(key=key, value=value)) - yield templ('extra', **args) - - def showcopies(templ, **args): + def showcopies(ctx, templ, **args): c = [{'name': x[0], 'source': x[1]} for x in copies] return showlist(templ, 'file_copy', c, plural='file_copies', **args) @@ -843,21 +827,19 @@ class changeset_templater(changeset_prin files[:] = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3] return files - def showfiles(templ, **args): - return showlist(templ, 'file', ctx.files(), **args) - def showmods(templ, **args): + def showmods(ctx, templ, **args): return showlist(templ, 'file_mod', getfiles()[0], **args) - def showadds(templ, **args): + def showadds(ctx, templ, **args): return showlist(templ, 'file_add', getfiles()[1], **args) - def showdels(templ, **args): + def showdels(ctx, templ, **args): return showlist(templ, 'file_del', getfiles()[2], **args) - def showmanifest(templ, **args): + def showmanifest(ctx, templ, **args): args = args.copy() args.update(dict(rev=self.repo.manifest.rev(ctx.changeset()[0]), node=hex(ctx.changeset()[0]))) return templ('manifest', **args) - def showdiffstat(templ, **args): + def showdiffstat(ctx, templ, **args): diff = patch.diff(self.repo, ctx.parents()[0].node(), ctx.node()) files, adds, removes = 0, 0, 0 for i in patch.diffstatdata(util.iterlines(diff)): @@ -866,34 +848,27 @@ class changeset_templater(changeset_prin removes += i[2] return '%s: +%s/-%s' % (files, adds, removes) - def showlatesttag(templ, **args): + def showlatesttag(ctx, templ, **args): return self._latesttaginfo(ctx.rev())[2] - def showlatesttagdistance(templ, **args): + def showlatesttagdistance(ctx, templ, **args): return self._latesttaginfo(ctx.rev())[1] defprops = { - 'author': ctx.user(), - 'branches': showbranches, - 'date': ctx.date(), - 'desc': ctx.description().strip(), 'file_adds': showadds, 'file_dels': showdels, 'file_mods': showmods, - 'files': showfiles, 'file_copies': showcopies, 'manifest': showmanifest, - 'node': ctx.hex(), 'parents': showparents, - 'rev': ctx.rev(), - 'tags': showtags, - 'extras': showextras, 'diffstat': showdiffstat, 'latesttag': showlatesttag, 'latesttagdistance': showlatesttagdistance, } props = props.copy() + props.update(templatekw.keywords) props.update(defprops) props['templ'] = self.t + props['ctx'] = ctx # find correct templates for current mode diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py --- a/mercurial/templatekw.py +++ b/mercurial/templatekw.py @@ -5,6 +5,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2, incorporated herein by reference. +import encoding def showlist(templ, name, values, plural=None, **args): '''expand set of values. @@ -67,3 +68,48 @@ def showlist(templ, name, values, plural if endname in templ: yield templ(endname, **args) +def showauthor(ctx, templ, **args): + return ctx.user() + +def showbranches(ctx, templ, **args): + branch = ctx.branch() + if branch != 'default': + branch = encoding.tolocal(branch) + return showlist(templ, 'branch', [branch], plural='branches', **args) + +def showdate(ctx, templ, **args): + return ctx.date() + +def showdescription(ctx, templ, **args): + return ctx.description().strip() + +def showextras(ctx, templ, **args): + for key, value in sorted(ctx.extra().items()): + args = args.copy() + args.update(dict(key=key, value=value)) + yield templ('extra', **args) + +def showfiles(ctx, templ, **args): + return showlist(templ, 'file', ctx.files(), **args) + +def shownode(ctx, templ, **args): + return ctx.hex() + +def showrev(ctx, templ, **args): + return ctx.rev() + +def showtags(ctx, templ, **args): + return showlist(templ, 'tag', ctx.tags(), **args) + +keywords = { + 'author': showauthor, + 'branches': showbranches, + 'date': showdate, + 'desc': showdescription, + 'extras': showextras, + 'files': showfiles, + 'node': shownode, + 'rev': showrev, + 'tags': showtags, +} + diff --git a/tests/test-template-engine b/tests/test-template-engine --- a/tests/test-template-engine +++ b/tests/test-template-engine @@ -11,6 +11,10 @@ class mytemplater(object): def process(self, t, map): tmpl = self.loader(t) for k, v in map.iteritems(): + if k in ('templ', 'ctx'): + continue + if hasattr(v, '__call__'): + v = v(**map) v = templater.stringify(v) tmpl = tmpl.replace('{{%s}}' % k, v) yield tmpl