# HG changeset patch # User Matt Harbison # Date 1491020477 14400 # Node ID 35eb8f112c88669ba3297de16a9acc289aacfdcd # Parent 6be6e4becaafd1bf24f01a2d0464df9cea67588d templatefilter: add support for 'long' to json() When disabling the '#requires serve' check in test-hgwebdir.t and running it on Windows, several 500 errors popped up when querying '?style=json', with the following in the error log: File "...\\mercurial\\templater.py", line 393, in runfilter "keyword '%s'") % (filt.func_name, dt)) Abort: template filter 'json' is not compatible with keyword 'lastchange' The swallowed exception at that point was: File "...\\mercurial\\templatefilters.py", line 242, in json raise TypeError('cannot encode type %s' % obj.__class__.__name__) TypeError: cannot encode type long This corresponds to 'lastchange' being populated by hgweb.common.get_stat(), which uses os.stat().st_mtime. os.stat_float_times() is being disabled in util, so the type for the times is 'long' on Windows, and 'int' on Linux. diff -r 6be6e4becaaf -r 35eb8f112c88 mercurial/templatefilters.py --- a/mercurial/templatefilters.py Thu Mar 30 21:40:10 2017 +0200 +++ b/mercurial/templatefilters.py Sat Apr 01 00:21:17 2017 -0400 @@ -221,7 +221,7 @@ def json(obj): if obj is None or obj is False or obj is True: return {None: 'null', False: 'false', True: 'true'}[obj] - elif isinstance(obj, int) or isinstance(obj, float): + elif isinstance(obj, (int, long, float)): return str(obj) elif isinstance(obj, str): return '"%s"' % encoding.jsonescape(obj, paranoid=True)