diff -r b4e7e1f09c09 -r 0f549da54379 mercurial/utils/stringutil.py --- a/mercurial/utils/stringutil.py Wed Aug 22 08:20:51 2018 +0800 +++ b/mercurial/utils/stringutil.py Mon Aug 27 09:13:58 2018 -0700 @@ -43,12 +43,20 @@ return pat return pat.encode('latin1') -def pprint(o, bprefix=False): +def pprint(o, bprefix=False, indent=0): """Pretty print an object.""" - return b''.join(pprintgen(o, bprefix=bprefix)) + return b''.join(pprintgen(o, bprefix=bprefix, indent=indent)) + +def pprintgen(o, bprefix=False, indent=0, _level=1): + """Pretty print an object to a generator of atoms. -def pprintgen(o, bprefix=False): - """Pretty print an object to a generator of atoms.""" + ``bprefix`` is a flag influencing whether bytestrings are preferred with + a ``b''`` prefix. + + ``indent`` controls whether collections and nested data structures + span multiple lines via the indentation amount in spaces. By default, + no newlines are emitted. + """ if isinstance(o, bytes): if bprefix: @@ -66,12 +74,25 @@ yield '[' + if indent: + yield '\n' + yield ' ' * (_level * indent) + for i, a in enumerate(o): - for chunk in pprintgen(a, bprefix=bprefix): + for chunk in pprintgen(a, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk if i + 1 < len(o): - yield ', ' + if indent: + yield ',\n' + yield ' ' * (_level * indent) + else: + yield ', ' + + if indent: + yield '\n' + yield ' ' * ((_level - 1) * indent) yield ']' elif isinstance(o, dict): @@ -81,17 +102,31 @@ yield '{' + if indent: + yield '\n' + yield ' ' * (_level * indent) + for i, (k, v) in enumerate(sorted(o.items())): - for chunk in pprintgen(k, bprefix=bprefix): + for chunk in pprintgen(k, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk yield ': ' - for chunk in pprintgen(v, bprefix=bprefix): + for chunk in pprintgen(v, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk if i + 1 < len(o): - yield ', ' + if indent: + yield ',\n' + yield ' ' * (_level * indent) + else: + yield ', ' + + if indent: + yield '\n' + yield ' ' * ((_level - 1) * indent) yield '}' elif isinstance(o, set): @@ -101,12 +136,25 @@ yield 'set([' + if indent: + yield '\n' + yield ' ' * (_level * indent) + for i, k in enumerate(sorted(o)): - for chunk in pprintgen(k, bprefix=bprefix): + for chunk in pprintgen(k, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk if i + 1 < len(o): - yield ', ' + if indent: + yield ',\n' + yield ' ' * (_level * indent) + else: + yield ', ' + + if indent: + yield '\n' + yield ' ' * ((_level - 1) * indent) yield '])' elif isinstance(o, tuple): @@ -116,12 +164,25 @@ yield '(' + if indent: + yield '\n' + yield ' ' * (_level * indent) + for i, a in enumerate(o): - for chunk in pprintgen(a, bprefix=bprefix): + for chunk in pprintgen(a, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk if i + 1 < len(o): - yield ', ' + if indent: + yield ',\n' + yield ' ' * (_level * indent) + else: + yield ', ' + + if indent: + yield '\n' + yield ' ' * ((_level - 1) * indent) yield ')' elif isinstance(o, types.GeneratorType): @@ -134,6 +195,10 @@ yield 'gen[' + if indent: + yield '\n' + yield ' ' * (_level * indent) + last = False while not last: @@ -144,11 +209,20 @@ except StopIteration: last = True - for chunk in pprintgen(current, bprefix=bprefix): + for chunk in pprintgen(current, bprefix=bprefix, indent=indent, + _level=_level + 1): yield chunk if not last: - yield ', ' + if indent: + yield ',\n' + yield ' ' * (_level * indent) + else: + yield ', ' + + if indent: + yield '\n' + yield ' ' * ((_level -1) * indent) yield ']' else: