[PATCH] hgweb: build the "entries" list directly in filelog command

Gregory Szorc gregory.szorc at gmail.com
Sat Jan 14 00:14:35 EST 2017


On Fri, Jan 13, 2017 at 8:08 AM, Pierre-Yves David <
pierre-yves.david at ens-lyon.org> wrote:

>
>
> On 01/13/2017 04:31 PM, Denis Laxalde wrote:
>
>> # HG changeset patch
>> # User Denis Laxalde <denis.laxalde at logilab.fr>
>> # Date 1484299345 -3600
>> #      Fri Jan 13 10:22:25 2017 +0100
>> # Node ID ad41cc2eb799156b0de2dd71adeed88ec42a98d9
>> # Parent  e882c7bb5a0ba2589a44108c9a87b300a13e08df
>> hgweb: build the "entries" list directly in filelog command
>>
>> There's no apparent reason to have this "entries" generator function that
>> builds a list and then yields its elements in reverse order and which is
>> only
>> called to build the "entries" list. So just build the list directly, in
>> reverse order.
>>
>
> revlog are usually read from 0 to max for performance reason (data in N+1
> might rely on data on N and last access might be cached).
> This might explain why the list was build in one direction and then
> reversed.
> Can you double check if such mechanism is in play in this case?
>
>
Your observation about desiring to iterate revlogs from 0 to max is spot on
and this patch would normally be wrong. However, in this code `start > end`
(as can be seen in the context just above the first changed line), so we're
already iterating in the suboptimal direction. This patch actually fixes
that by throwing in a reversed() of a descending fctx.filelog().revs()!

(This confused me on first read too.)



> (I fully support the removal of the closure)
>
>
> Adjust "parity" generator's offset to keep rendering the same.
>>
>> diff --git a/mercurial/hgweb/webcommands.py
>> b/mercurial/hgweb/webcommands.py
>> --- a/mercurial/hgweb/webcommands.py
>> +++ b/mercurial/hgweb/webcommands.py
>> @@ -974,26 +974,20 @@ def filelog(web, req, tmpl):
>>      count = fctx.filerev() + 1
>>      start = max(0, fctx.filerev() - revcount + 1) # first rev on this
>> page
>>      end = min(count, start + revcount) # last rev on this page
>> -    parity = paritygen(web.stripecount, offset=start - end)
>> -
>> -    def entries():
>> -        l = []
>> -
>> -        repo = web.repo
>> -        revs = fctx.filelog().revs(start, end - 1)
>> -        for i in revs:
>> -            iterfctx = fctx.filectx(i)
>> +    parity = paritygen(web.stripecount, offset=start - end + 1)
>>
>> -            l.append(dict(
>> -                parity=next(parity),
>> -                filerev=i,
>> -                file=f,
>> -                rename=webutil.renamelink(iterfctx),
>> -                **webutil.commonentry(repo, iterfctx)))
>> -        for e in reversed(l):
>> -            yield e
>> +    repo = web.repo
>> +    revs = fctx.filelog().revs(start, end - 1)
>> +    entries = []
>> +    for i in reversed(revs):
>> +        iterfctx = fctx.filectx(i)
>> +        entries.append(dict(
>> +            parity=next(parity),
>> +            filerev=i,
>> +            file=f,
>> +            rename=webutil.renamelink(iterfctx),
>> +            **webutil.commonentry(repo, iterfctx)))
>>
>> -    entries = list(entries())
>>      latestentry = entries[:1]
>>
>>      revnav = webutil.filerevnav(web.repo, fctx.path())
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>>
>>
> --
> Pierre-Yves David
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20170113/ed29a633/attachment.html>


More information about the Mercurial-devel mailing list