cmd_send/receive: work around python3.7.0 bug

See https://bugs.python.org/issue26175 . tempfile.SpooledTemporaryFile
doesn't fully implement the IOBase abstract class, which breaks because
py3.7.0's new zipfile module tries to delegate .seekable down to the wrapped
file and causes an AttributeError.

refs #306
This commit is contained in:
Brian Warner 2018-07-01 14:25:22 -07:00
parent 47e4c436a8
commit 4531513602
2 changed files with 14 additions and 1 deletions

View File

@ -331,7 +331,14 @@ class Receiver:
self._msg(u"%d files, %s (uncompressed)" %
(file_data["numfiles"], naturalsize(file_data["numbytes"])))
self._ask_permission()
return tempfile.SpooledTemporaryFile()
f = tempfile.SpooledTemporaryFile()
# workaround for https://bugs.python.org/issue26175 (STF doesn't
# fully implement IOBase abstract class), which breaks the new
# zipfile in py3.7.0 that expects .seekable
if not hasattr(f, "seekable"):
# AFAICT all the filetypes that STF wraps can seek
f.seekable = lambda: True
return f
def _decide_destname(self, mode, destname):
# the basename() is intended to protect us against

View File

@ -314,6 +314,12 @@ class Sender:
# We're sending a directory. Create a zipfile in a tempdir and
# send that.
fd_to_send = tempfile.SpooledTemporaryFile()
# workaround for https://bugs.python.org/issue26175 (STF doesn't
# fully implement IOBase abstract class), which breaks the new
# zipfile in py3.7.0 that expects .seekable
if not hasattr(fd_to_send, "seekable"):
# AFAICT all the filetypes that STF wraps can seek
fd_to_send.seekable = lambda: True
num_files = 0
num_bytes = 0
tostrip = len(what.split(os.sep))