Browse code

* s3cmd, S3/S3.py, S3/Progress.py: Display "[X of Y]" in --progress mode.

git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@295 830e0280-6d2a-0410-9c65-932aecc39d9d

Michal Ludvig authored on 2008/12/22 10:54:14
Showing 4 changed files
... ...
@@ -1,5 +1,7 @@
1 1
 2008-12-22  Michal Ludvig  <michal@logix.cz>
2 2
 
3
+	* s3cmd, S3/S3.py, S3/Progress.py: Display "[X of Y]"
4
+	  in --progress mode.
3 5
 	* s3cmd, S3/Config.py: Implemented recursive [get].
4 6
 	  Added --skip-existing option for [get] and [sync]. 
5 7
 
... ...
@@ -44,7 +44,7 @@ class Progress(object):
44 44
 		self.display(done_message = message)
45 45
 
46 46
 	def output_labels(self):
47
-		self._stdout.write("%s -> %s\n" % (self.labels['source'], self.labels['destination']))
47
+		self._stdout.write("%(source)s -> %(destination)s  %(extra)s\n" % self.labels)
48 48
 		self._stdout.flush()
49 49
 
50 50
 	def display(self, new_file = False, done_message = None):
... ...
@@ -167,7 +167,7 @@ class S3(object):
167 167
 		response['bucket-location'] = getTextFromXml(response['data'], "LocationConstraint") or "any"
168 168
 		return response
169 169
 
170
-	def object_put(self, filename, uri, extra_headers = None):
170
+	def object_put(self, filename, uri, extra_headers = None, extra_label = ""):
171 171
 		# TODO TODO
172 172
 		# Make it consistent with stream-oriented object_get()
173 173
 		if uri.type != "s3":
... ...
@@ -194,15 +194,15 @@ class S3(object):
194 194
 		if self.config.acl_public:
195 195
 			headers["x-amz-acl"] = "public-read"
196 196
 		request = self.create_request("OBJECT_PUT", uri = uri, headers = headers)
197
-		labels = { 'source' : file.name, 'destination' : uri }
197
+		labels = { 'source' : file.name, 'destination' : uri, 'extra' : extra_label }
198 198
 		response = self.send_file(request, file, labels)
199 199
 		return response
200 200
 
201
-	def object_get(self, uri, stream, start_position = 0):
201
+	def object_get(self, uri, stream, start_position = 0, extra_label = ""):
202 202
 		if uri.type != "s3":
203 203
 			raise ValueError("Expected URI type 's3', got '%s'" % uri.type)
204 204
 		request = self.create_request("OBJECT_GET", uri = uri)
205
-		labels = { 'source' : uri, 'destination' : stream.name }
205
+		labels = { 'source' : uri, 'destination' : stream.name, 'extra' : extra_label }
206 206
 		response = self.recv_file(request, stream, labels, start_position)
207 207
 		return response
208 208
 
... ...
@@ -208,10 +208,11 @@ def cmd_object_put(args):
208 208
 		uri_final = S3Uri(uri_arg_final)
209 209
 		extra_headers = {}
210 210
 		real_filename = file
211
+		seq_label = "[%d of %d]" % (seq, total)
211 212
 		if Config().encrypt:
212 213
 			exitcode, real_filename, extra_headers["x-amz-meta-s3tools-gpgenc"] = gpg_encrypt(file)
213 214
 		try:
214
-			response = s3.object_put(real_filename, uri_final, extra_headers)
215
+			response = s3.object_put(real_filename, uri_final, extra_headers, extra_label = seq_label)
215 216
 		except S3UploadError, e:
216 217
 			error("Upload of '%s' failed too many times. Skipping that file." % real_filename)
217 218
 			continue
... ...
@@ -220,9 +221,9 @@ def cmd_object_put(args):
220 220
 			continue
221 221
 		speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True)
222 222
 		if not Config().progress_meter:
223
-			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) [%d of %d]" %
223
+			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" %
224 224
 				(file, uri_final, response["size"], response["elapsed"], speed_fmt[0], speed_fmt[1],
225
-				seq, total))
225
+				seq_label))
226 226
 		if Config().acl_public:
227 227
 			output("Public URL of the object is: %s" %
228 228
 				(uri_final.public_url()))
... ...
@@ -639,6 +640,7 @@ def cmd_sync_remote2local(src, dst):
639 639
 		seq += 1
640 640
 		uri = S3Uri(src_base + file)
641 641
 		dst_file = dst_base + file
642
+		seq_label = "[%d of %d]" % (seq, total_count)
642 643
 		try:
643 644
 			dst_dir = os.path.dirname(dst_file)
644 645
 			if not dir_cache.has_key(dst_dir):
... ...
@@ -658,7 +660,7 @@ def cmd_sync_remote2local(src, dst):
658 658
 				os.close(os.open(dst_file, open_flags))
659 659
 				# Yeah I know there is a race condition here. Sadly I don't know how to open() in exclusive mode.
660 660
 				dst_stream = open(dst_file, "wb")
661
-				response = s3.object_get(uri, dst_stream)
661
+				response = s3.object_get(uri, dst_stream, extra_label = seq_label)
662 662
 				dst_stream.close()
663 663
 				if response['headers'].has_key('x-amz-meta-s3cmd-attrs') and cfg.preserve_attrs:
664 664
 					attrs = _parse_attrs_header(response['headers']['x-amz-meta-s3cmd-attrs'])
... ...
@@ -699,9 +701,9 @@ def cmd_sync_remote2local(src, dst):
699 699
 			continue
700 700
 		speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True)
701 701
 		if not Config().progress_meter:
702
-			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) [%d of %d]" %
702
+			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" %
703 703
 				(uri, dst_file, response["size"], response["elapsed"], speed_fmt[0], speed_fmt[1],
704
-				seq, total_count))
704
+				seq_label))
705 705
 		total_size += response["size"]
706 706
 
707 707
 	total_elapsed = time.time() - timestamp_start
... ...
@@ -786,11 +788,12 @@ def cmd_sync_local2remote(src, dst):
786 786
 		seq += 1
787 787
 		src = loc_list[file]['full_name']
788 788
 		uri = S3Uri(dst_base + file)
789
+		seq_label = "[%d of %d]" % (seq, total_count)
789 790
 		if cfg.preserve_attrs:
790 791
 			attr_header = _build_attr_header(src)
791 792
 			debug(attr_header)
792 793
 		try:
793
-			response = s3.object_put(src, uri, attr_header)
794
+			response = s3.object_put(src, uri, attr_header, extra_label = seq_label)
794 795
 		except S3UploadError, e:
795 796
 			error("%s: upload failed too many times. Skipping that file." % src)
796 797
 			continue
... ...
@@ -799,9 +802,9 @@ def cmd_sync_local2remote(src, dst):
799 799
 			continue
800 800
 		speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True)
801 801
 		if not cfg.progress_meter:
802
-			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) [%d of %d]" %
802
+			output("File '%s' stored as %s (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" %
803 803
 				(src, uri, response["size"], response["elapsed"], speed_fmt[0], speed_fmt[1],
804
-				seq, total_count))
804
+				seq_label))
805 805
 		total_size += response["size"]
806 806
 
807 807
 	total_elapsed = time.time() - timestamp_start