Patchwork [07,of,15,V3] hgweb: simplify the handling of empty repo

login
register
mail settings
Submitter Pierre-Yves David
Date Jan. 16, 2013, 1:32 p.m.
Message ID <c3821d05e8b7bb915899.1358343133@crater2.logilab.fr>
Download mbox | patch
Permalink /patch/644/
State Accepted
Commit 20cf53932b6fd459a598c5fd17ea759dfb68c6c9
Delegated to: Kevin Bullock
Headers show

Comments

Pierre-Yves David - Jan. 16, 2013, 1:32 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@logilab.fr>
# Date 1358177406 -3600
# Node ID c3821d05e8b7bb9158998d43024e12723025e270
# Parent  56d66eca9de40804a165128a45f0815f50acb7af
hgweb: simplify the handling of empty repo

This abstraction have two advantages:

- If the revlog is empty, None of the code bellow is relevant,
  early returns seems a win.

- Abtraction of the 'emptiness' check will help later when we stop relying on
  nodefunc.

A bonus, with filtering, a non-empty revlog may not have '0' revision
accessible. It'll be easier to handle with the emptiness test in a dedicated
function

Patch

diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -46,10 +46,18 @@  class revnav(object):
 
         :nodefun: factory for a changectx from a revision
         """
         self.nodefunc = nodefunc
 
+    def __nonzero__(self):
+        """return True if any revision to navigate over"""
+        try:
+            self.nodefunc(0)
+            return True
+        except error.RepoError:
+            return False
+
     def hex(self, rev):
         return self.nodefunc(rev).hex()
 
     def gen(self, pos, pagelen, limit):
         """computes label and revision id for navigation link
@@ -62,10 +70,13 @@  class revnav(object):
             - 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
         """
+        if not self:
+            # empty repo
+            return ({'before': (), 'after': ()},)
 
         navbefore = []
         navafter = []
 
         for f in _navseq(1, pagelen):
@@ -75,14 +86,11 @@  class revnav(object):
                 navafter.append(("+%d" % f, self.hex(pos + f)))
             if pos - f >= 0:
                 navbefore.insert(0, ("-%d" % f, self.hex(pos - f)))
 
         navafter.append(("tip", "tip"))
-        try:
-            navbefore.insert(0, ("(0)", self.hex(0)))
-        except error.RepoError:
-            pass
+        navbefore.insert(0, ("(0)", self.hex(0)))
 
         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)},)