[PATCH] py3: catch StopIteration from next() in generatorset

Martin von Zweigbergk martinvonz at google.com
Tue Jun 20 21:45:57 UTC 2017


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1497992441 25200
#      Tue Jun 20 14:00:41 2017 -0700
# Node ID f86d21c457209f5f5a139bcc808be33fbd930424
# Parent  0906385672d754f13a512fe70759f0463a069f1e
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.

diff --git a/mercurial/smartset.py b/mercurial/smartset.py
--- a/mercurial/smartset.py
+++ b/mercurial/smartset.py
@@ -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()
 


More information about the Mercurial-devel mailing list