summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortoonn <toonn@toonn.io>2023-06-14 19:18:32 +0200
committertoonn <toonn@toonn.io>2023-06-16 13:34:34 +0200
commit42b75f79a301b7ab73e108023d4cc6b5f6bd6825 (patch)
tree47ff850ef07610149ae39825db2b25c7655f528f
parent1b47dad017443ac29fee485ce07a8e22a4c84fbb (diff)
fixup! ext/shutil_generatorized: copy_file_range only on recent Linux
-rw-r--r--ranger/ext/shutil_generatorized.py40
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