Browse code

* s3cmd, S3/S3.py, NEWS: Support for (non-)recursive 'ls'

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
Showing 4 changed files
... ...
@@ -1,3 +1,7 @@
1
+2008-12-02  Michal Ludvig  <michal@logix.cz>
2
+
3
+	* s3cmd, S3/S3.py, NEWS: Support for (non-)recursive 'ls'
4
+
1 5
 2008-12-01  Michal Ludvig  <michal@logix.cz>
2 6
 
3 7
 	* Released version 0.9.9-pre3
... ...
@@ -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" % (