D5704: util: cast memoryview to bytes

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Sat Jan 26 00:02:26 UTC 2019


indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Python 3 uses readinto() instead of read() in places. And
  taking a slice of the buffer passed to readinto() will produce
  a memoryview. _writedata() then gets confused when testing for
  `b'\n' in data` because memoryview is an iterable over ints
  instead of 1 character bytes.
  
  We work around by casting a memoryview to bytes.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D5704

AFFECTED FILES
  mercurial/util.py

CHANGE DETAILS

diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -789,6 +789,12 @@
                                                       res))
 
         data = dest[0:res] if res is not None else b''
+
+        # _writedata() uses "in" operator and is confused by memoryview because
+        # characters are ints on Python 3.
+        if isinstance(data, memoryview):
+            data = data.tobytes()
+
         self._writedata(data)
 
     def write(self, res, data):



To: indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list