[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