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... | ... |
@@ -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 |