Repository: pypa/pip

Issue:
TypeError with Python 2.7.3 (Debian Wheezy) + pip 10.0
Traceback here: https://github.com/msgpack/msgpack-python/issues/299

Patch that can be cherry-picked if it's not upstreamed is here: https://github.com/msgpack/msgpack-python/pull/300


Discussion:
Patch landed upstream in msgpack, dunno if they plan to do a release or not.
There's probably going to be a 10.0.1 in a day or two. If someone wants to get a msgpack release sorted out, or sort out getting a patch for our vendored version, time is short :-)

Resolving patch:
diff --git a/src/pip/_vendor/msgpack/fallback.py b/src/pip/_vendor/msgpack/fallback.py
--- a/src/pip/_vendor/msgpack/fallback.py
+++ b/src/pip/_vendor/msgpack/fallback.py
@@ -234,6 +234,12 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
 
         #: array of bytes fed.
         self._buffer = bytearray()
+        # Some very old pythons don't support `struct.unpack_from()` with a
+        # `bytearray`. So we wrap it in a `buffer()` there.
+        if sys.version_info < (2, 7, 6):
+            self._buffer_view = buffer(self._buffer)
+        else:
+            self._buffer_view = self._buffer
         #: Which position we currently reads
         self._buff_i = 0
 
@@ -388,7 +394,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xc5:
             typ = TYPE_BIN
             self._reserve(2)
-            n = struct.unpack_from(">H", self._buffer, self._buff_i)[0]
+            n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
             self._buff_i += 2
             if n > self._max_bin_len:
                 raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
@@ -396,7 +402,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xc6:
             typ = TYPE_BIN
             self._reserve(4)
-            n = struct.unpack_from(">I", self._buffer, self._buff_i)[0]
+            n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
             self._buff_i += 4
             if n > self._max_bin_len:
                 raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
@@ -404,7 +410,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xc7:  # ext 8
             typ = TYPE_EXT
             self._reserve(2)
-            L, n = struct.unpack_from('Bb', self._buffer, self._buff_i)
+            L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i)
             self._buff_i += 2
             if L > self._max_ext_len:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
@@ -412,7 +418,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xc8:  # ext 16
             typ = TYPE_EXT
             self._reserve(3)
-            L, n = struct.unpack_from('>Hb', self._buffer, self._buff_i)
+            L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i)
             self._buff_i += 3
             if L > self._max_ext_len:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
@@ -420,18 +426,18 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xc9:  # ext 32
             typ = TYPE_EXT
             self._reserve(5)
-            L, n = struct.unpack_from('>Ib', self._buffer, self._buff_i)
+            L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i)
             self._buff_i += 5
             if L > self._max_ext_len:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
             obj = self._read(L)
         elif b == 0xca:
             self._reserve(4)
-            obj = struct.unpack_from(">f", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0]
             self._buff_i += 4
         elif b == 0xcb:
             self._reserve(8)
-            obj = struct.unpack_from(">d", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0]
             self._buff_i += 8
         elif b == 0xcc:
             self._reserve(1)
@@ -439,66 +445,66 @@ def _read_header(self, execute=EX_CONSTRUCT):
             self._buff_i += 1
         elif b == 0xcd:
             self._reserve(2)
-            obj = struct.unpack_from(">H", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
             self._buff_i += 2
         elif b == 0xce:
             self._reserve(4)
-            obj = struct.unpack_from(">I", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
             self._buff_i += 4
         elif b == 0xcf:
             self._reserve(8)
-            obj = struct.unpack_from(">Q", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0]
             self._buff_i += 8
         elif b == 0xd0:
             self._reserve(1)
-            obj = struct.unpack_from("b", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0]
             self._buff_i += 1
         elif b == 0xd1:
             self._reserve(2)
-            obj = struct.unpack_from(">h", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0]
             self._buff_i += 2
         elif b == 0xd2:
             self._reserve(4)
-            obj = struct.unpack_from(">i", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0]
             self._buff_i += 4
         elif b == 0xd3:
             self._reserve(8)
-            obj = struct.unpack_from(">q", self._buffer, self._buff_i)[0]
+            obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0]
             self._buff_i += 8
         elif b == 0xd4:  # fixext 1
             typ = TYPE_EXT
             if self._max_ext_len < 1:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
             self._reserve(2)
-            n, obj = struct.unpack_from("b1s", self._buffer, self._buff_i)
+            n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i)
             self._buff_i += 2
         elif b == 0xd5:  # fixext 2
             typ = TYPE_EXT
             if self._max_ext_len < 2:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
             self._reserve(3)
-            n, obj = struct.unpack_from("b2s", self._buffer, self._buff_i)
+            n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i)
             self._buff_i += 3
         elif b == 0xd6:  # fixext 4
             typ = TYPE_EXT
             if self._max_ext_len < 4:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
             self._reserve(5)
-            n, obj = struct.unpack_from("b4s", self._buffer, self._buff_i)
+            n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i)
             self._buff_i += 5
         elif b == 0xd7:  # fixext 8
             typ = TYPE_EXT
             if self._max_ext_len < 8:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
             self._reserve(9)
-            n, obj = struct.unpack_from("b8s", self._buffer, self._buff_i)
+            n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i)
             self._buff_i += 9
         elif b == 0xd8:  # fixext 16
             typ = TYPE_EXT
             if self._max_ext_len < 16:
                 raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
             self._reserve(17)
-            n, obj = struct.unpack_from("b16s", self._buffer, self._buff_i)
+            n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i)
             self._buff_i += 17
         elif b == 0xd9:
             typ = TYPE_RAW
@@ -511,7 +517,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xda:
             typ = TYPE_RAW
             self._reserve(2)
-            n, = struct.unpack_from(">H", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
             self._buff_i += 2
             if n > self._max_str_len:
                 raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
@@ -519,7 +525,7 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xdb:
             typ = TYPE_RAW
             self._reserve(4)
-            n, = struct.unpack_from(">I", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
             self._buff_i += 4
             if n > self._max_str_len:
                 raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
@@ -527,27 +533,27 @@ def _read_header(self, execute=EX_CONSTRUCT):
         elif b == 0xdc:
             typ = TYPE_ARRAY
             self._reserve(2)
-            n, = struct.unpack_from(">H", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
             self._buff_i += 2
             if n > self._max_array_len:
                 raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
         elif b == 0xdd:
             typ = TYPE_ARRAY
             self._reserve(4)
-            n, = struct.unpack_from(">I", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
             self._buff_i += 4
             if n > self._max_array_len:
                 raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
         elif b == 0xde:
             self._reserve(2)
-            n, = struct.unpack_from(">H", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
             self._buff_i += 2
             if n > self._max_map_len:
                 raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
             typ = TYPE_MAP
         elif b == 0xdf:
             self._reserve(4)
-            n, = struct.unpack_from(">I", self._buffer, self._buff_i)
+            n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
             self._buff_i += 4
             if n > self._max_map_len:
                 raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)


Test patch: