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 
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))