[PATCH] templatefilter: add support for 'long' to json()
Matt Harbison
mharbison72 at gmail.com
Sat Apr 1 18:35:27 EDT 2017
On Sat, 01 Apr 2017 15:20:02 -0400, Gregory Szorc
<gregory.szorc at gmail.com> wrote:
> On Sat, Apr 1, 2017 at 11:06 AM, Matt Harbison <mharbison72 at gmail.com>
> wrote:
>
>> # HG changeset patch
>> # User Matt Harbison <matt_harbison at yahoo.com>
>> # Date 1491020477 14400
>> # Sat Apr 01 00:21:17 2017 -0400
>> # Node ID a3d441253abc38df20c9890b207c1ab454bb691d
>> # Parent 2632df096fc0ac7582382b1f94ea4b9ad0bce8f2
>> 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 --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
>> --- a/mercurial/templatefilters.py
>> +++ b/mercurial/templatefilters.py
>> @@ -221,7 +221,8 @@
>> 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) or isinstance(obj, long)
>> + or isinstance(obj, float)):
>>
>
> isinstance() accepts a tuple of types as its second argument. Let's use
> that to make this code shorter. (This could probably be done in flight.)
>
Ah, thanks. I meant to look into if it did, but spent a lot of time
tracking down the int vs float vs long part, and forgot.
I've got a growing series of fixes for hg serve tests on Windows, so I'll
just send a v2 if nobody does a fix-in-flight in the meantime.
>> return str(obj)
>> elif isinstance(obj, str):
>> return '"%s"' % encoding.jsonescape(obj, paranoid=True)
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list