From 42b75f79a301b7ab73e108023d4cc6b5f6bd6825 Mon Sep 17 00:00:00 2001 From: toonn Date: Wed, 14 Jun 2023 19:18:32 +0200 Subject: fixup! ext/shutil_generatorized: copy_file_range only on recent Linux --- ranger/ext/shutil_generatorized.py | 40 ++++++++++++++++++++++---------------- 1 file 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 -- cgit v1.2.3