diff options
author | toonn <toonn@toonn.io> | 2023-06-14 19:18:32 +0200 |
---|---|---|
committer | toonn <toonn@toonn.io> | 2023-06-16 13:34:34 +0200 |
commit | 42b75f79a301b7ab73e108023d4cc6b5f6bd6825 (patch) | |
tree | 47ff850ef07610149ae39825db2b25c7655f528f | |
parent | 1b47dad017443ac29fee485ce07a8e22a4c84fbb (diff) |
fixup! ext/shutil_generatorized: copy_file_range only on recent Linux
-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 |