[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