[PATCH] hgweb: display difference for a changeset against any parents (issue2810)
Weiwen Liu
weiwen at fb.com
Thu Nov 29 12:00:48 CST 2012
I looked at the result after removing spaces.
Removing space from
> + <td class="author"><a href="{url}rev/{currentbaseline|short}{sessionvars%urlparameter}">{currentbaseline|short}</a> </td>
works fine.
After removing space from
> +changesetbaseline = '<a href="{url}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">{node|short} </a> '
we display two parents without space in between. We need to keep the space here. The changesetparent has a space at the end for the same reason. I will keep this space.
________________________________________
From: Weiwen Liu
Sent: Thursday, November 29, 2012 9:32 AM
To: Kevin Bullock
Cc: mercurial-devel at selenic.com; Matt Mackall; Bryan O'Sullivan
Subject: RE: [PATCH] hgweb: display difference for a changeset against any parents (issue2810)
Thanks!
I removed the spaces around </a>.
________________________________________
From: Kevin Bullock [kbullock+mercurial at ringworld.org]
Sent: Thursday, November 29, 2012 8:12 AM
To: Weiwen Liu
Cc: mercurial-devel at selenic.com; Matt Mackall; Bryan O'Sullivan
Subject: Re: [PATCH] hgweb: display difference for a changeset against any parents (issue2810)
On Nov 29, 2012, at 1:52 AM, Weiwen Liu wrote:
> Per Kevin's feedback, use rev/12300:12345 where 12300 is a parent of 12345.
>
> # HG changeset patch
> # User Weiwen <weiwen at fb.com>
> # Date 1352757939 28800
> # Node ID d11b957d6b1eb7cdbdc33499d884949b71f40bad
> # Parent e853d27956fb0a25dcaac29b18bb0d5719297830
> hgweb: display difference for a changeset against any parents (issue2810)
>
> During merge of branches, it is useful to compare merge results against
> the two parents. This change adds this support to hgweb. To specify
> which parent to compare to, use rev/12300:12345 where 12300 is a
> parent changeset number. Two links are added to changeset web page so
> that one can choose which parent to compare to.
>
> diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
> --- a/mercurial/hgweb/webcommands.py
> +++ b/mercurial/hgweb/webcommands.py
> @@ -256,6 +256,9 @@
>
> def changeset(web, req, tmpl):
> 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())
> @@ -274,10 +277,10 @@
> style = req.form['style'][0]
>
> parity = paritygen(web.stripecount)
> - diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
> + diffs = webutil.diffs(web.repo, tmpl, ctx, basectx, None, parity, style)
>
> parity = paritygen(web.stripecount)
> - diffstatgen = webutil.diffstatgen(ctx)
> + diffstatgen = webutil.diffstatgen(ctx, basectx)
> diffstat = webutil.diffstat(tmpl, ctx, diffstatgen, parity)
>
> return tmpl('changeset',
> @@ -286,6 +289,7 @@
> node=ctx.hex(),
> parent=webutil.parents(ctx),
> child=webutil.children(ctx),
> + currentbaseline=basectx.hex(),
> changesettag=showtags,
> changesetbookmark=showbookmarks,
> changesetbranch=showbranch,
> @@ -567,7 +571,7 @@
> if 'style' in req.form:
> style = req.form['style'][0]
>
> - diffs = webutil.diffs(web.repo, tmpl, ctx, [path], parity, style)
> + diffs = webutil.diffs(web.repo, tmpl, ctx, None, [path], parity, style)
> rename = fctx and webutil.renamelink(fctx) or []
> ctx = fctx and fctx or ctx
> return tmpl("filediff",
> diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
> --- a/mercurial/hgweb/webutil.py
> +++ b/mercurial/hgweb/webutil.py
> @@ -140,13 +140,7 @@
> path = path.lstrip('/')
> return scmutil.canonpath(repo.root, '', path)
>
> -def changectx(repo, req):
> - changeid = "tip"
> - if 'node' in req.form:
> - changeid = req.form['node'][0]
> - elif 'manifest' in req.form:
> - changeid = req.form['manifest'][0]
> -
> +def changeidctx (repo, changeid):
> try:
> ctx = repo[changeid]
> except error.RepoError:
> @@ -155,6 +149,28 @@
>
> return ctx
>
> +def changectx (repo, req):
> + changeid = "tip"
> + if 'node' in req.form:
> + changeid = req.form['node'][0]
> + ipos=changeid.find(':')
> + if ipos != -1:
> + changeid = changeid[(ipos + 1):]
> + elif 'manifest' in req.form:
> + changeid = req.form['manifest'][0]
> +
> + return changeidctx(repo, changeid)
> +
> +def basechangectx(repo, req):
> + if 'node' in req.form:
> + changeid = req.form['node'][0]
> + ipos=changeid.find(':')
> + if ipos != -1:
> + changeid = changeid[:ipos]
> + return changeidctx(repo, changeid)
> +
> + return None
> +
> def filectx(repo, req):
> if 'file' not in req.form:
> raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
> @@ -178,7 +194,7 @@
> if len(files) > max:
> yield tmpl('fileellipses')
>
> -def diffs(repo, tmpl, ctx, files, parity, style):
> +def diffs(repo, tmpl, ctx, basectx, files, parity, style):
>
> def countgen():
> start = 1
> @@ -209,8 +225,11 @@
> m = match.always(repo.root, repo.getcwd())
>
> diffopts = patch.diffopts(repo.ui, untrusted=True)
> - parents = ctx.parents()
> - node1 = parents and parents[0].node() or nullid
> + if basectx is None:
> + parents = ctx.parents()
> + node1 = parents and parents[0].node() or nullid
> + else:
> + node1 = basectx.node()
> node2 = ctx.node()
>
> block = []
> @@ -274,10 +293,10 @@
> for oc in s.get_grouped_opcodes(n=context):
> yield tmpl('comparisonblock', lines=getblock(oc))
>
> -def diffstatgen(ctx):
> +def diffstatgen(ctx, basectx):
> '''Generator function that provides the diffstat data.'''
>
> - stats = patch.diffstatdata(util.iterlines(ctx.diff()))
> + stats = patch.diffstatdata(util.iterlines(ctx.diff(basectx)))
> maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
> while True:
> yield stats, maxname, maxtotal, addtotal, removetotal, binary
> diff --git a/mercurial/templater.py b/mercurial/templater.py
> --- a/mercurial/templater.py
> +++ b/mercurial/templater.py
> @@ -184,6 +184,7 @@
> for i in d:
> if isinstance(i, dict):
> lm.update(i)
> + lm['originalnode'] = mapping.get('node')
> yield runtemplate(context, lm, ctmpl)
> else:
> # v is not an iterable of dicts, this happen when 'key'
> diff --git a/mercurial/templates/paper/changeset.tmpl b/mercurial/templates/paper/changeset.tmpl
> --- a/mercurial/templates/paper/changeset.tmpl
> +++ b/mercurial/templates/paper/changeset.tmpl
> @@ -74,6 +74,14 @@
> </div>
> </td>
> </tr>
> +<tr>
> + <th class="author">change baseline</th>
> + <td class="author">{parent%changesetbaseline}</td>
> +</tr>
> +<tr>
> + <th class="author">current baseline</th>
> + <td class="author"><a href="{url}rev/{currentbaseline|short}{sessionvars%urlparameter}">{currentbaseline|short}</a> </td>
extraneous whitespace ^
> +</tr>
> </table>
>
> <div class="overflow">
> diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map
> --- a/mercurial/templates/paper/map
> +++ b/mercurial/templates/paper/map
> @@ -101,6 +101,8 @@
>
> changesetparent = '<a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
>
> +changesetbaseline = '<a href="{url}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">{node|short} </a> '
extraneous whitespace ^ ^
Unlike the extraneous whitespace above, this will actually affect the visual presentation. And it makes my pedantic eyes burn. ;)
Aside from those minor nits, the patch LGTM.
pacem in terris / мир / शान्ति / سَلاَم / 平和
Kevin R. Bullock
More information about the Mercurial-devel
mailing list