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 a> 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220