diff -r 47925b63be70 -r 654e9a1c8a6c mercurial/formatter.py --- a/mercurial/formatter.py Sun Apr 02 11:54:24 2017 +0900 +++ b/mercurial/formatter.py Sun Apr 02 12:02:17 2017 +0900 @@ -112,8 +112,8 @@ ) from . import ( - encoding, error, + templatefilters, templatekw, templater, util, @@ -282,24 +282,6 @@ baseformatter.end(self) self._out.write(pickle.dumps(self._data)) -def _jsonifyobj(v): - if isinstance(v, dict): - xs = ['"%s": %s' % (encoding.jsonescape(k), _jsonifyobj(u)) - for k, u in sorted(v.iteritems())] - return '{' + ', '.join(xs) + '}' - elif isinstance(v, (list, tuple)): - return '[' + ', '.join(_jsonifyobj(e) for e in v) + ']' - elif v is None: - return 'null' - elif v is True: - return 'true' - elif v is False: - return 'false' - elif isinstance(v, (int, long, float)): - return str(v) - else: - return '"%s"' % encoding.jsonescape(v) - class jsonformatter(baseformatter): def __init__(self, ui, out, topic, opts): baseformatter.__init__(self, ui, topic, opts, _nullconverter) @@ -319,7 +301,8 @@ first = False else: self._out.write(",\n") - self._out.write(' "%s": %s' % (k, _jsonifyobj(v))) + u = templatefilters.json(v, paranoid=False) + self._out.write(' "%s": %s' % (k, u)) self._out.write("\n }") def end(self): baseformatter.end(self)