Skip to content

Commit cecd9da

Browse files
Fix fetching paginated results with a filter.
Filters mean that pagination isn't handled for you.
1 parent 8da25b5 commit cecd9da

File tree

1 file changed

+29
-16
lines changed
  • src/clusterfuzz/_internal/google_cloud_utils

1 file changed

+29
-16
lines changed

src/clusterfuzz/_internal/google_cloud_utils/storage.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,6 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
237237

238238
client = _storage_client()
239239
bucket = client.bucket(bucket_name)
240-
properties = {}
241240

242241
if recursive:
243242
delimiter = None
@@ -249,23 +248,37 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
249248
else:
250249
fields = None
251250

252-
iterator = bucket.list_blobs(
253-
prefix=path, delimiter=delimiter, fields=fields)
254-
for blob in iterator:
255-
properties['bucket'] = bucket_name
256-
properties['name'] = blob.name
257-
properties['updated'] = blob.updated
258-
properties['size'] = blob.size
259-
260-
yield properties
261-
262-
if not recursive:
263-
# When doing delimiter listings, the "directories" will be in `prefixes`.
264-
for prefix in iterator.prefixes:
265-
properties['bucket'] = bucket_name
266-
properties['name'] = prefix
251+
iterations = 0
252+
while True:
253+
iterations += 1
254+
iterator = bucket.list_blobs(
255+
prefix=path, delimiter=delimiter, fields=fields)
256+
for blob in iterator:
257+
properties = {
258+
'bucket': bucket_name,
259+
'name': blob.name,
260+
'updated': blob.updated,
261+
'size': blob.size,
262+
}
263+
267264
yield properties
268265

266+
if not recursive:
267+
# When doing delimiter listings, the "directories" will be in
268+
# `prefixes`.
269+
for prefix in iterator.prefixes:
270+
properties = {
271+
'bucket': bucket_name,
272+
'name': prefix,
273+
}
274+
yield properties
275+
276+
next_page_token = iterator.next_page_token
277+
if next_page_token is None:
278+
break
279+
if iterations % 50 == 0:
280+
logs.error('Might be infinite looping.')
281+
269282
def copy_file_from(self, remote_path, local_path):
270283
"""Copy file from a remote path to a local path."""
271284
client = _storage_client()

0 commit comments

Comments
 (0)