Patchwork [02,of,22,V2-Series-D] hgweb: move revnavgen into an object

login
register
mail settings
Submitter Pierre-Yves David
Date Jan. 14, 2013, 8:35 p.m.
Message ID <f3a21139337faae5dd71.1358195734@yamac.lan>
Download mbox | patch
Permalink /patch/598/
State Superseded
Commit bfaee31a83d209c96f3c8b99b05daaef4da61b50
Headers show

Comments

Pierre-Yves David - Jan. 14, 2013, 8:35 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@logilab.fr>
# Date 1358180901 -3600
# Node ID f3a21139337faae5dd711516b21e7678c1c703ce
# Parent  869fbec5fd438ce182c7ba5ca2a9a79d9f3fce99
hgweb: move revnavgen into an object

For later compatibility with changelog filtering some part of the navigation
generation logic will be altered. Those altered part will be different when in
the changelog case and in the filelog case. Moving this into an object will
allow to use inheritance to override just the part of the logic we need.

The aimed logic are for example:

- generation of revision 'hex' (different logic for changelog and filelog)
- revlog emptyness test
- fetching of the first revision of a revlog (may not be 0)

Patch

diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
--- a/mercurial/hgweb/webcommands.py
+++ b/mercurial/hgweb/webcommands.py
@@ -240,11 +240,11 @@  def changelog(web, req, tmpl, shortlog=F
     start = max(0, pos - revcount + 1)
     end = min(count, start + revcount)
     pos = end - 1
     parity = paritygen(web.stripecount, offset=start - end)
 
-    changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
+    changenav = webutil.revnav().gen(pos, revcount, count, web.repo.changectx)
 
     return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
                 node=ctx.hex(), rev=pos, changesets=count,
                 entries=lambda **x: changelist(latestonly=False, **x),
                 latestentry=lambda **x: changelist(latestonly=True, **x),
@@ -770,11 +770,11 @@  def filelog(web, req, tmpl):
                       "branches": webutil.nodebranchdict(repo, iterfctx)})
         for e in reversed(l):
             yield e
 
     nodefunc = lambda x: fctx.filectx(fileid=x)
-    nav = webutil.revnavgen(end - 1, revcount, count, nodefunc)
+    nav = webutil.revnav().gen(end - 1, revcount, count, nodefunc)
     return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
                 entries=lambda **x: entries(latestonly=False, **x),
                 latestentry=lambda **x: entries(latestonly=True, **x),
                 revcount=revcount, morevars=morevars, lessvars=lessvars)
 
@@ -850,11 +850,11 @@  def graph(web, req, tmpl):
     end = min(count, start + revcount)
     pos = end - 1
 
     uprev = min(max(0, count - 1), rev + revcount)
     downrev = max(0, rev - revcount)
-    changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
+    changenav = webutil.revnav().gen(pos, revcount, count, web.repo.changectx)
 
     dag = graphmod.dagwalker(web.repo, range(start, end)[::-1])
     tree = list(graphmod.colored(dag, web.repo))
 
     def getcolumns(tree):
diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -22,63 +22,65 @@  def up(p):
     up = os.path.dirname(p)
     if up == "/":
         return "/"
     return up + "/"
 
-def revnavgen(pos, pagelen, limit, nodefunc):
-    """computes label and revision id for navigation link
+class revnav(object):
 
-    :pos: is the revision relative to which we generate navigation.
-    :pagelen: the size of each navigation page
-    :limit: how far shall we link
-    :nodefun: factory for a changectx from a revision
+    def gen(self, pos, pagelen, limit, nodefunc):
+        """computes label and revision id for navigation link
 
-    The return is:
-        - a single element tuple
-        - containing a dictionary with a `before` and `after` key
-        - values are generator functions taking an arbitrary number of kwargs
-        - yield items are dictionaries with `label` and `node` keys
-    """
-    def seq(factor, limit=None):
-        if limit:
-            yield limit
-            if limit >= 20 and limit <= 40:
-                yield 50
-        else:
-            yield 1 * factor
-            yield 3 * factor
-        for f in seq(factor * 10):
-            yield f
+        :pos: is the revision relative to which we generate navigation.
+        :pagelen: the size of each navigation pages
+        :limit: how far shall we link
+        :nodefun: factory for a changectx from a revision
 
-    navbefore = []
-    navafter = []
+        The return is:
+            - a single element tuple
+            - containing a dictionary with a `before` and `after` key
+            - values are generator function taking arbitrary number of kwargs
+            - yield items are dictionnary with `label` and `node` key
+        """
+        def seq(factor, limit=None):
+            if limit:
+                yield limit
+                if limit >= 20 and limit <= 40:
+                    yield 50
+            else:
+                yield 1 * factor
+                yield 3 * factor
+            for f in seq(factor * 10):
+                yield f
 
-    last = 0
-    for f in seq(1, pagelen):
-        if f < pagelen or f <= last:
-            continue
-        if f > limit:
-            break
-        last = f
-        if pos + f < limit:
-            navafter.append(("+%d" % f, hex(nodefunc(pos + f).node())))
-        if pos - f >= 0:
-            navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
+        navbefore = []
+        navafter = []
 
-    navafter.append(("tip", "tip"))
-    try:
-        navbefore.insert(0, ("(0)", hex(nodefunc('0').node())))
-    except error.RepoError:
-        pass
+        last = 0
+        for f in seq(1, pagelen):
+            if f < pagelen or f <= last:
+                continue
+            if f > limit:
+                break
+            last = f
+            if pos + f < limit:
+                navafter.append(("+%d" % f, hex(nodefunc(pos + f).node())))
+            if pos - f >= 0:
+                navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
 
-    def gen(l):
-        def f(**map):
-            for label, node in l:
-                yield {"label": label, "node": node}
-        return f
+        navafter.append(("tip", "tip"))
+        try:
+            navbefore.insert(0, ("(0)", hex(nodefunc('0').node())))
+        except error.RepoError:
+            pass
 
-    return (dict(before=gen(navbefore), after=gen(navafter)),)
+        def gen(l):
+            def f(**map):
+                for label, node in l:
+                    yield {"label": label, "node": node}
+            return f
+
+        return (dict(before=gen(navbefore), after=gen(navafter)),)
 
 def _siblings(siblings=[], hiderev=None):
     siblings = [s for s in siblings if s.node() != nullid]
     if len(siblings) == 1 and siblings[0].rev() == hiderev:
         return