@@ -240,7 +240,6 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
240240
241241 client = _storage_client ()
242242 bucket = client .bucket (bucket_name )
243- properties = {}
244243
245244 if recursive :
246245 delimiter = None
@@ -252,23 +251,37 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
252251 else :
253252 fields = None
254253
255- iterator = bucket .list_blobs (
256- prefix = path , delimiter = delimiter , fields = fields )
257- for blob in iterator :
258- properties ['bucket' ] = bucket_name
259- properties ['name' ] = blob .name
260- properties ['updated' ] = blob .updated
261- properties ['size' ] = blob .size
262-
263- yield properties
264-
265- if not recursive :
266- # When doing delimiter listings, the "directories" will be in `prefixes`.
267- for prefix in iterator .prefixes :
268- properties ['bucket' ] = bucket_name
269- properties ['name' ] = prefix
254+ iterations = 0
255+ while True :
256+ iterations += 1
257+ iterator = bucket .list_blobs (
258+ prefix = path , delimiter = delimiter , fields = fields )
259+ for blob in iterator :
260+ properties = {
261+ 'bucket' : bucket_name ,
262+ 'name' : blob .name ,
263+ 'updated' : blob .updated ,
264+ 'size' : blob .size ,
265+ }
266+
270267 yield properties
271268
269+ if not recursive :
270+ # When doing delimiter listings, the "directories" will be in
271+ # `prefixes`.
272+ for prefix in iterator .prefixes :
273+ properties = {
274+ 'bucket' : bucket_name ,
275+ 'name' : prefix ,
276+ }
277+ yield properties
278+
279+ next_page_token = iterator .next_page_token
280+ if next_page_token is None :
281+ break
282+ if iterations and iterations % 50 == 0 :
283+ logs .error ('Might be infinite looping.' )
284+
272285 def copy_file_from (self , remote_path , local_path ):
273286 """Copy file from a remote path to a local path."""
274287 client = _storage_client ()
0 commit comments