[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