[PATCH 1 of 8 filtering] revlog: allows reverse iteration with revlog.revs

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Nov 20 18:11:33 CST 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1353454925 -3600
# Node ID deb7a59af85a0827bc5ea7501bb1ea58a1752e69
# Parent  49c85541617baff9fea11ae3af55dee15bde2573
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