Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'internal/gitaly/service/ref/find_all_tags.go')
-rw-r--r--internal/gitaly/service/ref/find_all_tags.go29
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 {