--- a/mercurial/templateutil.py Tue Mar 27 11:01:13 2018 -0400
+++ b/mercurial/templateutil.py Sat Mar 17 20:00:54 2018 +0900
@@ -234,6 +234,33 @@
if context.preload(endname):
yield context.process(endname, mapping)
+def flatten(thing):
+ """Yield a single stream from a possibly nested set of iterators"""
+ thing = unwraphybrid(thing)
+ if isinstance(thing, bytes):
+ yield thing
+ elif isinstance(thing, str):
+ # We can only hit this on Python 3, and it's here to guard
+ # against infinite recursion.
+ raise error.ProgrammingError('Mercurial IO including templates is done'
+ ' with bytes, not strings, got %r' % thing)
+ elif thing is None:
+ pass
+ elif not util.safehasattr(thing, '__iter__'):
+ yield pycompat.bytestr(thing)
+ else:
+ for i in thing:
+ i = unwraphybrid(i)
+ if isinstance(i, bytes):
+ yield i
+ elif i is None:
+ pass
+ elif not util.safehasattr(i, '__iter__'):
+ yield pycompat.bytestr(i)
+ else:
+ for j in flatten(i):
+ yield j
+
def stringify(thing):
"""Turn values into bytes by converting into text and concatenating them"""
thing = unwraphybrid(thing)