py3: catch StopIteration from next() in generatorset
authorMartin von Zweigbergk <martinvonz@google.com>
Tue, 20 Jun 2017 14:00:41 -0700
changeset 32977 27ba0d8dc26c
parent 32976 d39639fb840e
child 32978 41b081ac2145
py3: catch StopIteration from next() in generatorset IIUC, letting the StopIteration through would not cause any bugs, but not doing it makes the test-py3-commands.t pass. I have also diligently gone through all uses of next() in our code base. They either: * are not called from a generator * pass a default value to next() * catch StopException * work on infinite iterators * request a fixed number of items that matches the generated number * are about batching in wireproto which I didn't quite follow I'd appreciate if Augie or someone else could take a look at the wireproto batching and convince themselves that the next(batchable) calls there will not raise a StopIteration.
mercurial/smartset.py
--- a/mercurial/smartset.py	Tue Jun 20 23:23:45 2017 -0400
+++ b/mercurial/smartset.py	Tue Jun 20 14:00:41 2017 -0700
@@ -871,7 +871,10 @@
                 if i < _len(genlist):
                     yield genlist[i]
                 else:
-                    yield _next(nextgen)
+                    try:
+                        yield _next(nextgen)
+                    except StopIteration:
+                        return
                 i += 1
         return gen()