[PATCH 01 of 14 clfilter part 1 V2] revlog: allows reverse iteration with revlog.revs

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Mon Nov 26 18:34:34 UTC 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1353454925 -3600
# Node ID 62dbc1a20f51a76421b0362da0227ff8e5460a3a
# Parent  d0d99c8bdf51a462bebc80e36a07576e58fc74c6
revlog: allows reverse iteration with revlog.revs

revlog.revs replace several iteration in reverse order. This changeset make is
possible to do so in order to avoid costly reverse or reversed() call.

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -255,15 +255,18 @@ class revlog(object):
         return len(self.index) - 1
     def __iter__(self):
         return iter(xrange(len(self)))
     def revs(self, start=0, stop=None):
         """iterate over all rev in this revlog (from start to stop)"""
-        if stop is None:
+        step = 1
+        if stop is not None:
+            if start > stop:
+                step = -1
+            stop += step
+        else:
             stop = len(self)
-        else:
-            stop += 1
-        return xrange(start, stop)
+        return xrange(start, stop, step)
 
     @util.propertycache
     def nodemap(self):
         self.rev(self.node(0))
         return self._nodecache


More information about the Mercurial-devel mailing list