diff options
Diffstat (limited to 'ranger/ext/shutil_generatorized.py')
-rw-r--r-- | ranger/ext/shutil_generatorized.py | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/ranger/ext/shutil_generatorized.py b/ranger/ext/shutil_generatorized.py index c6419b1d..3ba76d5a 100644 --- a/ranger/ext/shutil_generatorized.py +++ b/ranger/ext/shutil_generatorized.py @@ -111,22 +111,26 @@ def copyfileobj(fsrc, fdst, length=BLOCK_SIZE): yield done -def copyfileobj_range(fsrc, fdst, length=BLOCK_SIZE): - """copy data from fsrc to fdst with copy_file_range to enable CoW""" - try: - copy = os.copy_file_range - except AttributeError: - raise CopyFileRangeUnsupported - src_fd = fsrc.fileno() - dst_fd = fdst.fileno() - done = 0 - while 1: - # copy_file_range returns number of bytes read, or -1 if there was an error - read = copy(src_fd, dst_fd, length) - if read == 0: - break - done += read - yield done +try: + _copy = os.copy_file_range + + def copyfileobj_range(fsrc, fdst, length=BLOCK_SIZE): + """copy data from fsrc to fdst with copy_file_range to enable CoW""" + src_fd = fsrc.fileno() + dst_fd = fdst.fileno() + done = 0 + while 1: + # copy_file_range returns number of bytes read, or -1 if there was + # an error + read = _copy(src_fd, dst_fd, length) + if read == 0: + break + elif read == -1: + raise OSError + done += read + yield done +except AttributeError: + pass def copyfile(src, dst): @@ -150,10 +154,12 @@ def copyfile(src, dst): try: for done in copyfileobj_range(fsrc, fdst): yield done - except (CopyFileRangeUnsupported, OSError): + except OSError: # Return to start of files first, then use old method fsrc.seek(0, 0) fdst.seek(0, 0) + except NameError: + pass # Just fall back if there's no copy_file_range for done in copyfileobj(fsrc, fdst): yield done |