git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@280 830e0280-6d2a-0410-9c65-932aecc39d9d
Michal Ludvig authored on 2008/12/01 22:07:32... | ... |
@@ -1,3 +1,13 @@ |
1 |
+s3cmd 0.9.9-pre4 |
|
2 |
+================ |
|
3 |
+* Support for non-recursive 'ls' |
|
4 |
+ |
|
5 |
+s3cmd 0.9.9-pre3 |
|
6 |
+================ |
|
7 |
+* Bugfixes only |
|
8 |
+ - Fixed sync from S3 to local |
|
9 |
+ - Fixed progress meter with Unicode chars |
|
10 |
+ |
|
1 | 11 |
s3cmd 0.9.9-pre2 |
2 | 12 |
================ |
3 | 13 |
* Implemented progress meter (--progress / --no-progress) |
... | ... |
@@ -114,20 +114,28 @@ class S3(object): |
114 | 114 |
def _get_contents(data): |
115 | 115 |
return getListFromXml(data, "Contents") |
116 | 116 |
|
117 |
- prefix = self.urlencode_string(prefix) |
|
118 |
- request = self.create_request("BUCKET_LIST", bucket = bucket, prefix = prefix) |
|
117 |
+ def _get_common_prefixes(data): |
|
118 |
+ return getListFromXml(data, "CommonPrefixes") |
|
119 |
+ |
|
120 |
+ uri_params = {} |
|
121 |
+ if prefix: |
|
122 |
+ uri_params['prefix'] = self.urlencode_string(prefix) |
|
123 |
+ if not self.config.recursive: |
|
124 |
+ uri_params['delimiter'] = "/" |
|
125 |
+ request = self.create_request("BUCKET_LIST", bucket = bucket, **uri_params) |
|
119 | 126 |
response = self.send_request(request) |
120 | 127 |
#debug(response) |
121 | 128 |
list = _get_contents(response["data"]) |
129 |
+ prefixes = _get_common_prefixes(response["data"]) |
|
122 | 130 |
while _list_truncated(response["data"]): |
123 |
- marker = list[-1]["Key"] |
|
131 |
+ uri_params['marker'] = self.urlencode_string(list[-1]["Key"]) |
|
124 | 132 |
debug("Listing continues after '%s'" % marker) |
125 |
- request = self.create_request("BUCKET_LIST", bucket = bucket, |
|
126 |
- prefix = prefix, |
|
127 |
- marker = self.urlencode_string(marker)) |
|
133 |
+ request = self.create_request("BUCKET_LIST", bucket = bucket, **uri_params) |
|
128 | 134 |
response = self.send_request(request) |
129 | 135 |
list += _get_contents(response["data"]) |
136 |
+ prefixes += _get_common_prefixes(response["data"]) |
|
130 | 137 |
response['list'] = list |
138 |
+ response['common_prefixes'] = prefixes |
|
131 | 139 |
return response |
132 | 140 |
|
133 | 141 |
def bucket_create(self, bucket, bucket_location = None): |
... | ... |
@@ -113,19 +113,25 @@ def subcmd_buckets_list_all(s3): |
113 | 113 |
|
114 | 114 |
def subcmd_bucket_list(s3, uri): |
115 | 115 |
bucket = uri.bucket() |
116 |
- object = uri.object() |
|
116 |
+ prefix = uri.object() |
|
117 | 117 |
|
118 | 118 |
debug("Bucket 's3://%s':" % bucket) |
119 |
- if object.endswith('*'): |
|
120 |
- object = object[:-1] |
|
119 |
+ if prefix.endswith('*'): |
|
120 |
+ prefix = prefix[:-1] |
|
121 | 121 |
try: |
122 |
- response = s3.bucket_list(bucket, prefix = object) |
|
122 |
+ response = s3.bucket_list(bucket, prefix = prefix) |
|
123 | 123 |
except S3Error, e: |
124 | 124 |
if S3.codes.has_key(e.info["Code"]): |
125 | 125 |
error(S3.codes[e.info["Code"]] % bucket) |
126 | 126 |
return |
127 | 127 |
else: |
128 | 128 |
raise |
129 |
+ |
|
130 |
+ for prefix in response['common_prefixes']: |
|
131 |
+ output("%s %s" % ( |
|
132 |
+ "D".rjust(28), |
|
133 |
+ uri.compose_uri(bucket, prefix["Prefix"]))) |
|
134 |
+ |
|
129 | 135 |
for object in response["list"]: |
130 | 136 |
size, size_coeff = formatSize(object["Size"], Config().human_readable_sizes) |
131 | 137 |
output("%s %s%s %s" % ( |