From a258b5c10d3710c4bb4895bd3c6698ed7cb2e28e Mon Sep 17 00:00:00 2001 From: arappold Date: Mon, 17 Aug 2015 14:45:47 +0200 Subject: make mv/cp generators yield progress --- ranger/core/loader.py | 13 ++++++------- ranger/ext/shutil_generatorized.py | 34 +++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ranger/core/loader.py b/ranger/core/loader.py index 1f9ec9cf..e672bbed 100644 --- a/ranger/core/loader.py +++ b/ranger/core/loader.py @@ -77,7 +77,6 @@ class CopyLoader(Loadable, FileManagerAware): # TODO: Don't calculate size when renaming (needs detection) bytes_per_tick = shutil_g.BLOCK_SIZE size = max(1, self._calculate_size(bytes_per_tick)) - bar_tick = 100.0 / (float(size) / bytes_per_tick) if self.do_cut: self.original_copy_buffer.clear() if len(self.copy_buffer) == 1: @@ -92,10 +91,10 @@ class CopyLoader(Loadable, FileManagerAware): self.fm.tags.tags[tf.replace(f.path, self.original_path \ + '/' + f.basename)] = tag self.fm.tags.dump() - for _ in shutil_g.move(src=f.path, + for done in shutil_g.move(src=f.path, dst=self.original_path, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield else: if len(self.copy_buffer) == 1: @@ -104,17 +103,17 @@ class CopyLoader(Loadable, FileManagerAware): self.description = "copying files from: " + self.one_file.dirname for f in self.copy_buffer: if os.path.isdir(f.path) and not os.path.islink(f.path): - for _ in shutil_g.copytree(src=f.path, + for done in shutil_g.copytree(src=f.path, dst=os.path.join(self.original_path, f.basename), symlinks=True, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield else: - for _ in shutil_g.copy2(f.path, self.original_path, + for done in shutil_g.copy2(f.path, self.original_path, symlinks=True, overwrite=self.overwrite): - self.percent += bar_tick + self.percent = float(done) / size * 100. yield cwd = self.fm.get_directory(self.original_path) cwd.load_content() diff --git a/ranger/ext/shutil_generatorized.py b/ranger/ext/shutil_generatorized.py index b20d5cef..e2d07110 100644 --- a/ranger/ext/shutil_generatorized.py +++ b/ranger/ext/shutil_generatorized.py @@ -8,6 +8,7 @@ XXX The functions here don't copy the resource fork or other metadata on Mac. import os import sys import stat +import time from os.path import abspath __all__ = ["copyfileobj","copyfile","copystat","copy2","BLOCK_SIZE", @@ -30,12 +31,14 @@ except NameError: def copyfileobj(fsrc, fdst, length=BLOCK_SIZE): """copy data from file-like object fsrc to file-like object fdst""" + total = 0 while 1: buf = fsrc.read(length) if not buf: break fdst.write(buf) - yield + total += len(buf) + yield total def _samefile(src, dst): # Macintosh, Unix. @@ -69,8 +72,8 @@ def copyfile(src, dst): try: fsrc = open(src, 'rb') fdst = open(dst, 'wb') - for _ in copyfileobj(fsrc, fdst): - yield + for done in copyfileobj(fsrc, fdst): + yield done finally: if fdst: fdst.close() @@ -107,8 +110,8 @@ def copy2(src, dst, overwrite=False, symlinks=False): os.unlink(dst) os.symlink(linkto, dst) else: - for _ in copyfile(src, dst): - yield + for done in copyfile(src, dst): + yield done copystat(src, dst) def get_safe_path(dst): @@ -165,6 +168,7 @@ def copytree(src, dst, symlinks=False, ignore=None, overwrite=False): if not overwrite: dst = get_safe_path(dst) os.makedirs(dst) + total = 0 for name in names: if name in ignored_names: continue @@ -178,14 +182,18 @@ def copytree(src, dst, symlinks=False, ignore=None, overwrite=False): os.symlink(linkto, dstname) copystat(srcname, dstname) elif os.path.isdir(srcname): - for _ in copytree(srcname, dstname, symlinks, + done = 0 + for done in copytree(srcname, dstname, symlinks, ignore, overwrite): - yield + yield total + done + total += done else: # Will raise a SpecialFileError for unsupported file types - for _ in copy2(srcname, dstname, + done = 0 + for done in copy2(srcname, dstname, overwrite=overwrite, symlinks=symlinks): - yield + yield total + done + total += done # catch the Error from the recursive copytree so that we can # continue with other files except Error as err: @@ -283,12 +291,12 @@ def move(src, dst, overwrite=False): if os.path.isdir(src): if _destinsrc(src, dst): raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - for _ in copytree(src, real_dst, symlinks=True, overwrite=overwrite): - yield + for done in copytree(src, real_dst, symlinks=True, overwrite=overwrite): + yield done rmtree(src) else: - for _ in copy2(src, real_dst, symlinks=True, overwrite=overwrite): - yield + for done in copy2(src, real_dst, symlinks=True, overwrite=overwrite): + yield done os.unlink(src) def _destinsrc(src, dst): -- cgit 1.4.1-2-gfad0