diff options
Diffstat (limited to 'internal/gitaly/service/ref/find_all_tags.go')
-rw-r--r-- | internal/gitaly/service/ref/find_all_tags.go | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/internal/gitaly/service/ref/find_all_tags.go b/internal/gitaly/service/ref/find_all_tags.go index e7667d349..43d36eb06 100644 --- a/internal/gitaly/service/ref/find_all_tags.go +++ b/internal/gitaly/service/ref/find_all_tags.go @@ -28,16 +28,18 @@ func (s *server) FindAllTags(in *gitalypb.FindAllTagsRequest, stream gitalypb.Re return helper.ErrInvalidArgument(err) } + opts := buildPaginationOpts(ctx, in.GetPaginationParams()) + repo := s.localrepo(in.GetRepository()) - if err := s.findAllTags(ctx, repo, sortField, stream); err != nil { + if err := s.findAllTags(ctx, repo, sortField, stream, opts); err != nil { return helper.ErrInternal(err) } return nil } -func (s *server) findAllTags(ctx context.Context, repo *localrepo.Repo, sortField string, stream gitalypb.RefService_FindAllTagsServer) error { +func (s *server) findAllTags(ctx context.Context, repo *localrepo.Repo, sortField string, stream gitalypb.RefService_FindAllTagsServer, opts *paginationOpts) error { objectReader, err := s.catfileCache.ObjectReader(ctx, repo) if err != nil { return fmt.Errorf("error creating object reader: %v", err) @@ -50,9 +52,21 @@ func (s *server) findAllTags(ctx context.Context, repo *localrepo.Repo, sortFiel chunker := chunk.New(&tagSender{stream: stream}) + // If `PageToken` is not provided, then `IsPageToken` will always return `true` + // and disable pagination logic. If `PageToken` is set, then we will skip all tags + // until we reach the tag equal to `PageToken`. After that, tags will be returned + // as usual. + pastPageToken := opts.IsPageToken([]byte{}) + limit := opts.Limit + i := 0 + for catfileObjectsIter.Next() { tag := catfileObjectsIter.Result() + if i >= limit { + break + } + var result *gitalypb.Tag switch tag.ObjectInfo.Type { case "tag": @@ -111,9 +125,20 @@ func (s *server) findAllTags(ctx context.Context, repo *localrepo.Repo, sortFiel result.Name = tagName } + if !pastPageToken { + pastPageToken = opts.IsPageToken(tag.ObjectName) + continue + } + if err := chunker.Send(result); err != nil { return fmt.Errorf("sending tag: %w", err) } + + i++ + } + + if !pastPageToken { + return helper.ErrInvalidArgumentf("could not find page token") } if err := catfileObjectsIter.Err(); err != nil { |