Patchwork [2,of,3,V2,STABLE] hgweb: fix incorrect way to count revisions in log (issue3977)

login
register
mail settings
Submitter Alexander Plavin
Date July 22, 2013, 9:54 a.m.
Message ID <ca4c805ec72ac3bedb7a.1374486866@debian-alexander.dolgopa>
Download mbox | patch
Permalink /patch/1944/
State Superseded
Headers show

Comments

Alexander Plavin - July 22, 2013, 9:54 a.m.
# HG changeset patch
# User Alexander Plavin <me@aplavin.ru>
# Date 1374322072 -14400
#      Sat Jul 20 16:07:52 2013 +0400
# Node ID ca4c805ec72ac3bedb7a3e661ea236b7704a97fe
# Parent  82096c966790ec607efb16ebff2cfa53c643b700
hgweb: fix incorrect way to count revisions in log (issue3977)

Actual amount of revisions is used now instead of their numbers in the repo
befor to deal with skipped numbers correctly.
This iterates starting from the newest revision (which is shown on top)
yielding up to the specified count, instead of the reversed order used before.
Effect of this change on efficiency is negligible, when the same changesets are
returned.

Patch

diff -r 82096c966790 -r ca4c805ec72a mercurial/hgweb/webcommands.py
--- a/mercurial/hgweb/webcommands.py	Sat Jul 20 16:05:59 2013 +0400
+++ b/mercurial/hgweb/webcommands.py	Sat Jul 20 16:07:52 2013 +0400
@@ -200,38 +200,31 @@ 
             return _search(web, req, tmpl) # XXX redirect to 404 page?
 
     def changelist(latestonly, **map):
-        l = [] # build a list in forward order for efficiency
-        revs = []
-        if start < end:
-            revs = web.repo.changelog.revs(start, end - 1)
+        revs = web.repo.changelog.revs(pos, count=-revcount)
         if latestonly:
-            for r in revs:
-                pass
-            revs = (r,)
+            revs = (next(revs),)
         for i in revs:
             ctx = web.repo[i]
             n = ctx.node()
             showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
             files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
 
-            l.append({"parity": parity.next(),
-                      "author": ctx.user(),
-                      "parent": webutil.parents(ctx, i - 1),
-                      "child": webutil.children(ctx, i + 1),
-                      "changelogtag": showtags,
-                      "desc": ctx.description(),
-                      "extra": ctx.extra(),
-                      "date": ctx.date(),
-                      "files": files,
-                      "rev": i,
-                      "node": hex(n),
-                      "tags": webutil.nodetagsdict(web.repo, n),
-                      "bookmarks": webutil.nodebookmarksdict(web.repo, n),
-                      "inbranch": webutil.nodeinbranch(web.repo, ctx),
-                      "branches": webutil.nodebranchdict(web.repo, ctx)
-                     })
-        for e in reversed(l):
-            yield e
+            yield {"parity": parity.next(),
+                   "author": ctx.user(),
+                   "parent": webutil.parents(ctx, i - 1),
+                   "child": webutil.children(ctx, i + 1),
+                   "changelogtag": showtags,
+                   "desc": ctx.description(),
+                   "extra": ctx.extra(),
+                   "date": ctx.date(),
+                   "files": files,
+                   "rev": i,
+                   "node": hex(n),
+                   "tags": webutil.nodetagsdict(web.repo, n),
+                   "bookmarks": webutil.nodebookmarksdict(web.repo, n),
+                   "inbranch": webutil.nodeinbranch(web.repo, ctx),
+                   "branches": webutil.nodebranchdict(web.repo, ctx)
+            }
 
     revcount = shortlog and web.maxshortchanges or web.maxchanges
     if 'revcount' in req.form:
@@ -246,9 +239,7 @@ 
 
     count = len(web.repo)
     pos = ctx.rev()
-    start = max(0, pos - revcount + 1)
-    end = pos + 1
-    parity = paritygen(web.stripecount, offset=start - end)
+    parity = paritygen(web.stripecount)
 
     changenav = webutil.revnav(web.repo).gen(pos, revcount, count)