diff options
author | John Cai <jcai@gitlab.com> | 2022-03-30 03:08:57 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2022-03-31 23:14:19 +0300 |
commit | 0072c7f30ff7b78991d88148da64fdd7e663b6df (patch) | |
tree | 823b82f5c7cfa891c798b6c59fceae9747bf69bd | |
parent | f319294b959b4cb8e9a35a330d3831c1216029f7 (diff) |
commit: Add CheckObjectsExist RPCjc-filter-nonexisting-revisions
When pushing commits to a repository, access checks are run. In order to
use the quarantine directory, we need a way to filter out revisions that
a repository already has in the case that a packfile sends over objects
that already exists on the server. In this case, we don't need to check
the access.
Add an RPC that when given a list of revisions, returns the ones that
already exist in the repository, and the ones that do not exist in the
repository.
Changelog: added
-rw-r--r-- | internal/gitaly/service/commit/check_objects_exist.go | 88 | ||||
-rw-r--r-- | internal/gitaly/service/commit/check_objects_exist_test.go | 117 | ||||
-rw-r--r-- | proto/commit.proto | 27 | ||||
-rw-r--r-- | proto/go/gitalypb/commit.pb.go | 663 | ||||
-rw-r--r-- | proto/go/gitalypb/commit_grpc.pb.go | 76 | ||||
-rw-r--r-- | ruby/proto/gitaly/commit_pb.rb | 10 | ||||
-rw-r--r-- | ruby/proto/gitaly/commit_services_pb.rb | 5 |
7 files changed, 738 insertions, 248 deletions
diff --git a/internal/gitaly/service/commit/check_objects_exist.go b/internal/gitaly/service/commit/check_objects_exist.go new file mode 100644 index 000000000..1d15730e8 --- /dev/null +++ b/internal/gitaly/service/commit/check_objects_exist.go @@ -0,0 +1,88 @@ +package commit + +import ( + "context" + "io" + + "gitlab.com/gitlab-org/gitaly/v14/internal/git" + "gitlab.com/gitlab-org/gitaly/v14/internal/git/catfile" + "gitlab.com/gitlab-org/gitaly/v14/internal/helper" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" +) + +func (s *server) CheckObjectsExist( + stream gitalypb.CommitService_CheckObjectsExistServer, +) error { + ctx := stream.Context() + firstRequest := true + var objectInfoReader catfile.ObjectInfoReader + var request *gitalypb.CheckObjectsExistRequest + + for { + request, err := stream.Recv() + if err != nil { + if err == io.EOF { + break + } + return err + } + + if firstRequest { + firstRequest = false + if err := validateCheckObjectsExistRequest(request); err != nil { + return err + } + + repo := s.localrepo(request.GetRepository()) + + if objectInfoReader, err = s.catfileCache.ObjectInfoReader(ctx, repo); err != nil { + return err + } + } + + if err = checkObjectsExist(ctx, request, objectInfoReader, stream); err != nil { + return err + } + } + + return checkObjectsExist(ctx, request, objectInfoReader, stream) +} + +func checkObjectsExist( + ctx context.Context, + request *gitalypb.CheckObjectsExistRequest, + objectInfoReader catfile.ObjectInfoReader, + stream gitalypb.CommitService_CheckObjectsExistServer, +) error { + var existingRevisions, missingRevisions [][]byte + + revisions := request.GetRevisions() + + for _, revision := range revisions { + _, err := objectInfoReader.Info(ctx, git.Revision(revision)) + if err != nil { + if catfile.IsNotFound(err) { + missingRevisions = append(missingRevisions, revision) + continue + } + + return err + } + existingRevisions = append(existingRevisions, revision) + } + + return stream.Send(&gitalypb.CheckObjectsExistResponse{ + ExistingRevisions: existingRevisions, + MissingRevisions: missingRevisions, + }) +} + +func validateCheckObjectsExistRequest(in *gitalypb.CheckObjectsExistRequest) error { + for _, revision := range in.GetRevisions() { + if err := git.ValidateRevision(revision); err != nil { + return helper.ErrInvalidArgument(err) + } + } + + return nil +} diff --git a/internal/gitaly/service/commit/check_objects_exist_test.go b/internal/gitaly/service/commit/check_objects_exist_test.go new file mode 100644 index 000000000..518559ba9 --- /dev/null +++ b/internal/gitaly/service/commit/check_objects_exist_test.go @@ -0,0 +1,117 @@ +package commit + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" + "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" + "google.golang.org/grpc/codes" +) + +func TestListExistingObjects(t *testing.T) { + t.Parallel() + + ctx := testhelper.Context(t) + cfg, repo, repoPath, client := setupCommitServiceWithRepo(ctx, t, true) + + // write a few commitIDs we can use + commitID1 := gittest.WriteCommit(t, cfg, repoPath) + commitID2 := gittest.WriteCommit(t, cfg, repoPath) + commitID3 := gittest.WriteCommit(t, cfg, repoPath) + + // remove a ref from the repository so we know it doesn't exist + gittest.Exec(t, cfg, "-C", repoPath, "update-ref", "-d", "refs/heads/many_files") + + nonexistingObject := "abcdefg" + cmd := gittest.NewCommand(t, cfg, "-C", repoPath, "rev-parse", nonexistingObject) + require.Error(t, cmd.Wait(), "ensure the object doesn't exist") + + testCases := []struct { + desc string + input [][]byte + expectedExists [][]byte + expectedMissing [][]byte + returnCode codes.Code + }{ + { + desc: "commit ids and refs that exist", + input: [][]byte{ + []byte(commitID1), + []byte("master"), + []byte(commitID2), + []byte(commitID3), + []byte("feature"), + }, + expectedExists: [][]byte{ + []byte(commitID1), + []byte("master"), + []byte(commitID2), + []byte(commitID3), + []byte("feature"), + }, + returnCode: codes.OK, + }, + { + desc: "ref and objects missing", + input: [][]byte{ + []byte(commitID1), + []byte("master"), + []byte(commitID2), + []byte(commitID3), + []byte("feature"), + []byte("many_files"), + []byte(nonexistingObject), + }, + expectedExists: [][]byte{ + []byte(commitID1), + []byte("master"), + []byte(commitID2), + []byte(commitID3), + []byte("feature"), + }, + expectedMissing: [][]byte{ + []byte("many_files"), + []byte(nonexistingObject), + }, + returnCode: codes.OK, + }, + { + desc: "empty input", + input: [][]byte{}, + returnCode: codes.OK, + }, + { + desc: "invalid input", + input: [][]byte{[]byte("-not-a-rev")}, + returnCode: codes.InvalidArgument, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + c, err := client.CheckObjectsExist(ctx) + require.NoError(t, err) + + require.NoError(t, c.Send( + &gitalypb.CheckObjectsExistRequest{ + Repository: repo, + Revisions: tc.input, + }, + )) + require.NoError(t, c.CloseSend()) + + resp, err := c.Recv() + if tc.returnCode != codes.OK { + testhelper.RequireGrpcCode(t, err, tc.returnCode) + } else { + require.NoError(t, err) + } + + assert.Equal(t, tc.expectedExists, resp.GetExistingRevisions()) + assert.Equal(t, tc.expectedMissing, resp.GetMissingRevisions()) + }) + } +} diff --git a/proto/commit.proto b/proto/commit.proto index 4c9f3fe1d..d0d320296 100644 --- a/proto/commit.proto +++ b/proto/commit.proto @@ -130,6 +130,16 @@ service CommitService { op: ACCESSOR }; } + + // CheckObjectsExist will check for the existence of revisions against a + // repository. It returns two sets of data. An array containing the revisions + // fromm the input that it found on the repository, and an array that contains all + // revisions from the input it did not find on the repository. + rpc CheckObjectsExist(stream CheckObjectsExistRequest) returns (stream CheckObjectsExistResponse) { + option (op_type) = { + op: ACCESSOR + }; + } } // ListCommitsRequest is a request for the ListCommits RPC. @@ -562,3 +572,20 @@ message GetCommitMessagesResponse { string commit_id = 1; bytes message = 2; } + +// CheckObjectsExistRequest is a request for the CheckObjectsExist RPC. +message CheckObjectsExistRequest { + // Repository is the repository in which existence of objects and refs + // are checked. + Repository repository = 1 [(target_repository)=true]; + // Revisions contains the revisions that shall be checked for existence. This accepts all revisions + // as documented in gitrevisions(7) + repeated bytes revisions = 2; +} + +message CheckObjectsExistResponse { + // ExistingRevisions are revisions that exist in the repository + repeated bytes existing_revisions = 1; + // MissingRevisions are revisions that do not exist in the repository + repeated bytes missing_revisions = 2; +} diff --git a/proto/go/gitalypb/commit.pb.go b/proto/go/gitalypb/commit.pb.go index 3b9eccbad..a535abca3 100644 --- a/proto/go/gitalypb/commit.pb.go +++ b/proto/go/gitalypb/commit.pb.go @@ -3391,6 +3391,123 @@ func (x *GetCommitMessagesResponse) GetMessage() []byte { return nil } +// CheckObjectsExistRequest is a request for the CheckObjectsExist RPC. +type CheckObjectsExistRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Repository is the repository in which existence of objects and refs + // are checked. + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + // Revisions contains the revisions that shall be checked for existence. This accepts all revisions + // as documented in gitrevisions(7) + Revisions [][]byte `protobuf:"bytes,2,rep,name=revisions,proto3" json:"revisions,omitempty"` +} + +func (x *CheckObjectsExistRequest) Reset() { + *x = CheckObjectsExistRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_commit_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckObjectsExistRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckObjectsExistRequest) ProtoMessage() {} + +func (x *CheckObjectsExistRequest) ProtoReflect() protoreflect.Message { + mi := &file_commit_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckObjectsExistRequest.ProtoReflect.Descriptor instead. +func (*CheckObjectsExistRequest) Descriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{47} +} + +func (x *CheckObjectsExistRequest) GetRepository() *Repository { + if x != nil { + return x.Repository + } + return nil +} + +func (x *CheckObjectsExistRequest) GetRevisions() [][]byte { + if x != nil { + return x.Revisions + } + return nil +} + +type CheckObjectsExistResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ExistingRevisions are revisions that exist in the repository + ExistingRevisions [][]byte `protobuf:"bytes,1,rep,name=existing_revisions,json=existingRevisions,proto3" json:"existing_revisions,omitempty"` + // MissingRevisions are revisions that do not exist in the repository + MissingRevisions [][]byte `protobuf:"bytes,2,rep,name=missing_revisions,json=missingRevisions,proto3" json:"missing_revisions,omitempty"` +} + +func (x *CheckObjectsExistResponse) Reset() { + *x = CheckObjectsExistResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_commit_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckObjectsExistResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckObjectsExistResponse) ProtoMessage() {} + +func (x *CheckObjectsExistResponse) ProtoReflect() protoreflect.Message { + mi := &file_commit_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckObjectsExistResponse.ProtoReflect.Descriptor instead. +func (*CheckObjectsExistResponse) Descriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{48} +} + +func (x *CheckObjectsExistResponse) GetExistingRevisions() [][]byte { + if x != nil { + return x.ExistingRevisions + } + return nil +} + +func (x *CheckObjectsExistResponse) GetMissingRevisions() [][]byte { + if x != nil { + return x.MissingRevisions + } + return nil +} + type ListCommitsByRefNameResponse_CommitForRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3403,7 +3520,7 @@ type ListCommitsByRefNameResponse_CommitForRef struct { func (x *ListCommitsByRefNameResponse_CommitForRef) Reset() { *x = ListCommitsByRefNameResponse_CommitForRef{} if protoimpl.UnsafeEnabled { - mi := &file_commit_proto_msgTypes[47] + mi := &file_commit_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3416,7 +3533,7 @@ func (x *ListCommitsByRefNameResponse_CommitForRef) String() string { func (*ListCommitsByRefNameResponse_CommitForRef) ProtoMessage() {} func (x *ListCommitsByRefNameResponse_CommitForRef) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[47] + mi := &file_commit_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3461,7 +3578,7 @@ type CommitLanguagesResponse_Language struct { func (x *CommitLanguagesResponse_Language) Reset() { *x = CommitLanguagesResponse_Language{} if protoimpl.UnsafeEnabled { - mi := &file_commit_proto_msgTypes[48] + mi := &file_commit_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3474,7 +3591,7 @@ func (x *CommitLanguagesResponse_Language) String() string { func (*CommitLanguagesResponse_Language) ProtoMessage() {} func (x *CommitLanguagesResponse_Language) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[48] + mi := &file_commit_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3537,7 +3654,7 @@ type ListLastCommitsForTreeResponse_CommitForTree struct { func (x *ListLastCommitsForTreeResponse_CommitForTree) Reset() { *x = ListLastCommitsForTreeResponse_CommitForTree{} if protoimpl.UnsafeEnabled { - mi := &file_commit_proto_msgTypes[49] + mi := &file_commit_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3550,7 +3667,7 @@ func (x *ListLastCommitsForTreeResponse_CommitForTree) String() string { func (*ListLastCommitsForTreeResponse_CommitForTree) ProtoMessage() {} func (x *ListLastCommitsForTreeResponse_CommitForTree) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[49] + mi := &file_commit_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4051,140 +4168,161 @@ var file_commit_proto_rawDesc = []byte{ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x8b, 0x10, - 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x50, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1a, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, - 0x01, 0x12, 0x59, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x10, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x49, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x49, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4a, 0x0a, 0x09, 0x54, - 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x54, 0x72, 0x65, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x6c, 0x0a, 0x15, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x59, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x02, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, - 0x4b, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4e, 0x0a, 0x0b, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x72, 0x0a, + 0x18, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x77, 0x0a, 0x19, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, + 0x0a, 0x12, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0xf1, 0x10, 0x0a, 0x0d, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x59, 0x0a, 0x0e, - 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1d, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x50, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x59, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, + 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x47, 0x0a, 0x08, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x61, 0x6d, - 0x65, 0x12, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x61, 0x77, 0x42, 0x6c, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x60, - 0x0a, 0x11, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x61, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x49, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x12, 0x1f, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x73, 0x41, + 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x73, + 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4a, 0x0a, 0x09, 0x54, 0x72, 0x65, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x54, + 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x6c, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, + 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x59, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, + 0x12, 0x4a, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x0a, + 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4e, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x59, 0x0a, 0x0e, 0x46, 0x69, 0x6e, + 0x64, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x30, 0x01, 0x12, 0x50, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x12, 0x47, 0x0a, 0x08, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x61, 0x6d, 0x65, 0x12, 0x17, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x52, 0x61, 0x77, 0x42, 0x6c, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x61, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x71, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, + 0x12, 0x5f, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, + 0x01, 0x12, 0x5f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x42, 0x79, 0x4f, 0x69, 0x64, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4f, 0x69, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4f, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, - 0x12, 0x71, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x65, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x02, 0x30, 0x01, 0x12, 0x5f, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, - 0x08, 0x02, 0x30, 0x01, 0x12, 0x5f, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x42, 0x79, 0x4f, 0x69, 0x64, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x4f, - 0x69, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, - 0x4f, 0x69, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, - 0x30, 0x01, 0x12, 0x79, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x27, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, - 0x61, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x68, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, + 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x42, + 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, + 0x79, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x73, 0x57, + 0x69, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x73, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x68, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, - 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, - 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x64, 0x0a, 0x11, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x42, 0x34, + 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, + 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, + 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4200,7 +4338,7 @@ func file_commit_proto_rawDescGZIP() []byte { } var file_commit_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_commit_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_commit_proto_msgTypes = make([]protoimpl.MessageInfo, 52) var file_commit_proto_goTypes = []interface{}{ (ListCommitsRequest_Order)(0), // 0: gitaly.ListCommitsRequest.Order (TreeEntryResponse_ObjectType)(0), // 1: gitaly.TreeEntryResponse.ObjectType @@ -4255,124 +4393,129 @@ var file_commit_proto_goTypes = []interface{}{ (*GetCommitSignaturesResponse)(nil), // 50: gitaly.GetCommitSignaturesResponse (*GetCommitMessagesRequest)(nil), // 51: gitaly.GetCommitMessagesRequest (*GetCommitMessagesResponse)(nil), // 52: gitaly.GetCommitMessagesResponse - (*ListCommitsByRefNameResponse_CommitForRef)(nil), // 53: gitaly.ListCommitsByRefNameResponse.CommitForRef - (*CommitLanguagesResponse_Language)(nil), // 54: gitaly.CommitLanguagesResponse.Language - (*ListLastCommitsForTreeResponse_CommitForTree)(nil), // 55: gitaly.ListLastCommitsForTreeResponse.CommitForTree - (*Repository)(nil), // 56: gitaly.Repository - (*PaginationParameter)(nil), // 57: gitaly.PaginationParameter - (*timestamppb.Timestamp)(nil), // 58: google.protobuf.Timestamp - (*GitCommit)(nil), // 59: gitaly.GitCommit - (*GlobalOptions)(nil), // 60: gitaly.GlobalOptions - (*PaginationCursor)(nil), // 61: gitaly.PaginationCursor + (*CheckObjectsExistRequest)(nil), // 53: gitaly.CheckObjectsExistRequest + (*CheckObjectsExistResponse)(nil), // 54: gitaly.CheckObjectsExistResponse + (*ListCommitsByRefNameResponse_CommitForRef)(nil), // 55: gitaly.ListCommitsByRefNameResponse.CommitForRef + (*CommitLanguagesResponse_Language)(nil), // 56: gitaly.CommitLanguagesResponse.Language + (*ListLastCommitsForTreeResponse_CommitForTree)(nil), // 57: gitaly.ListLastCommitsForTreeResponse.CommitForTree + (*Repository)(nil), // 58: gitaly.Repository + (*PaginationParameter)(nil), // 59: gitaly.PaginationParameter + (*timestamppb.Timestamp)(nil), // 60: google.protobuf.Timestamp + (*GitCommit)(nil), // 61: gitaly.GitCommit + (*GlobalOptions)(nil), // 62: gitaly.GlobalOptions + (*PaginationCursor)(nil), // 63: gitaly.PaginationCursor } var file_commit_proto_depIdxs = []int32{ - 56, // 0: gitaly.ListCommitsRequest.repository:type_name -> gitaly.Repository - 57, // 1: gitaly.ListCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter + 58, // 0: gitaly.ListCommitsRequest.repository:type_name -> gitaly.Repository + 59, // 1: gitaly.ListCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter 0, // 2: gitaly.ListCommitsRequest.order:type_name -> gitaly.ListCommitsRequest.Order - 58, // 3: gitaly.ListCommitsRequest.after:type_name -> google.protobuf.Timestamp - 58, // 4: gitaly.ListCommitsRequest.before:type_name -> google.protobuf.Timestamp - 59, // 5: gitaly.ListCommitsResponse.commits:type_name -> gitaly.GitCommit - 56, // 6: gitaly.ListAllCommitsRequest.repository:type_name -> gitaly.Repository - 57, // 7: gitaly.ListAllCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter - 59, // 8: gitaly.ListAllCommitsResponse.commits:type_name -> gitaly.GitCommit - 56, // 9: gitaly.CommitStatsRequest.repository:type_name -> gitaly.Repository - 56, // 10: gitaly.CommitIsAncestorRequest.repository:type_name -> gitaly.Repository - 56, // 11: gitaly.TreeEntryRequest.repository:type_name -> gitaly.Repository + 60, // 3: gitaly.ListCommitsRequest.after:type_name -> google.protobuf.Timestamp + 60, // 4: gitaly.ListCommitsRequest.before:type_name -> google.protobuf.Timestamp + 61, // 5: gitaly.ListCommitsResponse.commits:type_name -> gitaly.GitCommit + 58, // 6: gitaly.ListAllCommitsRequest.repository:type_name -> gitaly.Repository + 59, // 7: gitaly.ListAllCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter + 61, // 8: gitaly.ListAllCommitsResponse.commits:type_name -> gitaly.GitCommit + 58, // 9: gitaly.CommitStatsRequest.repository:type_name -> gitaly.Repository + 58, // 10: gitaly.CommitIsAncestorRequest.repository:type_name -> gitaly.Repository + 58, // 11: gitaly.TreeEntryRequest.repository:type_name -> gitaly.Repository 1, // 12: gitaly.TreeEntryResponse.type:type_name -> gitaly.TreeEntryResponse.ObjectType - 56, // 13: gitaly.CountCommitsRequest.repository:type_name -> gitaly.Repository - 58, // 14: gitaly.CountCommitsRequest.after:type_name -> google.protobuf.Timestamp - 58, // 15: gitaly.CountCommitsRequest.before:type_name -> google.protobuf.Timestamp - 60, // 16: gitaly.CountCommitsRequest.global_options:type_name -> gitaly.GlobalOptions - 56, // 17: gitaly.CountDivergingCommitsRequest.repository:type_name -> gitaly.Repository + 58, // 13: gitaly.CountCommitsRequest.repository:type_name -> gitaly.Repository + 60, // 14: gitaly.CountCommitsRequest.after:type_name -> google.protobuf.Timestamp + 60, // 15: gitaly.CountCommitsRequest.before:type_name -> google.protobuf.Timestamp + 62, // 16: gitaly.CountCommitsRequest.global_options:type_name -> gitaly.GlobalOptions + 58, // 17: gitaly.CountDivergingCommitsRequest.repository:type_name -> gitaly.Repository 2, // 18: gitaly.TreeEntry.type:type_name -> gitaly.TreeEntry.EntryType - 56, // 19: gitaly.GetTreeEntriesRequest.repository:type_name -> gitaly.Repository + 58, // 19: gitaly.GetTreeEntriesRequest.repository:type_name -> gitaly.Repository 3, // 20: gitaly.GetTreeEntriesRequest.sort:type_name -> gitaly.GetTreeEntriesRequest.SortBy - 57, // 21: gitaly.GetTreeEntriesRequest.pagination_params:type_name -> gitaly.PaginationParameter + 59, // 21: gitaly.GetTreeEntriesRequest.pagination_params:type_name -> gitaly.PaginationParameter 20, // 22: gitaly.GetTreeEntriesResponse.entries:type_name -> gitaly.TreeEntry - 61, // 23: gitaly.GetTreeEntriesResponse.pagination_cursor:type_name -> gitaly.PaginationCursor - 56, // 24: gitaly.ListFilesRequest.repository:type_name -> gitaly.Repository - 56, // 25: gitaly.FindCommitRequest.repository:type_name -> gitaly.Repository - 59, // 26: gitaly.FindCommitResponse.commit:type_name -> gitaly.GitCommit - 56, // 27: gitaly.ListCommitsByOidRequest.repository:type_name -> gitaly.Repository - 59, // 28: gitaly.ListCommitsByOidResponse.commits:type_name -> gitaly.GitCommit - 56, // 29: gitaly.ListCommitsByRefNameRequest.repository:type_name -> gitaly.Repository - 53, // 30: gitaly.ListCommitsByRefNameResponse.commit_refs:type_name -> gitaly.ListCommitsByRefNameResponse.CommitForRef - 56, // 31: gitaly.FindAllCommitsRequest.repository:type_name -> gitaly.Repository + 63, // 23: gitaly.GetTreeEntriesResponse.pagination_cursor:type_name -> gitaly.PaginationCursor + 58, // 24: gitaly.ListFilesRequest.repository:type_name -> gitaly.Repository + 58, // 25: gitaly.FindCommitRequest.repository:type_name -> gitaly.Repository + 61, // 26: gitaly.FindCommitResponse.commit:type_name -> gitaly.GitCommit + 58, // 27: gitaly.ListCommitsByOidRequest.repository:type_name -> gitaly.Repository + 61, // 28: gitaly.ListCommitsByOidResponse.commits:type_name -> gitaly.GitCommit + 58, // 29: gitaly.ListCommitsByRefNameRequest.repository:type_name -> gitaly.Repository + 55, // 30: gitaly.ListCommitsByRefNameResponse.commit_refs:type_name -> gitaly.ListCommitsByRefNameResponse.CommitForRef + 58, // 31: gitaly.FindAllCommitsRequest.repository:type_name -> gitaly.Repository 4, // 32: gitaly.FindAllCommitsRequest.order:type_name -> gitaly.FindAllCommitsRequest.Order - 59, // 33: gitaly.FindAllCommitsResponse.commits:type_name -> gitaly.GitCommit - 56, // 34: gitaly.FindCommitsRequest.repository:type_name -> gitaly.Repository - 58, // 35: gitaly.FindCommitsRequest.after:type_name -> google.protobuf.Timestamp - 58, // 36: gitaly.FindCommitsRequest.before:type_name -> google.protobuf.Timestamp + 61, // 33: gitaly.FindAllCommitsResponse.commits:type_name -> gitaly.GitCommit + 58, // 34: gitaly.FindCommitsRequest.repository:type_name -> gitaly.Repository + 60, // 35: gitaly.FindCommitsRequest.after:type_name -> google.protobuf.Timestamp + 60, // 36: gitaly.FindCommitsRequest.before:type_name -> google.protobuf.Timestamp 5, // 37: gitaly.FindCommitsRequest.order:type_name -> gitaly.FindCommitsRequest.Order - 60, // 38: gitaly.FindCommitsRequest.global_options:type_name -> gitaly.GlobalOptions - 59, // 39: gitaly.FindCommitsResponse.commits:type_name -> gitaly.GitCommit - 56, // 40: gitaly.CommitLanguagesRequest.repository:type_name -> gitaly.Repository - 54, // 41: gitaly.CommitLanguagesResponse.languages:type_name -> gitaly.CommitLanguagesResponse.Language - 56, // 42: gitaly.RawBlameRequest.repository:type_name -> gitaly.Repository - 56, // 43: gitaly.LastCommitForPathRequest.repository:type_name -> gitaly.Repository - 60, // 44: gitaly.LastCommitForPathRequest.global_options:type_name -> gitaly.GlobalOptions - 59, // 45: gitaly.LastCommitForPathResponse.commit:type_name -> gitaly.GitCommit - 56, // 46: gitaly.ListLastCommitsForTreeRequest.repository:type_name -> gitaly.Repository - 60, // 47: gitaly.ListLastCommitsForTreeRequest.global_options:type_name -> gitaly.GlobalOptions - 55, // 48: gitaly.ListLastCommitsForTreeResponse.commits:type_name -> gitaly.ListLastCommitsForTreeResponse.CommitForTree - 56, // 49: gitaly.CommitsByMessageRequest.repository:type_name -> gitaly.Repository - 60, // 50: gitaly.CommitsByMessageRequest.global_options:type_name -> gitaly.GlobalOptions - 59, // 51: gitaly.CommitsByMessageResponse.commits:type_name -> gitaly.GitCommit - 56, // 52: gitaly.FilterShasWithSignaturesRequest.repository:type_name -> gitaly.Repository - 56, // 53: gitaly.ExtractCommitSignatureRequest.repository:type_name -> gitaly.Repository - 56, // 54: gitaly.GetCommitSignaturesRequest.repository:type_name -> gitaly.Repository - 56, // 55: gitaly.GetCommitMessagesRequest.repository:type_name -> gitaly.Repository - 59, // 56: gitaly.ListCommitsByRefNameResponse.CommitForRef.commit:type_name -> gitaly.GitCommit - 59, // 57: gitaly.ListLastCommitsForTreeResponse.CommitForTree.commit:type_name -> gitaly.GitCommit - 6, // 58: gitaly.CommitService.ListCommits:input_type -> gitaly.ListCommitsRequest - 8, // 59: gitaly.CommitService.ListAllCommits:input_type -> gitaly.ListAllCommitsRequest - 12, // 60: gitaly.CommitService.CommitIsAncestor:input_type -> gitaly.CommitIsAncestorRequest - 14, // 61: gitaly.CommitService.TreeEntry:input_type -> gitaly.TreeEntryRequest - 16, // 62: gitaly.CommitService.CountCommits:input_type -> gitaly.CountCommitsRequest - 18, // 63: gitaly.CommitService.CountDivergingCommits:input_type -> gitaly.CountDivergingCommitsRequest - 21, // 64: gitaly.CommitService.GetTreeEntries:input_type -> gitaly.GetTreeEntriesRequest - 23, // 65: gitaly.CommitService.ListFiles:input_type -> gitaly.ListFilesRequest - 25, // 66: gitaly.CommitService.FindCommit:input_type -> gitaly.FindCommitRequest - 10, // 67: gitaly.CommitService.CommitStats:input_type -> gitaly.CommitStatsRequest - 31, // 68: gitaly.CommitService.FindAllCommits:input_type -> gitaly.FindAllCommitsRequest - 33, // 69: gitaly.CommitService.FindCommits:input_type -> gitaly.FindCommitsRequest - 35, // 70: gitaly.CommitService.CommitLanguages:input_type -> gitaly.CommitLanguagesRequest - 37, // 71: gitaly.CommitService.RawBlame:input_type -> gitaly.RawBlameRequest - 39, // 72: gitaly.CommitService.LastCommitForPath:input_type -> gitaly.LastCommitForPathRequest - 41, // 73: gitaly.CommitService.ListLastCommitsForTree:input_type -> gitaly.ListLastCommitsForTreeRequest - 43, // 74: gitaly.CommitService.CommitsByMessage:input_type -> gitaly.CommitsByMessageRequest - 27, // 75: gitaly.CommitService.ListCommitsByOid:input_type -> gitaly.ListCommitsByOidRequest - 29, // 76: gitaly.CommitService.ListCommitsByRefName:input_type -> gitaly.ListCommitsByRefNameRequest - 45, // 77: gitaly.CommitService.FilterShasWithSignatures:input_type -> gitaly.FilterShasWithSignaturesRequest - 49, // 78: gitaly.CommitService.GetCommitSignatures:input_type -> gitaly.GetCommitSignaturesRequest - 51, // 79: gitaly.CommitService.GetCommitMessages:input_type -> gitaly.GetCommitMessagesRequest - 7, // 80: gitaly.CommitService.ListCommits:output_type -> gitaly.ListCommitsResponse - 9, // 81: gitaly.CommitService.ListAllCommits:output_type -> gitaly.ListAllCommitsResponse - 13, // 82: gitaly.CommitService.CommitIsAncestor:output_type -> gitaly.CommitIsAncestorResponse - 15, // 83: gitaly.CommitService.TreeEntry:output_type -> gitaly.TreeEntryResponse - 17, // 84: gitaly.CommitService.CountCommits:output_type -> gitaly.CountCommitsResponse - 19, // 85: gitaly.CommitService.CountDivergingCommits:output_type -> gitaly.CountDivergingCommitsResponse - 22, // 86: gitaly.CommitService.GetTreeEntries:output_type -> gitaly.GetTreeEntriesResponse - 24, // 87: gitaly.CommitService.ListFiles:output_type -> gitaly.ListFilesResponse - 26, // 88: gitaly.CommitService.FindCommit:output_type -> gitaly.FindCommitResponse - 11, // 89: gitaly.CommitService.CommitStats:output_type -> gitaly.CommitStatsResponse - 32, // 90: gitaly.CommitService.FindAllCommits:output_type -> gitaly.FindAllCommitsResponse - 34, // 91: gitaly.CommitService.FindCommits:output_type -> gitaly.FindCommitsResponse - 36, // 92: gitaly.CommitService.CommitLanguages:output_type -> gitaly.CommitLanguagesResponse - 38, // 93: gitaly.CommitService.RawBlame:output_type -> gitaly.RawBlameResponse - 40, // 94: gitaly.CommitService.LastCommitForPath:output_type -> gitaly.LastCommitForPathResponse - 42, // 95: gitaly.CommitService.ListLastCommitsForTree:output_type -> gitaly.ListLastCommitsForTreeResponse - 44, // 96: gitaly.CommitService.CommitsByMessage:output_type -> gitaly.CommitsByMessageResponse - 28, // 97: gitaly.CommitService.ListCommitsByOid:output_type -> gitaly.ListCommitsByOidResponse - 30, // 98: gitaly.CommitService.ListCommitsByRefName:output_type -> gitaly.ListCommitsByRefNameResponse - 46, // 99: gitaly.CommitService.FilterShasWithSignatures:output_type -> gitaly.FilterShasWithSignaturesResponse - 50, // 100: gitaly.CommitService.GetCommitSignatures:output_type -> gitaly.GetCommitSignaturesResponse - 52, // 101: gitaly.CommitService.GetCommitMessages:output_type -> gitaly.GetCommitMessagesResponse - 80, // [80:102] is the sub-list for method output_type - 58, // [58:80] is the sub-list for method input_type - 58, // [58:58] is the sub-list for extension type_name - 58, // [58:58] is the sub-list for extension extendee - 0, // [0:58] is the sub-list for field type_name + 62, // 38: gitaly.FindCommitsRequest.global_options:type_name -> gitaly.GlobalOptions + 61, // 39: gitaly.FindCommitsResponse.commits:type_name -> gitaly.GitCommit + 58, // 40: gitaly.CommitLanguagesRequest.repository:type_name -> gitaly.Repository + 56, // 41: gitaly.CommitLanguagesResponse.languages:type_name -> gitaly.CommitLanguagesResponse.Language + 58, // 42: gitaly.RawBlameRequest.repository:type_name -> gitaly.Repository + 58, // 43: gitaly.LastCommitForPathRequest.repository:type_name -> gitaly.Repository + 62, // 44: gitaly.LastCommitForPathRequest.global_options:type_name -> gitaly.GlobalOptions + 61, // 45: gitaly.LastCommitForPathResponse.commit:type_name -> gitaly.GitCommit + 58, // 46: gitaly.ListLastCommitsForTreeRequest.repository:type_name -> gitaly.Repository + 62, // 47: gitaly.ListLastCommitsForTreeRequest.global_options:type_name -> gitaly.GlobalOptions + 57, // 48: gitaly.ListLastCommitsForTreeResponse.commits:type_name -> gitaly.ListLastCommitsForTreeResponse.CommitForTree + 58, // 49: gitaly.CommitsByMessageRequest.repository:type_name -> gitaly.Repository + 62, // 50: gitaly.CommitsByMessageRequest.global_options:type_name -> gitaly.GlobalOptions + 61, // 51: gitaly.CommitsByMessageResponse.commits:type_name -> gitaly.GitCommit + 58, // 52: gitaly.FilterShasWithSignaturesRequest.repository:type_name -> gitaly.Repository + 58, // 53: gitaly.ExtractCommitSignatureRequest.repository:type_name -> gitaly.Repository + 58, // 54: gitaly.GetCommitSignaturesRequest.repository:type_name -> gitaly.Repository + 58, // 55: gitaly.GetCommitMessagesRequest.repository:type_name -> gitaly.Repository + 58, // 56: gitaly.CheckObjectsExistRequest.repository:type_name -> gitaly.Repository + 61, // 57: gitaly.ListCommitsByRefNameResponse.CommitForRef.commit:type_name -> gitaly.GitCommit + 61, // 58: gitaly.ListLastCommitsForTreeResponse.CommitForTree.commit:type_name -> gitaly.GitCommit + 6, // 59: gitaly.CommitService.ListCommits:input_type -> gitaly.ListCommitsRequest + 8, // 60: gitaly.CommitService.ListAllCommits:input_type -> gitaly.ListAllCommitsRequest + 12, // 61: gitaly.CommitService.CommitIsAncestor:input_type -> gitaly.CommitIsAncestorRequest + 14, // 62: gitaly.CommitService.TreeEntry:input_type -> gitaly.TreeEntryRequest + 16, // 63: gitaly.CommitService.CountCommits:input_type -> gitaly.CountCommitsRequest + 18, // 64: gitaly.CommitService.CountDivergingCommits:input_type -> gitaly.CountDivergingCommitsRequest + 21, // 65: gitaly.CommitService.GetTreeEntries:input_type -> gitaly.GetTreeEntriesRequest + 23, // 66: gitaly.CommitService.ListFiles:input_type -> gitaly.ListFilesRequest + 25, // 67: gitaly.CommitService.FindCommit:input_type -> gitaly.FindCommitRequest + 10, // 68: gitaly.CommitService.CommitStats:input_type -> gitaly.CommitStatsRequest + 31, // 69: gitaly.CommitService.FindAllCommits:input_type -> gitaly.FindAllCommitsRequest + 33, // 70: gitaly.CommitService.FindCommits:input_type -> gitaly.FindCommitsRequest + 35, // 71: gitaly.CommitService.CommitLanguages:input_type -> gitaly.CommitLanguagesRequest + 37, // 72: gitaly.CommitService.RawBlame:input_type -> gitaly.RawBlameRequest + 39, // 73: gitaly.CommitService.LastCommitForPath:input_type -> gitaly.LastCommitForPathRequest + 41, // 74: gitaly.CommitService.ListLastCommitsForTree:input_type -> gitaly.ListLastCommitsForTreeRequest + 43, // 75: gitaly.CommitService.CommitsByMessage:input_type -> gitaly.CommitsByMessageRequest + 27, // 76: gitaly.CommitService.ListCommitsByOid:input_type -> gitaly.ListCommitsByOidRequest + 29, // 77: gitaly.CommitService.ListCommitsByRefName:input_type -> gitaly.ListCommitsByRefNameRequest + 45, // 78: gitaly.CommitService.FilterShasWithSignatures:input_type -> gitaly.FilterShasWithSignaturesRequest + 49, // 79: gitaly.CommitService.GetCommitSignatures:input_type -> gitaly.GetCommitSignaturesRequest + 51, // 80: gitaly.CommitService.GetCommitMessages:input_type -> gitaly.GetCommitMessagesRequest + 53, // 81: gitaly.CommitService.CheckObjectsExist:input_type -> gitaly.CheckObjectsExistRequest + 7, // 82: gitaly.CommitService.ListCommits:output_type -> gitaly.ListCommitsResponse + 9, // 83: gitaly.CommitService.ListAllCommits:output_type -> gitaly.ListAllCommitsResponse + 13, // 84: gitaly.CommitService.CommitIsAncestor:output_type -> gitaly.CommitIsAncestorResponse + 15, // 85: gitaly.CommitService.TreeEntry:output_type -> gitaly.TreeEntryResponse + 17, // 86: gitaly.CommitService.CountCommits:output_type -> gitaly.CountCommitsResponse + 19, // 87: gitaly.CommitService.CountDivergingCommits:output_type -> gitaly.CountDivergingCommitsResponse + 22, // 88: gitaly.CommitService.GetTreeEntries:output_type -> gitaly.GetTreeEntriesResponse + 24, // 89: gitaly.CommitService.ListFiles:output_type -> gitaly.ListFilesResponse + 26, // 90: gitaly.CommitService.FindCommit:output_type -> gitaly.FindCommitResponse + 11, // 91: gitaly.CommitService.CommitStats:output_type -> gitaly.CommitStatsResponse + 32, // 92: gitaly.CommitService.FindAllCommits:output_type -> gitaly.FindAllCommitsResponse + 34, // 93: gitaly.CommitService.FindCommits:output_type -> gitaly.FindCommitsResponse + 36, // 94: gitaly.CommitService.CommitLanguages:output_type -> gitaly.CommitLanguagesResponse + 38, // 95: gitaly.CommitService.RawBlame:output_type -> gitaly.RawBlameResponse + 40, // 96: gitaly.CommitService.LastCommitForPath:output_type -> gitaly.LastCommitForPathResponse + 42, // 97: gitaly.CommitService.ListLastCommitsForTree:output_type -> gitaly.ListLastCommitsForTreeResponse + 44, // 98: gitaly.CommitService.CommitsByMessage:output_type -> gitaly.CommitsByMessageResponse + 28, // 99: gitaly.CommitService.ListCommitsByOid:output_type -> gitaly.ListCommitsByOidResponse + 30, // 100: gitaly.CommitService.ListCommitsByRefName:output_type -> gitaly.ListCommitsByRefNameResponse + 46, // 101: gitaly.CommitService.FilterShasWithSignatures:output_type -> gitaly.FilterShasWithSignaturesResponse + 50, // 102: gitaly.CommitService.GetCommitSignatures:output_type -> gitaly.GetCommitSignaturesResponse + 52, // 103: gitaly.CommitService.GetCommitMessages:output_type -> gitaly.GetCommitMessagesResponse + 54, // 104: gitaly.CommitService.CheckObjectsExist:output_type -> gitaly.CheckObjectsExistResponse + 82, // [82:105] is the sub-list for method output_type + 59, // [59:82] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_commit_proto_init() } @@ -4948,7 +5091,7 @@ func file_commit_proto_init() { } } file_commit_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListCommitsByRefNameResponse_CommitForRef); i { + switch v := v.(*CheckObjectsExistRequest); i { case 0: return &v.state case 1: @@ -4960,7 +5103,7 @@ func file_commit_proto_init() { } } file_commit_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommitLanguagesResponse_Language); i { + switch v := v.(*CheckObjectsExistResponse); i { case 0: return &v.state case 1: @@ -4972,6 +5115,30 @@ func file_commit_proto_init() { } } file_commit_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListCommitsByRefNameResponse_CommitForRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_commit_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommitLanguagesResponse_Language); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_commit_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLastCommitsForTreeResponse_CommitForTree); i { case 0: return &v.state @@ -4990,7 +5157,7 @@ func file_commit_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_commit_proto_rawDesc, NumEnums: 6, - NumMessages: 50, + NumMessages: 52, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gitalypb/commit_grpc.pb.go b/proto/go/gitalypb/commit_grpc.pb.go index 172f63975..0e1f603bd 100644 --- a/proto/go/gitalypb/commit_grpc.pb.go +++ b/proto/go/gitalypb/commit_grpc.pb.go @@ -46,6 +46,11 @@ type CommitServiceClient interface { FilterShasWithSignatures(ctx context.Context, opts ...grpc.CallOption) (CommitService_FilterShasWithSignaturesClient, error) GetCommitSignatures(ctx context.Context, in *GetCommitSignaturesRequest, opts ...grpc.CallOption) (CommitService_GetCommitSignaturesClient, error) GetCommitMessages(ctx context.Context, in *GetCommitMessagesRequest, opts ...grpc.CallOption) (CommitService_GetCommitMessagesClient, error) + // CheckObjectsExist will check for the existence of revisions against a + // repository. It returns two sets of data. An array containing the revisions + // fromm the input that it found on the repository, and an array that contains all + // revisions from the input it did not find on the repository. + CheckObjectsExist(ctx context.Context, opts ...grpc.CallOption) (CommitService_CheckObjectsExistClient, error) } type commitServiceClient struct { @@ -598,6 +603,37 @@ func (x *commitServiceGetCommitMessagesClient) Recv() (*GetCommitMessagesRespons return m, nil } +func (c *commitServiceClient) CheckObjectsExist(ctx context.Context, opts ...grpc.CallOption) (CommitService_CheckObjectsExistClient, error) { + stream, err := c.cc.NewStream(ctx, &CommitService_ServiceDesc.Streams[15], "/gitaly.CommitService/CheckObjectsExist", opts...) + if err != nil { + return nil, err + } + x := &commitServiceCheckObjectsExistClient{stream} + return x, nil +} + +type CommitService_CheckObjectsExistClient interface { + Send(*CheckObjectsExistRequest) error + Recv() (*CheckObjectsExistResponse, error) + grpc.ClientStream +} + +type commitServiceCheckObjectsExistClient struct { + grpc.ClientStream +} + +func (x *commitServiceCheckObjectsExistClient) Send(m *CheckObjectsExistRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *commitServiceCheckObjectsExistClient) Recv() (*CheckObjectsExistResponse, error) { + m := new(CheckObjectsExistResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // CommitServiceServer is the server API for CommitService service. // All implementations must embed UnimplementedCommitServiceServer // for forward compatibility @@ -630,6 +666,11 @@ type CommitServiceServer interface { FilterShasWithSignatures(CommitService_FilterShasWithSignaturesServer) error GetCommitSignatures(*GetCommitSignaturesRequest, CommitService_GetCommitSignaturesServer) error GetCommitMessages(*GetCommitMessagesRequest, CommitService_GetCommitMessagesServer) error + // CheckObjectsExist will check for the existence of revisions against a + // repository. It returns two sets of data. An array containing the revisions + // fromm the input that it found on the repository, and an array that contains all + // revisions from the input it did not find on the repository. + CheckObjectsExist(CommitService_CheckObjectsExistServer) error mustEmbedUnimplementedCommitServiceServer() } @@ -703,6 +744,9 @@ func (UnimplementedCommitServiceServer) GetCommitSignatures(*GetCommitSignatures func (UnimplementedCommitServiceServer) GetCommitMessages(*GetCommitMessagesRequest, CommitService_GetCommitMessagesServer) error { return status.Errorf(codes.Unimplemented, "method GetCommitMessages not implemented") } +func (UnimplementedCommitServiceServer) CheckObjectsExist(CommitService_CheckObjectsExistServer) error { + return status.Errorf(codes.Unimplemented, "method CheckObjectsExist not implemented") +} func (UnimplementedCommitServiceServer) mustEmbedUnimplementedCommitServiceServer() {} // UnsafeCommitServiceServer may be embedded to opt out of forward compatibility for this service. @@ -1162,6 +1206,32 @@ func (x *commitServiceGetCommitMessagesServer) Send(m *GetCommitMessagesResponse return x.ServerStream.SendMsg(m) } +func _CommitService_CheckObjectsExist_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(CommitServiceServer).CheckObjectsExist(&commitServiceCheckObjectsExistServer{stream}) +} + +type CommitService_CheckObjectsExistServer interface { + Send(*CheckObjectsExistResponse) error + Recv() (*CheckObjectsExistRequest, error) + grpc.ServerStream +} + +type commitServiceCheckObjectsExistServer struct { + grpc.ServerStream +} + +func (x *commitServiceCheckObjectsExistServer) Send(m *CheckObjectsExistResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *commitServiceCheckObjectsExistServer) Recv() (*CheckObjectsExistRequest, error) { + m := new(CheckObjectsExistRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // CommitService_ServiceDesc is the grpc.ServiceDesc for CommitService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1275,6 +1345,12 @@ var CommitService_ServiceDesc = grpc.ServiceDesc{ Handler: _CommitService_GetCommitMessages_Handler, ServerStreams: true, }, + { + StreamName: "CheckObjectsExist", + Handler: _CommitService_CheckObjectsExist_Handler, + ServerStreams: true, + ClientStreams: true, + }, }, Metadata: "commit.proto", } diff --git a/ruby/proto/gitaly/commit_pb.rb b/ruby/proto/gitaly/commit_pb.rb index 6af502fed..f64e95001 100644 --- a/ruby/proto/gitaly/commit_pb.rb +++ b/ruby/proto/gitaly/commit_pb.rb @@ -292,6 +292,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :commit_id, :string, 1 optional :message, :bytes, 2 end + add_message "gitaly.CheckObjectsExistRequest" do + optional :repository, :message, 1, "gitaly.Repository" + repeated :revisions, :bytes, 2 + end + add_message "gitaly.CheckObjectsExistResponse" do + repeated :existing_revisions, :bytes, 1 + repeated :missing_revisions, :bytes, 2 + end end end @@ -352,4 +360,6 @@ module Gitaly GetCommitSignaturesResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetCommitSignaturesResponse").msgclass GetCommitMessagesRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetCommitMessagesRequest").msgclass GetCommitMessagesResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetCommitMessagesResponse").msgclass + CheckObjectsExistRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.CheckObjectsExistRequest").msgclass + CheckObjectsExistResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.CheckObjectsExistResponse").msgclass end diff --git a/ruby/proto/gitaly/commit_services_pb.rb b/ruby/proto/gitaly/commit_services_pb.rb index 4d5f88641..131f84122 100644 --- a/ruby/proto/gitaly/commit_services_pb.rb +++ b/ruby/proto/gitaly/commit_services_pb.rb @@ -42,6 +42,11 @@ module Gitaly rpc :FilterShasWithSignatures, stream(::Gitaly::FilterShasWithSignaturesRequest), stream(::Gitaly::FilterShasWithSignaturesResponse) rpc :GetCommitSignatures, ::Gitaly::GetCommitSignaturesRequest, stream(::Gitaly::GetCommitSignaturesResponse) rpc :GetCommitMessages, ::Gitaly::GetCommitMessagesRequest, stream(::Gitaly::GetCommitMessagesResponse) + # CheckObjectsExist will check for the existence of revisions against a + # repository. It returns two sets of data. An array containing the revisions + # fromm the input that it found on the repository, and an array that contains all + # revisions from the input it did not find on the repository. + rpc :CheckObjectsExist, stream(::Gitaly::CheckObjectsExistRequest), stream(::Gitaly::CheckObjectsExistResponse) end Stub = Service.rpc_stub_class |