[PATCH V2] cbor: teach the encoder to handle python `long` type for Windows

Matt Harbison mharbison72 at gmail.com
Wed Sep 5 03:36:18 UTC 2018


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1536114578 14400
#      Tue Sep 04 22:29:38 2018 -0400
# Node ID 2cce57226251044ce3406ad92e4edbf01efcde72
# Parent  197521083166579f6c80d7532ec6e919af2fe2cf
cbor: teach the encoder to handle python `long` type for Windows

The tests for 2**32 and -7000000000 were blowing up, complaining about not
knowing how to encode type 'long'.  sys.maxint tops out at 2**31-1 on Windows,
but I guess is 2^63-1 on Linux?  I *think* we're OK on the decode side, as there
is an assertion that the decoded value is equal to the original primitive value.

I opted for the pycompat alias instead of swallowing the NameError because the
vendored cbor package uses an alias, and I see at least pywatchman and
templatefilters open codes their own aliases.

diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py
--- a/mercurial/pycompat.py
+++ b/mercurial/pycompat.py
@@ -120,6 +120,8 @@ if ispy3:
     rawinput = input
     getargspec = inspect.getfullargspec
 
+    long = int
+
     # TODO: .buffer might not exist if std streams were replaced; we'll need
     # a silly wrapper to make a bytes stream backed by a unicode one.
     stdin = sys.stdin.buffer
@@ -384,6 +386,7 @@ else:
     ospardir = os.pardir
     ossep = os.sep
     osaltsep = os.altsep
+    long = long
     stdin = sys.stdin
     stdout = sys.stdout
     stderr = sys.stderr
diff --git a/mercurial/utils/cborutil.py b/mercurial/utils/cborutil.py
--- a/mercurial/utils/cborutil.py
+++ b/mercurial/utils/cborutil.py
@@ -10,6 +10,8 @@ from __future__ import absolute_import
 import struct
 import sys
 
+from .. import pycompat
+
 # Very short very of RFC 7049...
 #
 # Each item begins with a byte. The 3 high bits of that byte denote the
@@ -190,6 +192,7 @@ def streamencodenone(v):
 STREAM_ENCODERS = {
     bytes: streamencodebytestring,
     int: streamencodeint,
+    pycompat.long: streamencodeint,   # For Windows
     list: streamencodearray,
     tuple: streamencodearray,
     dict: streamencodemap,


More information about the Mercurial-devel mailing list