# HG changeset patch # User Yuya Nishihara # Date 1521284454 -32400 # Node ID 888507ec655e2869f3df520ef7cd6bd339d8ed40 # Parent fb7140f1d09d7464fdaebc86d5f8ee31f80353c4 templateutil: move flatten() from templater It's the same kind of utility as stringify(). diff -r fb7140f1d09d -r 888507ec655e mercurial/templater.py --- a/mercurial/templater.py Tue Mar 27 11:01:13 2018 -0400 +++ b/mercurial/templater.py Sat Mar 17 20:00:54 2018 +0900 @@ -527,33 +527,6 @@ # template engine -def _flatten(thing): - '''yield a single stream from a possibly nested set of iterators''' - thing = templateutil.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 = templateutil.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 unquotestring(s): '''unwrap quotes if any; otherwise returns unmodified string''' if len(s) < 2 or s[0] not in "'\"" or s[0] != s[-1]: @@ -706,7 +679,7 @@ if extramapping: extramapping.update(mapping) mapping = extramapping - return _flatten(func(self, mapping, data)) + return templateutil.flatten(func(self, mapping, data)) engines = {'default': engine} diff -r fb7140f1d09d -r 888507ec655e mercurial/templateutil.py --- 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)