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:
parent
47e4c436a8
commit
4531513602
|
@ -331,7 +331,14 @@ class Receiver:
|
||||||
self._msg(u"%d files, %s (uncompressed)" %
|
self._msg(u"%d files, %s (uncompressed)" %
|
||||||
(file_data["numfiles"], naturalsize(file_data["numbytes"])))
|
(file_data["numfiles"], naturalsize(file_data["numbytes"])))
|
||||||
self._ask_permission()
|
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):
|
def _decide_destname(self, mode, destname):
|
||||||
# the basename() is intended to protect us against
|
# the basename() is intended to protect us against
|
||||||
|
|
|
@ -314,6 +314,12 @@ class Sender:
|
||||||
# We're sending a directory. Create a zipfile in a tempdir and
|
# We're sending a directory. Create a zipfile in a tempdir and
|
||||||
# send that.
|
# send that.
|
||||||
fd_to_send = tempfile.SpooledTemporaryFile()
|
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_files = 0
|
||||||
num_bytes = 0
|
num_bytes = 0
|
||||||
tostrip = len(what.split(os.sep))
|
tostrip = len(what.split(os.sep))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user