[PATCH 2 of 2 RFC] revset: added cached generated list on generatorset

Lucas Moscovicz lmoscovicz at fb.com
Thu Feb 13 16:56:18 CST 2014


# HG changeset patch
# User Lucas Moscovicz <lmoscovicz at fb.com>
# Date 1392259549 28800
#      Wed Feb 12 18:45:49 2014 -0800
# Node ID 81523b4b0be9145300bb65f1a3d618904365decc
# Parent  f4d973e19d267efa440d992583a860fc2f8eed98
revset: added cached generated list on generatorset

This allows to iterate the generatorset more than once.

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -2150,15 +2150,23 @@
         self._gen = gen
         self._iter = iter(gen)
         self._cache = {}
+        self._genlist = baseset([])
+        self._iterated = False
+
+    def _nextitem(self):
+        l = self._iter.next()
+        self._cache[l] = True
+        self._genlist.append(l)
+        return l
 
     def __contains__(self, x):
         if x in self._cache:
             return self._cache[x]
 
+        self._iterated = True
         while True:
             try:
-                l = self._iter.next()
-                self._cache[l] = True
+                l = self._nextitem()
                 if l == x:
                     return True
             except (StopIteration):
@@ -2168,9 +2176,21 @@
         return False
 
     def __iter__(self):
-        for item in self._gen:
-            self._cache[item] = True
-            yield item
+        if self._iterated:
+            for l in self._genlist:
+                yield l
+            while True:
+                try:
+                    item = self._nextitem()
+                    yield item
+                except (StopIteration):
+                    break
+        else:
+            self._iterated = True
+            for item in self._gen:
+                self._cache[item] = True
+                self._genlist.append(item)
+                yield item
 
     def set(self):
         return self


More information about the Mercurial-devel mailing list