summaryrefslogtreecommitdiffstats
path: root/ranger/ext/shutil_generatorized.py
diff options
context:
space:
mode:
Diffstat (limited to 'ranger/ext/shutil_generatorized.py')
-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