summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/core/loader.py13
-rw-r--r--ranger/ext/shutil_generatorized.py34
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):
^
72707c2 ^


dba2306 ^
6b25d06 ^
e21d93b ^




61a1910 ^
e21d93b ^
e21d93b ^


c53d9d5 ^
e21d93b ^





c53d9d5 ^
e21d93b ^






d4b7a9a ^
ca65478 ^
d6a6eca ^
e21d93b ^
bcaf6a7 ^
aaad7bf ^
bcaf6a7 ^
adaa28a ^
aaad7bf ^




61a1910 ^
bcaf6a7 ^
d6a6eca ^
c53d9d5 ^
d6a6eca ^
e21d93b ^





adaa28a ^
bcaf6a7 ^
adaa28a ^




adaa28a ^
d7413ff ^
292ccc4 ^
adaa28a ^


ca65478 ^
19da197 ^



19da197 ^
42fd392 ^
7009ebf ^

5983c00 ^
19da197 ^


ca65478 ^
d7413ff ^

19da197 ^

19da197 ^



5983c00 ^
292ccc4 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133