code: func (s *Storage) EnumerateBlobs(ctx context.Context, dest chan<- blob.SizedRef, after string, limit int) error {
  	defer close(dest)
  	ectx := context.WithValue(ctx, ctxutil.HTTPClient, s.baseHTTPClient)
  	objs, err := gcsutil.EnumerateObjects(ectx, s.bucket, s.dirPrefix+after, limit)
  	if err != nil {
  		log.Printf("gstorage EnumerateObjects: %v", err)
  		return err
  	}
  	for _, obj := range objs {
  		dir, file := path.Split(obj.Name)
  		if dir != s.dirPrefix {
  			continue
  		}
  		br, ok := blob.Parse(file)
  		if !ok {
  			return fmt.Errorf("Non-Perkeep object named %q found in bucket", file)
  		}
  		select {
  		case dest <- blob.SizedRef{Ref: br, Size: uint32(obj.Size)}:
  		case <-ctx.Done():
  			return ctx.Err()
  		}
  	}
  	return nil
  }
docs: // TODO(mpl, bradfitz): use a *storage.Client in EnumerateBlobs, instead of hitting the
  // XML API, once we have an efficient replacement for the "marker" from the XML API. See
  // https://github.com/GoogleCloudPlatform/gcloud-golang/issues/197