hgweb: move revnavgen into an object
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Tue, 15 Jan 2013 21:17:18 +0100
changeset 18403 bfaee31a83d2
parent 18402 bfba6d954108
child 18404 1da84a6b136a
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)
mercurial/hgweb/webcommands.py
mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webcommands.py	Wed Jan 16 12:51:24 2013 +0100
+++ b/mercurial/hgweb/webcommands.py	Tue Jan 15 21:17:18 2013 +0100
@@ -242,7 +242,7 @@
     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,
@@ -772,7 +772,7 @@
             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),
@@ -851,7 +851,7 @@
 
     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))
--- a/mercurial/hgweb/webutil.py	Wed Jan 16 12:51:24 2013 +0100
+++ b/mercurial/hgweb/webutil.py	Tue Jan 15 21:17:18 2013 +0100
@@ -39,41 +39,43 @@
         yield 3 * step
         step *= 10
 
-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
-    """
+        :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
 
-    navbefore = []
-    navafter = []
+        The return is:
+            - a single element tuple
+            - containing a dictionary with a `before` and `after` key
+            - values are generator functions taking arbitrary number of kwargs
+            - yield items are dictionaries with `label` and `node` keys
+        """
 
-    for f in _navseq(1, pagelen):
-        if f > limit:
-            break
-        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
+        for f in _navseq(1, pagelen):
+            if f > limit:
+                break
+            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())))
 
-    data = lambda i: {"label": i[0], "node": i[1]}
-    return ({'before': lambda **map: (data(i) for i in navbefore),
-             'after':  lambda **map: (data(i) for i in navafter)},)
+        navafter.append(("tip", "tip"))
+        try:
+            navbefore.insert(0, ("(0)", hex(nodefunc(0).node())))
+        except error.RepoError:
+            pass
+
+        data = lambda i: {"label": i[0], "node": i[1]}
+        return ({'before': lambda **map: (data(i) for i in navbefore),
+                 'after':  lambda **map: (data(i) for i in navafter)},)
 
 def _siblings(siblings=[], hiderev=None):
     siblings = [s for s in siblings if s.node() != nullid]