From 40edf00182b187653d8f626b3af644ebce2492f2 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 17 Sep 2017 11:08:51 +0200 Subject: [PATCH] gs: implement pagination --- internal/backend/gs/gs.go | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/internal/backend/gs/gs.go b/internal/backend/gs/gs.go index 743dd6d74..072f87ea4 100644 --- a/internal/backend/gs/gs.go +++ b/internal/backend/gs/gs.go @@ -298,22 +298,33 @@ func (be *Backend) List(ctx context.Context, t restic.FileType) <-chan string { go func() { defer close(ch) - obj, err := be.service.Objects.List(be.bucketName).Prefix(prefix).Do() - if err != nil { - return - } - - for _, item := range obj.Items { - m := strings.TrimPrefix(item.Name, prefix) - if m == "" { - continue - } - - select { - case ch <- path.Base(m): - case <-ctx.Done(): + listReq := be.service.Objects.List(be.bucketName).Prefix(prefix) + for { + obj, err := listReq.Do() + if err != nil { + fmt.Fprintf(os.Stderr, "error listing %v: %v\n", prefix, err) return } + + debug.Log("returned %v items", len(obj.Items)) + + for _, item := range obj.Items { + m := strings.TrimPrefix(item.Name, prefix) + if m == "" { + continue + } + + select { + case ch <- path.Base(m): + case <-ctx.Done(): + return + } + } + + if obj.NextPageToken == "" { + break + } + listReq.PageToken(obj.NextPageToken) } }()