// Repeatedly call bucket.ListObjects until there is nothing further to list, // returning all objects and collapsed runs encountered. // // May modify *req. func ListAll( ctx context.Context, bucket gcs.Bucket, req *gcs.ListObjectsRequest) ( objects []*gcs.Object, runs []string, err error) { for { // Grab one set of results. var listing *gcs.Listing if listing, err = bucket.ListObjects(ctx, req); err != nil { return } // Accumulate the results. objects = append(objects, listing.Objects...) runs = append(runs, listing.CollapsedRuns...) // Are we done? if listing.ContinuationToken == "" { break } req.ContinuationToken = listing.ContinuationToken } return }
// List the supplied object name prefix to find out whether it is non-empty. func objectNamePrefixNonEmpty( ctx context.Context, bucket gcs.Bucket, prefix string) (nonEmpty bool, err error) { req := &gcs.ListObjectsRequest{ Prefix: prefix, MaxResults: 1, } listing, err := bucket.ListObjects(ctx, req) if err != nil { err = fmt.Errorf("ListObjects: %v", err) return } nonEmpty = len(listing.Objects) != 0 return }
// List objects in the supplied bucket whose name starts with the given prefix. // Write them into the supplied channel in an undefined order. func ListPrefix( ctx context.Context, bucket gcs.Bucket, prefix string, objects chan<- *gcs.Object) (err error) { req := &gcs.ListObjectsRequest{ Prefix: prefix, } // List until we run out. for { // Fetch the next batch. var listing *gcs.Listing listing, err = bucket.ListObjects(ctx, req) if err != nil { err = fmt.Errorf("ListObjects: %v", err) return } // Pass on each object. for _, o := range listing.Objects { select { case objects <- o: // Cancelled? case <-ctx.Done(): err = ctx.Err() return } } // Are we done? if listing.ContinuationToken == "" { break } req.ContinuationToken = listing.ContinuationToken } return }