[PATCH] hgweb: extract changeset template mapping generation to own function
Augie Fackler
raf at durin42.com
Tue Mar 3 10:14:38 CST 2015
On Mon, Mar 02, 2015 at 03:07:32PM -0800, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1425337638 28800
> # Mon Mar 02 15:07:18 2015 -0800
> # Node ID fcf16ed2c44e18f31f73a47b6e8c4fdf14ea4bbe
> # Parent 4e865115566e75f938cbff9dcf081da39008a161
> hgweb: extract changeset template mapping generation to own function
I'm a big fan, and I can see some really neat uses of this
(hgsubversion users might want to show the svn rev from extra, for
example). Queued.
>
> Similar in spirit to 513d47905114, I want to write an extension to
> make available extra template keywords so hgweb templates can include
> extra data.
>
> To do this today requires monkeypatching the templater, which I think is
> the wrong place to perform this modification.
>
> This patch extracts the creation of the templater arguments to a
> standalone function - one that can be monkeypatched by extensions.
>
> I would very much like for extensions to be able to inject extra
> templater parameters into *any* template. However, I'm not sure the best
> way to facilitate this, as hgweb commands invoke the templater before
> returning and we want the extensions to have access to rich data
> structures like the context instances. We need cooperation inside hgweb
> command functions. The use case screams for something like internal-only
> "hooks." This is exactly what my (rejected) "events" patch series
> provided. Perhaps that feature should be reconsidered...
>
> diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
> --- a/mercurial/hgweb/webcommands.py
> +++ b/mercurial/hgweb/webcommands.py
> @@ -430,58 +430,10 @@ def changeset(web, req, tmpl):
> ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
> templates related to diffs may all be used to produce the output.
> """
> ctx = webutil.changectx(web.repo, req)
> - basectx = webutil.basechangectx(web.repo, req)
> - if basectx is None:
> - basectx = ctx.p1()
> - showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
> - showbookmarks = webutil.showbookmark(web.repo, tmpl, 'changesetbookmark',
> - ctx.node())
> - showbranch = webutil.nodebranchnodefault(ctx)
>
> - files = []
> - parity = paritygen(web.stripecount)
> - for blockno, f in enumerate(ctx.files()):
> - template = f in ctx and 'filenodelink' or 'filenolink'
> - files.append(tmpl(template,
> - node=ctx.hex(), file=f, blockno=blockno + 1,
> - parity=parity.next()))
> -
> - style = web.config('web', 'style', 'paper')
> - if 'style' in req.form:
> - style = req.form['style'][0]
> -
> - parity = paritygen(web.stripecount)
> - diffs = webutil.diffs(web.repo, tmpl, ctx, basectx, None, parity, style)
> -
> - parity = paritygen(web.stripecount)
> - diffstatgen = webutil.diffstatgen(ctx, basectx)
> - diffstat = webutil.diffstat(tmpl, ctx, diffstatgen, parity)
> -
> - return tmpl('changeset',
> - diff=diffs,
> - rev=ctx.rev(),
> - node=ctx.hex(),
> - parent=tuple(webutil.parents(ctx)),
> - child=webutil.children(ctx),
> - basenode=basectx.hex(),
> - changesettag=showtags,
> - changesetbookmark=showbookmarks,
> - changesetbranch=showbranch,
> - author=ctx.user(),
> - desc=ctx.description(),
> - extra=ctx.extra(),
> - date=ctx.date(),
> - files=files,
> - diffsummary=lambda **x: webutil.diffsummary(diffstatgen),
> - diffstat=diffstat,
> - archives=web.archivelist(ctx.hex()),
> - tags=webutil.nodetagsdict(web.repo, ctx.node()),
> - bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
> - branch=webutil.nodebranchnodefault(ctx),
> - inbranch=webutil.nodeinbranch(web.repo, ctx),
> - branches=webutil.nodebranchdict(web.repo, ctx))
> + return tmpl('changeset', **webutil.changesetentry(web, req, tmpl, ctx))
>
> rev = webcommand('rev')(changeset)
>
> def decodepath(path):
> diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
> --- a/mercurial/hgweb/webutil.py
> +++ b/mercurial/hgweb/webutil.py
> @@ -9,9 +9,9 @@
> import os, copy
> from mercurial import match, patch, error, ui, util, pathutil, context
> from mercurial.i18n import _
> from mercurial.node import hex, nullid
> -from common import ErrorResponse
> +from common import ErrorResponse, paritygen
> from common import HTTP_NOT_FOUND
> import difflib
>
> def up(p):
> @@ -278,8 +278,63 @@ def changelistentry(web, ctx, tmpl):
> "inbranch": nodeinbranch(repo, ctx),
> "branches": nodebranchdict(repo, ctx)
> }
>
> +def changesetentry(web, req, tmpl, ctx):
> + '''Obtain a dictionary to be used to render the "changeset" template.'''
> +
> + showtags = showtag(web.repo, tmpl, 'changesettag', ctx.node())
> + showbookmarks = showbookmark(web.repo, tmpl, 'changesetbookmark',
> + ctx.node())
> + showbranch = nodebranchnodefault(ctx)
> +
> + files = []
> + parity = paritygen(web.stripecount)
> + for blockno, f in enumerate(ctx.files()):
> + template = f in ctx and 'filenodelink' or 'filenolink'
> + files.append(tmpl(template,
> + node=ctx.hex(), file=f, blockno=blockno + 1,
> + parity=parity.next()))
> +
> + basectx = basechangectx(web.repo, req)
> + if basectx is None:
> + basectx = ctx.p1()
> +
> + style = web.config('web', 'style', 'paper')
> + if 'style' in req.form:
> + style = req.form['style'][0]
> +
> + parity = paritygen(web.stripecount)
> + diff = diffs(web.repo, tmpl, ctx, basectx, None, parity, style)
> +
> + parity = paritygen(web.stripecount)
> + diffstatsgen = diffstatgen(ctx, basectx)
> + diffstats = diffstat(tmpl, ctx, diffstatsgen, parity)
> +
> + return dict(
> + diff=diff,
> + rev=ctx.rev(),
> + node=ctx.hex(),
> + parent=tuple(parents(ctx)),
> + child=children(ctx),
> + basenode=basectx.hex(),
> + changesettag=showtags,
> + changesetbookmark=showbookmarks,
> + changesetbranch=showbranch,
> + author=ctx.user(),
> + desc=ctx.description(),
> + extra=ctx.extra(),
> + date=ctx.date(),
> + files=files,
> + diffsummary=lambda **x: diffsummary(diffstatsgen),
> + diffstat=diffstats,
> + archives=web.archivelist(ctx.hex()),
> + tags=nodetagsdict(web.repo, ctx.node()),
> + bookmarks=nodebookmarksdict(web.repo, ctx.node()),
> + branch=nodebranchnodefault(ctx),
> + inbranch=nodeinbranch(web.repo, ctx),
> + branches=nodebranchdict(web.repo, ctx))
> +
> def listfilediffs(tmpl, files, node, max):
> for f in files[:max]:
> yield tmpl('filedifflink', node=hex(node), file=f)
> if len(files) > max:
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list