[PATCH] templatefilter: add support for 'long' to json()

Yuya Nishihara yuya at tcha.org
Sat Apr 1 22:05:47 EDT 2017


On Sat, 1 Apr 2017 12:20:02 -0700, Gregory Szorc 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.)

Queued, thanks. Updated to use isinstance(obj, (...)).


More information about the Mercurial-devel mailing list