[PATCH] formatter: allow json to handle more levels of depth

Kostia Balytskyi ikostia at fb.com
Fri Mar 4 11:29:26 EST 2016


This is a sample output of `evolve --list` with below fix applied to mercurial:

```
ikostia at dev1902.lla1:~/temprepos/supertroubledrepo$ HGRCPATH= ~/clowncopter/hg evolve --list  --config extensions.lz4revlog= --config extensions.color= --config extensions.evolve=~/evolve/hgext/evolve.py
[
...
  {
    "desc": "e (e+f split)",
    "divergentsets": [{"divergentwith": [{"node": "01a3e66ba0301a4cbb7d519f8b9980af271241bd"}],"gcea": "3efa43a7427b9b19dc715853251d4891d3e9334c"}, {"divergentwith": [{"node": "add9a356b8cfca95c588f51f05291ad97ffbaea8"}],"gcea": "3efa43a7427b9b19dc715853251d4891d3e9334c"}],
    "node": "84e1c6ae319d139241a02ef5e939d7494b9b11d7",
    "unstableparents": [{"unstableparent": "1995fc658ad6db877b932a45deb411980ccc064e"}]
  },

...
]

```






On 3/4/16, 4:17 PM, "Yuya Nishihara" <youjah at gmail.com on behalf of yuya at tcha.org> wrote:

>On Fri, 4 Mar 2016 06:14:24 -0800, Kostia Balytskyi wrote:
>> # HG changeset patch
>> # User Kostia Balytskyi <ikostia at fb.com>
>> # Date 1457099048 28800
>> #      Fri Mar 04 05:44:08 2016 -0800
>> # Node ID 0d64a8a89cb33fb677047e3b9357389b52015294
>> # Parent  4f7a5e4f2daff0a65aa470d9f70365ad55aaa100
>> formatter: allow json to handle more levels of depth
>
>Can you share some examples of nested data structure? I guess you are working
>on "evolve --list", but I don't understand the detail.
>
>I'm curious how to handle these nested data in templateformatter. Because the
>templater is complicated, I don't expect it will be simple.
>
>> diff --git a/mercurial/formatter.py b/mercurial/formatter.py
>> --- a/mercurial/formatter.py
>> +++ b/mercurial/formatter.py
>> @@ -109,8 +109,22 @@ class pickleformatter(baseformatter):
>>          baseformatter.end(self)
>>          self._ui.write(cPickle.dumps(self._data))
>>  
>> +def _getjsonbody(obj, sep=',', indent=''):
>> +    r = []
>> +    first = True
>> +    for key, val in sorted(obj.items()):
>> +        if first:
>> +            first = False
>> +        else:
>> +            r.append(sep)
>> +        r.append(indent)
>> +        r.append('"%s": %s' % (key, _jsonifyobj(val)))
>> +    return ''.join(r)
>> +
>>  def _jsonifyobj(v):
>> -    if isinstance(v, tuple):
>> +    if isinstance(v, dict):
>> +        return '{' + _getjsonbody(v) + '}'
>> +    elif isinstance(v, tuple) or isinstance(v, list):
>>          return '[' + ', '.join(_jsonifyobj(e) for e in v) + ']'
>>      elif v is None:
>>          return 'null'
>> @@ -133,16 +147,8 @@ class jsonformatter(baseformatter):
>>              self._ui._first = False
>>          else:
>>              self._ui.write(",")
>> -
>> -        self._ui.write("\n {\n")
>> -        first = True
>> -        for k, v in sorted(self._item.items()):
>> -            if first:
>> -                first = False
>> -            else:
>> -                self._ui.write(",\n")
>> -            self._ui.write('  "%s": %s' % (k, _jsonifyobj(v)))
>> -        self._ui.write("\n }")
>> +        body = _getjsonbody(self._item, sep=",\n", indent='  ')
>> +        self._ui.write("\n {\n" + body + "\n }")
>
>Looks like it is somewhat similar to templatefilters.json().


More information about the Mercurial-devel mailing list