diff --git a/internal/git/gitcmd/command_description.go b/internal/git/gitcmd/command_description.go index 33c9a8e4d2a1b803e0cdac5907ef5c7ed249969e..d1c8b9c8510819d706b4676bb196d7f86fb590bd 100644 --- a/internal/git/gitcmd/command_description.go +++ b/internal/git/gitcmd/command_description.go @@ -336,6 +336,11 @@ var commandDescriptions = map[string]commandDescription{ // `--verify`. flags: scNoRefUpdates | scNoEndOfOptions, }, + "shortlog": { + // git-shortlog(1) summarizes git log output, grouping commits by author/committer. + // It never updates refs. + flags: scNoRefUpdates, + }, "show": { flags: scNoRefUpdates, }, diff --git a/internal/gitaly/service/commit/contributors_sender.go b/internal/gitaly/service/commit/contributors_sender.go new file mode 100644 index 0000000000000000000000000000000000000000..ded84e03c6b695bf9fb2d8bdbd458c9dcb5213e0 --- /dev/null +++ b/internal/gitaly/service/commit/contributors_sender.go @@ -0,0 +1,23 @@ +package commit + +import ( + "gitlab.com/gitlab-org/gitaly/v18/proto/go/gitalypb" + "google.golang.org/protobuf/proto" +) + +type contributorsSender struct { + contributors []*gitalypb.ListContributorsResponse_Contributor + send func([]*gitalypb.ListContributorsResponse_Contributor) error +} + +func (s *contributorsSender) Reset() { + s.contributors = s.contributors[:0] +} + +func (s *contributorsSender) Append(m proto.Message) { + s.contributors = append(s.contributors, m.(*gitalypb.ListContributorsResponse_Contributor)) +} + +func (s *contributorsSender) Send() error { + return s.send(s.contributors) +} diff --git a/internal/gitaly/service/commit/list_contributors.go b/internal/gitaly/service/commit/list_contributors.go new file mode 100644 index 0000000000000000000000000000000000000000..23ecc6d9346fa554478ee8365a67764000c07bdc --- /dev/null +++ b/internal/gitaly/service/commit/list_contributors.go @@ -0,0 +1,173 @@ +package commit + +import ( + "bufio" + "bytes" + "context" + "regexp" + "sort" + "strconv" + + "gitlab.com/gitlab-org/gitaly/v18/internal/git" + "gitlab.com/gitlab-org/gitaly/v18/internal/git/gitcmd" + "gitlab.com/gitlab-org/gitaly/v18/internal/gitaly/storage" + "gitlab.com/gitlab-org/gitaly/v18/internal/helper/chunk" + "gitlab.com/gitlab-org/gitaly/v18/internal/structerr" + "gitlab.com/gitlab-org/gitaly/v18/proto/go/gitalypb" +) + +// shortlogLineRegex parses git shortlog -sne output format: +// " 1234\tJohn Doe " +var shortlogLineRegex = regexp.MustCompile(`^\s*(\d+)\s+(.+?)\s+<(.+?)>\s*$`) + +func verifyListContributorsRequest(ctx context.Context, locator storage.Locator, request *gitalypb.ListContributorsRequest) error { + if err := locator.ValidateRepository(ctx, request.GetRepository()); err != nil { + return err + } + + for _, revision := range request.GetRevisions() { + if err := git.ValidateRevision([]byte(revision), git.AllowPseudoRevision()); err != nil { + return structerr.NewInvalidArgument("invalid revision: %w", err).WithMetadata("revision", revision) + } + } + + return nil +} + +func (s *server) ListContributors( + request *gitalypb.ListContributorsRequest, + stream gitalypb.CommitService_ListContributorsServer, +) error { + ctx := stream.Context() + + if err := verifyListContributorsRequest(ctx, s.locator, request); err != nil { + return structerr.NewInvalidArgument("%w", err) + } + + repo := s.localRepoFactory.Build(request.GetRepository()) + + // Build git shortlog command + // git shortlog -s -e [--numbered] [--group=author|committer] [--all | ] + // + // From git-shortlog docs: + // -s / --summary: Suppress commit description, provide commit count summary only + // -e / --email: Show email address of each author + // -n / --numbered: Sort by number of commits per author (descending) instead of alphabetically + // --group=: Group by author (default) or committer + // + // Default behavior (without -n): alphabetic sorting by author name + flags := []gitcmd.Option{ + gitcmd.Flag{Name: "-s"}, // summary (count only) + gitcmd.Flag{Name: "-e"}, // show email + } + + // Add sorting option - git shortlog supports sorting by commit count (-n) + // or alphabetically by name (default). For email sorting, we need to + // post-process since git shortlog doesn't support that. + // + // Note: The proto enum zero value is COMMITS, so the default case should + // sort by commits (descending). + switch request.GetOrder() { + case gitalypb.ListContributorsRequest_NAME: + // Default git behavior - alphabetic by name, no additional flag needed + case gitalypb.ListContributorsRequest_EMAIL: + // Git shortlog doesn't support email sorting, we'll post-process. + // Use -n first to get consistent ordering, then re-sort by email. + flags = append(flags, gitcmd.Flag{Name: "-n"}) + default: + // COMMITS (zero value / default): -n / --numbered sorts by commit count (descending) + flags = append(flags, gitcmd.Flag{Name: "-n"}) + } + + switch request.GetContributorType() { + case gitalypb.ListContributorsRequest_COMMITTER: + // Use --group=committer to group by committer instead of author + flags = append(flags, gitcmd.Flag{Name: "--group=committer"}) + default: + // AUTHOR is the default behavior of git shortlog, but we explicitly set it + flags = append(flags, gitcmd.Flag{Name: "--group=author"}) + } + + var args []string + revisions := request.GetRevisions() + if len(revisions) == 0 { + flags = append(flags, gitcmd.Flag{Name: "--all"}) + } else { + args = revisions + } + + var stdout, stderr bytes.Buffer + cmd, err := repo.Exec(ctx, gitcmd.Command{ + Name: "shortlog", + Flags: flags, + Args: args, + }, gitcmd.WithStdout(&stdout), gitcmd.WithStderr(&stderr)) + if err != nil { + return structerr.NewInternal("spawning shortlog: %w", err) + } + + if err := cmd.Wait(); err != nil { + return structerr.NewInternal("running shortlog: %w, stderr: %s", err, stderr.String()) + } + + contributors := make([]*gitalypb.ListContributorsResponse_Contributor, 0) + scanner := bufio.NewScanner(&stdout) + + for scanner.Scan() { + line := scanner.Text() + matches := shortlogLineRegex.FindStringSubmatch(line) + if matches == nil { + continue + } + + commits, err := strconv.ParseInt(matches[1], 10, 64) + if err != nil { + continue + } + + contributor := &gitalypb.ListContributorsResponse_Contributor{ + Name: []byte(matches[2]), + Email: []byte(matches[3]), + Commits: commits, + } + contributors = append(contributors, contributor) + } + + if err := scanner.Err(); err != nil { + return structerr.NewInternal("scanning shortlog output: %w", err) + } + + // Post-process sorting only for EMAIL order since git shortlog doesn't support it. + // COMMITS and NAME sorting are handled by git shortlog directly (-n flag or default). + if request.GetOrder() == gitalypb.ListContributorsRequest_EMAIL { + sortContributorsByEmail(contributors) + } + + chunker := chunk.New(&contributorsSender{ + send: func(contribs []*gitalypb.ListContributorsResponse_Contributor) error { + return stream.Send(&gitalypb.ListContributorsResponse{ + Contributors: contribs, + }) + }, + }) + + for _, contrib := range contributors { + if err := chunker.Send(contrib); err != nil { + return structerr.NewInternal("sending contributor: %w", err) + } + } + + if err := chunker.Flush(); err != nil { + return structerr.NewInternal("flushing contributors: %w", err) + } + + return nil +} + +// sortContributorsByEmail sorts contributors alphabetically by email. +// This is the only sorting that git shortlog doesn't support natively. +func sortContributorsByEmail(contributors []*gitalypb.ListContributorsResponse_Contributor) { + sort.Slice(contributors, func(i, j int) bool { + return bytes.Compare(contributors[i].Email, contributors[j].Email) < 0 + }) +} diff --git a/internal/gitaly/service/commit/list_contributors_test.go b/internal/gitaly/service/commit/list_contributors_test.go new file mode 100644 index 0000000000000000000000000000000000000000..a27d21fb9b39edcf1f2134d5ee28e0073d6d25ab --- /dev/null +++ b/internal/gitaly/service/commit/list_contributors_test.go @@ -0,0 +1,244 @@ +package commit + +import ( + "testing" + + "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v18/internal/git/gittest" + "gitlab.com/gitlab-org/gitaly/v18/internal/gitaly/storage" + "gitlab.com/gitlab-org/gitaly/v18/internal/structerr" + "gitlab.com/gitlab-org/gitaly/v18/internal/testhelper" + "gitlab.com/gitlab-org/gitaly/v18/proto/go/gitalypb" +) + +func TestListContributors(t *testing.T) { + t.Parallel() + + ctx := testhelper.Context(t) + cfg, client := setupCommitService(t, ctx) + + repoProto, repoPath := gittest.CreateRepository(t, ctx, cfg) + + // Note: gittest uses a fixed email (DefaultCommitterMail = "scrooge@mcduck.com") + // for all commits. We can only vary the name. This is a limitation of the test helper. + defaultEmail := gittest.DefaultCommitterMail + author1Name := "Author One" + author2Name := "Author Two" + + // Create 3 commits by author1 + commit1 := gittest.WriteCommit(t, cfg, repoPath, + gittest.WithAuthorName(author1Name), + gittest.WithCommitterName(author1Name), + gittest.WithMessage("commit 1"), + ) + commit2 := gittest.WriteCommit(t, cfg, repoPath, + gittest.WithParents(commit1), + gittest.WithAuthorName(author1Name), + gittest.WithCommitterName(author1Name), + gittest.WithMessage("commit 2"), + ) + commit3 := gittest.WriteCommit(t, cfg, repoPath, + gittest.WithParents(commit2), + gittest.WithAuthorName(author1Name), + gittest.WithCommitterName(author1Name), + gittest.WithMessage("commit 3"), + ) + + // Create 2 commits by author2 + commit4 := gittest.WriteCommit(t, cfg, repoPath, + gittest.WithParents(commit3), + gittest.WithAuthorName(author2Name), + gittest.WithCommitterName(author2Name), + gittest.WithMessage("commit 4"), + ) + gittest.WriteCommit(t, cfg, repoPath, + gittest.WithParents(commit4), + gittest.WithAuthorName(author2Name), + gittest.WithCommitterName(author2Name), + gittest.WithMessage("commit 5"), + gittest.WithBranch("main"), + ) + + for _, tc := range []struct { + desc string + request *gitalypb.ListContributorsRequest + expectedContributors []*gitalypb.ListContributorsResponse_Contributor + expectedErr error + }{ + { + desc: "default order (no Order specified) sorts by commits", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + // Order not specified - should default to COMMITS (descending) + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + {Name: []byte(author2Name), Email: []byte(defaultEmail), Commits: 2}, + }, + }, + { + desc: "explicit COMMITS order", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + Order: gitalypb.ListContributorsRequest_COMMITS, + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + {Name: []byte(author2Name), Email: []byte(defaultEmail), Commits: 2}, + }, + }, + { + desc: "all contributors by author explicit", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + ContributorType: gitalypb.ListContributorsRequest_AUTHOR, + Order: gitalypb.ListContributorsRequest_COMMITS, + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + {Name: []byte(author2Name), Email: []byte(defaultEmail), Commits: 2}, + }, + }, + { + desc: "sorted by name (alphabetically)", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + Order: gitalypb.ListContributorsRequest_NAME, + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + {Name: []byte(author2Name), Email: []byte(defaultEmail), Commits: 2}, + }, + }, + { + desc: "with specific revision", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + Revisions: []string{commit3.String()}, + Order: gitalypb.ListContributorsRequest_COMMITS, + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + }, + }, + { + desc: "with branch revision", + request: &gitalypb.ListContributorsRequest{ + Repository: repoProto, + Revisions: []string{"main"}, + Order: gitalypb.ListContributorsRequest_COMMITS, + }, + expectedContributors: []*gitalypb.ListContributorsResponse_Contributor{ + {Name: []byte(author1Name), Email: []byte(defaultEmail), Commits: 3}, + {Name: []byte(author2Name), Email: []byte(defaultEmail), Commits: 2}, + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + t.Parallel() + + stream, err := client.ListContributors(ctx, tc.request) + require.NoError(t, err) + + contributors, err := testhelper.ReceiveAndFold(stream.Recv, func( + result []*gitalypb.ListContributorsResponse_Contributor, + response *gitalypb.ListContributorsResponse, + ) []*gitalypb.ListContributorsResponse_Contributor { + return append(result, response.GetContributors()...) + }) + + if tc.expectedErr != nil { + testhelper.RequireGrpcError(t, tc.expectedErr, err) + return + } + + require.NoError(t, err) + testhelper.ProtoEqual(t, tc.expectedContributors, contributors) + }) + } +} + +func TestListContributors_validation(t *testing.T) { + t.Parallel() + + ctx := testhelper.Context(t) + cfg, client := setupCommitService(t, ctx) + + repo, _ := gittest.CreateRepository(t, ctx, cfg) + + for _, tc := range []struct { + desc string + request *gitalypb.ListContributorsRequest + expectedErr error + }{ + { + desc: "no repository provided", + request: &gitalypb.ListContributorsRequest{Repository: nil}, + expectedErr: structerr.NewInvalidArgument("%w", storage.ErrRepositoryNotSet), + }, + { + desc: "repository doesn't exist", + request: &gitalypb.ListContributorsRequest{ + Repository: &gitalypb.Repository{StorageName: "fake", RelativePath: "path"}, + }, + expectedErr: testhelper.ToInterceptedMetadata(structerr.NewInvalidArgument( + "%w", storage.NewStorageNotFoundError("fake"), + )), + }, + { + desc: "invalid revision - starts with dash", + request: &gitalypb.ListContributorsRequest{ + Repository: repo, + Revisions: []string{"--output=/etc/passwd"}, + }, + expectedErr: testhelper.WithInterceptedMetadata( + structerr.NewInvalidArgument("invalid revision: revision can't start with '-'"), + "revision", "--output=/etc/passwd", + ), + }, + { + desc: "invalid revision - contains null byte", + request: &gitalypb.ListContributorsRequest{ + Repository: repo, + Revisions: []string{"main\x00--output=/etc/passwd"}, + }, + expectedErr: testhelper.WithInterceptedMetadata( + structerr.NewInvalidArgument("invalid revision: revision can't contain NUL"), + "revision", "main\x00--output=/etc/passwd", + ), + }, + } { + t.Run(tc.desc, func(t *testing.T) { + t.Parallel() + + stream, err := client.ListContributors(ctx, tc.request) + require.NoError(t, err) + + _, err = stream.Recv() + testhelper.RequireGrpcError(t, tc.expectedErr, err) + }) + } +} + +func TestListContributors_emptyRepository(t *testing.T) { + t.Parallel() + + ctx := testhelper.Context(t) + cfg, client := setupCommitService(t, ctx) + + repo, _ := gittest.CreateRepository(t, ctx, cfg) + + stream, err := client.ListContributors(ctx, &gitalypb.ListContributorsRequest{ + Repository: repo, + }) + require.NoError(t, err) + + contributors, err := testhelper.ReceiveAndFold(stream.Recv, func( + result []*gitalypb.ListContributorsResponse_Contributor, + response *gitalypb.ListContributorsResponse, + ) []*gitalypb.ListContributorsResponse_Contributor { + return append(result, response.GetContributors()...) + }) + require.NoError(t, err) + require.Empty(t, contributors) +} diff --git a/proto/commit.proto b/proto/commit.proto index 2e789fb7845799e74d91ffd8dba65c18f42833a5..41fccd4279b9e2639dfdaf033a74cc922d3543e7 100644 --- a/proto/commit.proto +++ b/proto/commit.proto @@ -197,6 +197,15 @@ service CommitService { }; } + // ListContributors lists all unique contributors to a repository. + // This is optimized for performance using git-shortlog internally, making it + // efficient for repositories of any size including those with millions of commits. + rpc ListContributors(ListContributorsRequest) returns (stream ListContributorsResponse) { + option (op_type) = { + op: ACCESSOR + }; + } + } // ListCommitsRequest is a request for the ListCommits RPC. @@ -998,3 +1007,61 @@ message CheckObjectsExistResponse { // revisions exist. repeated RevisionExistence revisions = 1; } + +// ListContributorsRequest is a request for the ListContributors RPC. +message ListContributorsRequest { + // SortBy determines how contributors are sorted in the response. + enum SortBy { + // COMMITS sorts by commit count descending (default). + COMMITS = 0; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH + // NAME sorts alphabetically by contributor name. + NAME = 1; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX + // EMAIL sorts alphabetically by contributor email. + EMAIL = 2; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX + } + + // ContributorType determines whether to group by author or committer. + // In Git, the author is who originally wrote the code, while the committer + // is who last applied the commit (e.g., during a rebase or cherry-pick). + enum ContributorType { + // AUTHOR groups commits by the author field (default, --author in git shortlog). + // This is typically the person who wrote the code. + AUTHOR = 0; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH + // COMMITTER groups commits by the committer field (--committer in git shortlog). + // This is the person who last applied the commit to the repository. + COMMITTER = 1; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX + } + + // repository is the repository to list contributors from. + Repository repository = 1 [(target_repository)=true]; + + // revisions is the set of revisions to consider. If empty, --all is used + // which includes all refs in the repository. Accepts notation as documented + // in gitrevisions(7). + repeated string revisions = 2; + + // order determines the sort order of returned contributors. + SortBy order = 3; + + // contributor_type determines whether to group by author or committer. + // Defaults to AUTHOR which is the standard for contributor statistics. + ContributorType contributor_type = 4; +} + +// ListContributorsResponse is a response for the ListContributors RPC. +// The response is streamed in chunks for large contributor lists. +message ListContributorsResponse { + // Contributor represents a unique contributor to the repository. + message Contributor { + // name is the contributor's name from git commit metadata. + bytes name = 1; + // email is the contributor's email from git commit metadata. + bytes email = 2; + // commits is the total number of commits by this contributor. + int64 commits = 3; + } + + // contributors is a batch of contributors. Multiple responses may be + // sent for repositories with many contributors. + repeated Contributor contributors = 1; +} diff --git a/proto/go/gitalypb/commit.pb.go b/proto/go/gitalypb/commit.pb.go index 3fea3a4e45851517081673538af54a94f719b27e..3634171eaf131d9bf759e7100908335e6b3a175d 100644 --- a/proto/go/gitalypb/commit.pb.go +++ b/proto/go/gitalypb/commit.pb.go @@ -7,12 +7,13 @@ package gitalypb import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" unsafe "unsafe" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) const ( @@ -402,6 +403,112 @@ func (GetCommitSignaturesResponse_Signer) EnumDescriptor() ([]byte, []int) { return file_commit_proto_rawDescGZIP(), []int{45, 0} } +// SortBy determines how contributors are sorted in the response. +type ListContributorsRequest_SortBy int32 + +const ( + // COMMITS sorts by commit count descending (default). + ListContributorsRequest_COMMITS ListContributorsRequest_SortBy = 0 // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH + // NAME sorts alphabetically by contributor name. + ListContributorsRequest_NAME ListContributorsRequest_SortBy = 1 // protolint:disable:this ENUM_FIELD_NAMES_PREFIX + // EMAIL sorts alphabetically by contributor email. + ListContributorsRequest_EMAIL ListContributorsRequest_SortBy = 2 // protolint:disable:this ENUM_FIELD_NAMES_PREFIX +) + +// Enum value maps for ListContributorsRequest_SortBy. +var ( + ListContributorsRequest_SortBy_name = map[int32]string{ + 0: "COMMITS", + 1: "NAME", + 2: "EMAIL", + } + ListContributorsRequest_SortBy_value = map[string]int32{ + "COMMITS": 0, + "NAME": 1, + "EMAIL": 2, + } +) + +func (x ListContributorsRequest_SortBy) Enum() *ListContributorsRequest_SortBy { + p := new(ListContributorsRequest_SortBy) + *p = x + return p +} + +func (x ListContributorsRequest_SortBy) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ListContributorsRequest_SortBy) Descriptor() protoreflect.EnumDescriptor { + return file_commit_proto_enumTypes[7].Descriptor() +} + +func (ListContributorsRequest_SortBy) Type() protoreflect.EnumType { + return &file_commit_proto_enumTypes[7] +} + +func (x ListContributorsRequest_SortBy) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ListContributorsRequest_SortBy.Descriptor instead. +func (ListContributorsRequest_SortBy) EnumDescriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{50, 0} +} + +// ContributorType determines whether to group by author or committer. +// In Git, the author is who originally wrote the code, while the committer +// is who last applied the commit (e.g., during a rebase or cherry-pick). +type ListContributorsRequest_ContributorType int32 + +const ( + // AUTHOR groups commits by the author field (default, --author in git shortlog). + // This is typically the person who wrote the code. + ListContributorsRequest_AUTHOR ListContributorsRequest_ContributorType = 0 // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH + // COMMITTER groups commits by the committer field (--committer in git shortlog). + // This is the person who last applied the commit to the repository. + ListContributorsRequest_COMMITTER ListContributorsRequest_ContributorType = 1 // protolint:disable:this ENUM_FIELD_NAMES_PREFIX +) + +// Enum value maps for ListContributorsRequest_ContributorType. +var ( + ListContributorsRequest_ContributorType_name = map[int32]string{ + 0: "AUTHOR", + 1: "COMMITTER", + } + ListContributorsRequest_ContributorType_value = map[string]int32{ + "AUTHOR": 0, + "COMMITTER": 1, + } +) + +func (x ListContributorsRequest_ContributorType) Enum() *ListContributorsRequest_ContributorType { + p := new(ListContributorsRequest_ContributorType) + *p = x + return p +} + +func (x ListContributorsRequest_ContributorType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ListContributorsRequest_ContributorType) Descriptor() protoreflect.EnumDescriptor { + return file_commit_proto_enumTypes[8].Descriptor() +} + +func (ListContributorsRequest_ContributorType) Type() protoreflect.EnumType { + return &file_commit_proto_enumTypes[8] +} + +func (x ListContributorsRequest_ContributorType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ListContributorsRequest_ContributorType.Descriptor instead. +func (ListContributorsRequest_ContributorType) EnumDescriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{50, 1} +} + // ListCommitsRequest is a request for the ListCommits RPC. type ListCommitsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -3959,6 +4066,130 @@ func (x *CheckObjectsExistResponse) GetRevisions() []*CheckObjectsExistResponse_ return nil } +// ListContributorsRequest is a request for the ListContributors RPC. +type ListContributorsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // repository is the repository to list contributors from. + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + // revisions is the set of revisions to consider. If empty, --all is used + // which includes all refs in the repository. Accepts notation as documented + // in gitrevisions(7). + Revisions []string `protobuf:"bytes,2,rep,name=revisions,proto3" json:"revisions,omitempty"` + // order determines the sort order of returned contributors. + Order ListContributorsRequest_SortBy `protobuf:"varint,3,opt,name=order,proto3,enum=gitaly.ListContributorsRequest_SortBy" json:"order,omitempty"` + // contributor_type determines whether to group by author or committer. + // Defaults to AUTHOR which is the standard for contributor statistics. + ContributorType ListContributorsRequest_ContributorType `protobuf:"varint,4,opt,name=contributor_type,json=contributorType,proto3,enum=gitaly.ListContributorsRequest_ContributorType" json:"contributor_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListContributorsRequest) Reset() { + *x = ListContributorsRequest{} + mi := &file_commit_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListContributorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListContributorsRequest) ProtoMessage() {} + +func (x *ListContributorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_commit_proto_msgTypes[50] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListContributorsRequest.ProtoReflect.Descriptor instead. +func (*ListContributorsRequest) Descriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{50} +} + +func (x *ListContributorsRequest) GetRepository() *Repository { + if x != nil { + return x.Repository + } + return nil +} + +func (x *ListContributorsRequest) GetRevisions() []string { + if x != nil { + return x.Revisions + } + return nil +} + +func (x *ListContributorsRequest) GetOrder() ListContributorsRequest_SortBy { + if x != nil { + return x.Order + } + return ListContributorsRequest_COMMITS +} + +func (x *ListContributorsRequest) GetContributorType() ListContributorsRequest_ContributorType { + if x != nil { + return x.ContributorType + } + return ListContributorsRequest_AUTHOR +} + +// ListContributorsResponse is a response for the ListContributors RPC. +// The response is streamed in chunks for large contributor lists. +type ListContributorsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // contributors is a batch of contributors. Multiple responses may be + // sent for repositories with many contributors. + Contributors []*ListContributorsResponse_Contributor `protobuf:"bytes,1,rep,name=contributors,proto3" json:"contributors,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListContributorsResponse) Reset() { + *x = ListContributorsResponse{} + mi := &file_commit_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListContributorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListContributorsResponse) ProtoMessage() {} + +func (x *ListContributorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_commit_proto_msgTypes[51] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListContributorsResponse.ProtoReflect.Descriptor instead. +func (*ListContributorsResponse) Descriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{51} +} + +func (x *ListContributorsResponse) GetContributors() []*ListContributorsResponse_Contributor { + if x != nil { + return x.Contributors + } + return nil +} + // CommitForRef holds the commit for a given reference. type ListCommitsByRefNameResponse_CommitForRef struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -3972,7 +4203,7 @@ type ListCommitsByRefNameResponse_CommitForRef struct { func (x *ListCommitsByRefNameResponse_CommitForRef) Reset() { *x = ListCommitsByRefNameResponse_CommitForRef{} - mi := &file_commit_proto_msgTypes[50] + mi := &file_commit_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3984,7 +4215,7 @@ func (x *ListCommitsByRefNameResponse_CommitForRef) String() string { func (*ListCommitsByRefNameResponse_CommitForRef) ProtoMessage() {} func (x *ListCommitsByRefNameResponse_CommitForRef) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[50] + mi := &file_commit_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4036,7 +4267,7 @@ type CommitLanguagesResponse_Language struct { func (x *CommitLanguagesResponse_Language) Reset() { *x = CommitLanguagesResponse_Language{} - mi := &file_commit_proto_msgTypes[51] + mi := &file_commit_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4048,7 +4279,7 @@ func (x *CommitLanguagesResponse_Language) String() string { func (*CommitLanguagesResponse_Language) ProtoMessage() {} func (x *CommitLanguagesResponse_Language) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[51] + mi := &file_commit_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4111,7 +4342,7 @@ type RawBlameError_OutOfRangeError struct { func (x *RawBlameError_OutOfRangeError) Reset() { *x = RawBlameError_OutOfRangeError{} - mi := &file_commit_proto_msgTypes[52] + mi := &file_commit_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4123,7 +4354,7 @@ func (x *RawBlameError_OutOfRangeError) String() string { func (*RawBlameError_OutOfRangeError) ProtoMessage() {} func (x *RawBlameError_OutOfRangeError) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[52] + mi := &file_commit_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4158,7 +4389,7 @@ type RawBlameError_InvalidIgnoreRevsFormatError struct { func (x *RawBlameError_InvalidIgnoreRevsFormatError) Reset() { *x = RawBlameError_InvalidIgnoreRevsFormatError{} - mi := &file_commit_proto_msgTypes[53] + mi := &file_commit_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4170,7 +4401,7 @@ func (x *RawBlameError_InvalidIgnoreRevsFormatError) String() string { func (*RawBlameError_InvalidIgnoreRevsFormatError) ProtoMessage() {} func (x *RawBlameError_InvalidIgnoreRevsFormatError) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[53] + mi := &file_commit_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4204,7 +4435,7 @@ type RawBlameError_ResolveIgnoreRevsError struct { func (x *RawBlameError_ResolveIgnoreRevsError) Reset() { *x = RawBlameError_ResolveIgnoreRevsError{} - mi := &file_commit_proto_msgTypes[54] + mi := &file_commit_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4216,7 +4447,7 @@ func (x *RawBlameError_ResolveIgnoreRevsError) String() string { func (*RawBlameError_ResolveIgnoreRevsError) ProtoMessage() {} func (x *RawBlameError_ResolveIgnoreRevsError) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[54] + mi := &file_commit_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4252,7 +4483,7 @@ type ListLastCommitsForTreeResponse_CommitForTree struct { func (x *ListLastCommitsForTreeResponse_CommitForTree) Reset() { *x = ListLastCommitsForTreeResponse_CommitForTree{} - mi := &file_commit_proto_msgTypes[55] + mi := &file_commit_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4264,7 +4495,7 @@ func (x *ListLastCommitsForTreeResponse_CommitForTree) String() string { func (*ListLastCommitsForTreeResponse_CommitForTree) ProtoMessage() {} func (x *ListLastCommitsForTreeResponse_CommitForTree) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[55] + mi := &file_commit_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4307,7 +4538,7 @@ type CheckObjectsExistResponse_RevisionExistence struct { func (x *CheckObjectsExistResponse_RevisionExistence) Reset() { *x = CheckObjectsExistResponse_RevisionExistence{} - mi := &file_commit_proto_msgTypes[56] + mi := &file_commit_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4319,7 +4550,7 @@ func (x *CheckObjectsExistResponse_RevisionExistence) String() string { func (*CheckObjectsExistResponse_RevisionExistence) ProtoMessage() {} func (x *CheckObjectsExistResponse_RevisionExistence) ProtoReflect() protoreflect.Message { - mi := &file_commit_proto_msgTypes[56] + mi := &file_commit_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4349,6 +4580,70 @@ func (x *CheckObjectsExistResponse_RevisionExistence) GetExists() bool { return false } +// Contributor represents a unique contributor to the repository. +type ListContributorsResponse_Contributor struct { + state protoimpl.MessageState `protogen:"open.v1"` + // name is the contributor's name from git commit metadata. + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // email is the contributor's email from git commit metadata. + Email []byte `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + // commits is the total number of commits by this contributor. + Commits int64 `protobuf:"varint,3,opt,name=commits,proto3" json:"commits,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListContributorsResponse_Contributor) Reset() { + *x = ListContributorsResponse_Contributor{} + mi := &file_commit_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListContributorsResponse_Contributor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListContributorsResponse_Contributor) ProtoMessage() {} + +func (x *ListContributorsResponse_Contributor) ProtoReflect() protoreflect.Message { + mi := &file_commit_proto_msgTypes[59] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListContributorsResponse_Contributor.ProtoReflect.Descriptor instead. +func (*ListContributorsResponse_Contributor) Descriptor() ([]byte, []int) { + return file_commit_proto_rawDescGZIP(), []int{51, 0} +} + +func (x *ListContributorsResponse_Contributor) GetName() []byte { + if x != nil { + return x.Name + } + return nil +} + +func (x *ListContributorsResponse_Contributor) GetEmail() []byte { + if x != nil { + return x.Email + } + return nil +} + +func (x *ListContributorsResponse_Contributor) GetCommits() int64 { + if x != nil { + return x.Commits + } + return 0 +} + var File_commit_proto protoreflect.FileDescriptor var file_commit_proto_rawDesc = string([]byte{ @@ -4926,146 +5221,186 @@ var file_commit_proto_rawDesc = string([]byte{ 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 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, 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, + 0x22, 0xe5, 0x02, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x6f, 0x72, 0x73, 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, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x52, 0x05, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x5a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, + 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2a, + 0x0a, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4d, 0x4d, + 0x49, 0x54, 0x53, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x22, 0x2c, 0x0a, 0x0f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, + 0x4d, 0x49, 0x54, 0x54, 0x45, 0x52, 0x10, 0x01, 0x22, 0xbf, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x51, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x32, 0xd2, 0x11, 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, 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, + 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, 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, 0x01, 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, + 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, 0x01, 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, 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, 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, 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, + 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, - 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, 0x38, 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, + 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, 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, 0x12, 0x5f, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 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, 0x38, 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 ( @@ -5080,8 +5415,8 @@ func file_commit_proto_rawDescGZIP() []byte { return file_commit_proto_rawDescData } -var file_commit_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_commit_proto_msgTypes = make([]protoimpl.MessageInfo, 57) +var file_commit_proto_enumTypes = make([]protoimpl.EnumInfo, 9) +var file_commit_proto_msgTypes = make([]protoimpl.MessageInfo, 60) var file_commit_proto_goTypes = []any{ (ListCommitsRequest_Order)(0), // 0: gitaly.ListCommitsRequest.Order (TreeEntryResponse_ObjectType)(0), // 1: gitaly.TreeEntryResponse.ObjectType @@ -5090,200 +5425,211 @@ var file_commit_proto_goTypes = []any{ (FindAllCommitsRequest_Order)(0), // 4: gitaly.FindAllCommitsRequest.Order (FindCommitsRequest_Order)(0), // 5: gitaly.FindCommitsRequest.Order (GetCommitSignaturesResponse_Signer)(0), // 6: gitaly.GetCommitSignaturesResponse.Signer - (*ListCommitsRequest)(nil), // 7: gitaly.ListCommitsRequest - (*ListCommitsResponse)(nil), // 8: gitaly.ListCommitsResponse - (*ListAllCommitsRequest)(nil), // 9: gitaly.ListAllCommitsRequest - (*ListAllCommitsResponse)(nil), // 10: gitaly.ListAllCommitsResponse - (*CommitStatsRequest)(nil), // 11: gitaly.CommitStatsRequest - (*CommitStatsResponse)(nil), // 12: gitaly.CommitStatsResponse - (*CommitIsAncestorRequest)(nil), // 13: gitaly.CommitIsAncestorRequest - (*CommitIsAncestorResponse)(nil), // 14: gitaly.CommitIsAncestorResponse - (*TreeEntryRequest)(nil), // 15: gitaly.TreeEntryRequest - (*TreeEntryResponse)(nil), // 16: gitaly.TreeEntryResponse - (*CountCommitsRequest)(nil), // 17: gitaly.CountCommitsRequest - (*CountCommitsResponse)(nil), // 18: gitaly.CountCommitsResponse - (*CountDivergingCommitsRequest)(nil), // 19: gitaly.CountDivergingCommitsRequest - (*CountDivergingCommitsResponse)(nil), // 20: gitaly.CountDivergingCommitsResponse - (*TreeEntry)(nil), // 21: gitaly.TreeEntry - (*GetTreeEntriesRequest)(nil), // 22: gitaly.GetTreeEntriesRequest - (*GetTreeEntriesResponse)(nil), // 23: gitaly.GetTreeEntriesResponse - (*GetTreeEntriesError)(nil), // 24: gitaly.GetTreeEntriesError - (*ListFilesRequest)(nil), // 25: gitaly.ListFilesRequest - (*ListFilesResponse)(nil), // 26: gitaly.ListFilesResponse - (*FindCommitRequest)(nil), // 27: gitaly.FindCommitRequest - (*FindCommitResponse)(nil), // 28: gitaly.FindCommitResponse - (*ListCommitsByOidRequest)(nil), // 29: gitaly.ListCommitsByOidRequest - (*ListCommitsByOidResponse)(nil), // 30: gitaly.ListCommitsByOidResponse - (*ListCommitsByRefNameRequest)(nil), // 31: gitaly.ListCommitsByRefNameRequest - (*ListCommitsByRefNameResponse)(nil), // 32: gitaly.ListCommitsByRefNameResponse - (*FindAllCommitsRequest)(nil), // 33: gitaly.FindAllCommitsRequest - (*FindAllCommitsResponse)(nil), // 34: gitaly.FindAllCommitsResponse - (*FindCommitsRequest)(nil), // 35: gitaly.FindCommitsRequest - (*FindCommitsResponse)(nil), // 36: gitaly.FindCommitsResponse - (*FindCommitsError)(nil), // 37: gitaly.FindCommitsError - (*CommitLanguagesRequest)(nil), // 38: gitaly.CommitLanguagesRequest - (*CommitLanguagesResponse)(nil), // 39: gitaly.CommitLanguagesResponse - (*RawBlameRequest)(nil), // 40: gitaly.RawBlameRequest - (*RawBlameResponse)(nil), // 41: gitaly.RawBlameResponse - (*RawBlameError)(nil), // 42: gitaly.RawBlameError - (*LastCommitForPathRequest)(nil), // 43: gitaly.LastCommitForPathRequest - (*LastCommitForPathResponse)(nil), // 44: gitaly.LastCommitForPathResponse - (*ListLastCommitsForTreeRequest)(nil), // 45: gitaly.ListLastCommitsForTreeRequest - (*ListLastCommitsForTreeResponse)(nil), // 46: gitaly.ListLastCommitsForTreeResponse - (*CommitsByMessageRequest)(nil), // 47: gitaly.CommitsByMessageRequest - (*CommitsByMessageResponse)(nil), // 48: gitaly.CommitsByMessageResponse - (*FilterShasWithSignaturesRequest)(nil), // 49: gitaly.FilterShasWithSignaturesRequest - (*FilterShasWithSignaturesResponse)(nil), // 50: gitaly.FilterShasWithSignaturesResponse - (*GetCommitSignaturesRequest)(nil), // 51: gitaly.GetCommitSignaturesRequest - (*GetCommitSignaturesResponse)(nil), // 52: gitaly.GetCommitSignaturesResponse - (*GetCommitMessagesRequest)(nil), // 53: gitaly.GetCommitMessagesRequest - (*GetCommitMessagesResponse)(nil), // 54: gitaly.GetCommitMessagesResponse - (*CheckObjectsExistRequest)(nil), // 55: gitaly.CheckObjectsExistRequest - (*CheckObjectsExistResponse)(nil), // 56: gitaly.CheckObjectsExistResponse - (*ListCommitsByRefNameResponse_CommitForRef)(nil), // 57: gitaly.ListCommitsByRefNameResponse.CommitForRef - (*CommitLanguagesResponse_Language)(nil), // 58: gitaly.CommitLanguagesResponse.Language - (*RawBlameError_OutOfRangeError)(nil), // 59: gitaly.RawBlameError.OutOfRangeError - (*RawBlameError_InvalidIgnoreRevsFormatError)(nil), // 60: gitaly.RawBlameError.InvalidIgnoreRevsFormatError - (*RawBlameError_ResolveIgnoreRevsError)(nil), // 61: gitaly.RawBlameError.ResolveIgnoreRevsError - (*ListLastCommitsForTreeResponse_CommitForTree)(nil), // 62: gitaly.ListLastCommitsForTreeResponse.CommitForTree - (*CheckObjectsExistResponse_RevisionExistence)(nil), // 63: gitaly.CheckObjectsExistResponse.RevisionExistence - (*Repository)(nil), // 64: gitaly.Repository - (*PaginationParameter)(nil), // 65: gitaly.PaginationParameter - (*timestamppb.Timestamp)(nil), // 66: google.protobuf.Timestamp - (*GitCommit)(nil), // 67: gitaly.GitCommit - (*GlobalOptions)(nil), // 68: gitaly.GlobalOptions - (*PaginationCursor)(nil), // 69: gitaly.PaginationCursor - (*ResolveRevisionError)(nil), // 70: gitaly.ResolveRevisionError - (*PathError)(nil), // 71: gitaly.PathError - (*BadObjectError)(nil), // 72: gitaly.BadObjectError - (*AmbiguousReferenceError)(nil), // 73: gitaly.AmbiguousReferenceError - (*InvalidRevisionRange)(nil), // 74: gitaly.InvalidRevisionRange - (*PathNotFoundError)(nil), // 75: gitaly.PathNotFoundError - (*CommitAuthor)(nil), // 76: gitaly.CommitAuthor + (ListContributorsRequest_SortBy)(0), // 7: gitaly.ListContributorsRequest.SortBy + (ListContributorsRequest_ContributorType)(0), // 8: gitaly.ListContributorsRequest.ContributorType + (*ListCommitsRequest)(nil), // 9: gitaly.ListCommitsRequest + (*ListCommitsResponse)(nil), // 10: gitaly.ListCommitsResponse + (*ListAllCommitsRequest)(nil), // 11: gitaly.ListAllCommitsRequest + (*ListAllCommitsResponse)(nil), // 12: gitaly.ListAllCommitsResponse + (*CommitStatsRequest)(nil), // 13: gitaly.CommitStatsRequest + (*CommitStatsResponse)(nil), // 14: gitaly.CommitStatsResponse + (*CommitIsAncestorRequest)(nil), // 15: gitaly.CommitIsAncestorRequest + (*CommitIsAncestorResponse)(nil), // 16: gitaly.CommitIsAncestorResponse + (*TreeEntryRequest)(nil), // 17: gitaly.TreeEntryRequest + (*TreeEntryResponse)(nil), // 18: gitaly.TreeEntryResponse + (*CountCommitsRequest)(nil), // 19: gitaly.CountCommitsRequest + (*CountCommitsResponse)(nil), // 20: gitaly.CountCommitsResponse + (*CountDivergingCommitsRequest)(nil), // 21: gitaly.CountDivergingCommitsRequest + (*CountDivergingCommitsResponse)(nil), // 22: gitaly.CountDivergingCommitsResponse + (*TreeEntry)(nil), // 23: gitaly.TreeEntry + (*GetTreeEntriesRequest)(nil), // 24: gitaly.GetTreeEntriesRequest + (*GetTreeEntriesResponse)(nil), // 25: gitaly.GetTreeEntriesResponse + (*GetTreeEntriesError)(nil), // 26: gitaly.GetTreeEntriesError + (*ListFilesRequest)(nil), // 27: gitaly.ListFilesRequest + (*ListFilesResponse)(nil), // 28: gitaly.ListFilesResponse + (*FindCommitRequest)(nil), // 29: gitaly.FindCommitRequest + (*FindCommitResponse)(nil), // 30: gitaly.FindCommitResponse + (*ListCommitsByOidRequest)(nil), // 31: gitaly.ListCommitsByOidRequest + (*ListCommitsByOidResponse)(nil), // 32: gitaly.ListCommitsByOidResponse + (*ListCommitsByRefNameRequest)(nil), // 33: gitaly.ListCommitsByRefNameRequest + (*ListCommitsByRefNameResponse)(nil), // 34: gitaly.ListCommitsByRefNameResponse + (*FindAllCommitsRequest)(nil), // 35: gitaly.FindAllCommitsRequest + (*FindAllCommitsResponse)(nil), // 36: gitaly.FindAllCommitsResponse + (*FindCommitsRequest)(nil), // 37: gitaly.FindCommitsRequest + (*FindCommitsResponse)(nil), // 38: gitaly.FindCommitsResponse + (*FindCommitsError)(nil), // 39: gitaly.FindCommitsError + (*CommitLanguagesRequest)(nil), // 40: gitaly.CommitLanguagesRequest + (*CommitLanguagesResponse)(nil), // 41: gitaly.CommitLanguagesResponse + (*RawBlameRequest)(nil), // 42: gitaly.RawBlameRequest + (*RawBlameResponse)(nil), // 43: gitaly.RawBlameResponse + (*RawBlameError)(nil), // 44: gitaly.RawBlameError + (*LastCommitForPathRequest)(nil), // 45: gitaly.LastCommitForPathRequest + (*LastCommitForPathResponse)(nil), // 46: gitaly.LastCommitForPathResponse + (*ListLastCommitsForTreeRequest)(nil), // 47: gitaly.ListLastCommitsForTreeRequest + (*ListLastCommitsForTreeResponse)(nil), // 48: gitaly.ListLastCommitsForTreeResponse + (*CommitsByMessageRequest)(nil), // 49: gitaly.CommitsByMessageRequest + (*CommitsByMessageResponse)(nil), // 50: gitaly.CommitsByMessageResponse + (*FilterShasWithSignaturesRequest)(nil), // 51: gitaly.FilterShasWithSignaturesRequest + (*FilterShasWithSignaturesResponse)(nil), // 52: gitaly.FilterShasWithSignaturesResponse + (*GetCommitSignaturesRequest)(nil), // 53: gitaly.GetCommitSignaturesRequest + (*GetCommitSignaturesResponse)(nil), // 54: gitaly.GetCommitSignaturesResponse + (*GetCommitMessagesRequest)(nil), // 55: gitaly.GetCommitMessagesRequest + (*GetCommitMessagesResponse)(nil), // 56: gitaly.GetCommitMessagesResponse + (*CheckObjectsExistRequest)(nil), // 57: gitaly.CheckObjectsExistRequest + (*CheckObjectsExistResponse)(nil), // 58: gitaly.CheckObjectsExistResponse + (*ListContributorsRequest)(nil), // 59: gitaly.ListContributorsRequest + (*ListContributorsResponse)(nil), // 60: gitaly.ListContributorsResponse + (*ListCommitsByRefNameResponse_CommitForRef)(nil), // 61: gitaly.ListCommitsByRefNameResponse.CommitForRef + (*CommitLanguagesResponse_Language)(nil), // 62: gitaly.CommitLanguagesResponse.Language + (*RawBlameError_OutOfRangeError)(nil), // 63: gitaly.RawBlameError.OutOfRangeError + (*RawBlameError_InvalidIgnoreRevsFormatError)(nil), // 64: gitaly.RawBlameError.InvalidIgnoreRevsFormatError + (*RawBlameError_ResolveIgnoreRevsError)(nil), // 65: gitaly.RawBlameError.ResolveIgnoreRevsError + (*ListLastCommitsForTreeResponse_CommitForTree)(nil), // 66: gitaly.ListLastCommitsForTreeResponse.CommitForTree + (*CheckObjectsExistResponse_RevisionExistence)(nil), // 67: gitaly.CheckObjectsExistResponse.RevisionExistence + (*ListContributorsResponse_Contributor)(nil), // 68: gitaly.ListContributorsResponse.Contributor + (*Repository)(nil), // 69: gitaly.Repository + (*PaginationParameter)(nil), // 70: gitaly.PaginationParameter + (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp + (*GitCommit)(nil), // 72: gitaly.GitCommit + (*GlobalOptions)(nil), // 73: gitaly.GlobalOptions + (*PaginationCursor)(nil), // 74: gitaly.PaginationCursor + (*ResolveRevisionError)(nil), // 75: gitaly.ResolveRevisionError + (*PathError)(nil), // 76: gitaly.PathError + (*BadObjectError)(nil), // 77: gitaly.BadObjectError + (*AmbiguousReferenceError)(nil), // 78: gitaly.AmbiguousReferenceError + (*InvalidRevisionRange)(nil), // 79: gitaly.InvalidRevisionRange + (*PathNotFoundError)(nil), // 80: gitaly.PathNotFoundError + (*CommitAuthor)(nil), // 81: gitaly.CommitAuthor } var file_commit_proto_depIdxs = []int32{ - 64, // 0: gitaly.ListCommitsRequest.repository:type_name -> gitaly.Repository - 65, // 1: gitaly.ListCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter + 69, // 0: gitaly.ListCommitsRequest.repository:type_name -> gitaly.Repository + 70, // 1: gitaly.ListCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter 0, // 2: gitaly.ListCommitsRequest.order:type_name -> gitaly.ListCommitsRequest.Order - 66, // 3: gitaly.ListCommitsRequest.after:type_name -> google.protobuf.Timestamp - 66, // 4: gitaly.ListCommitsRequest.before:type_name -> google.protobuf.Timestamp - 67, // 5: gitaly.ListCommitsResponse.commits:type_name -> gitaly.GitCommit - 64, // 6: gitaly.ListAllCommitsRequest.repository:type_name -> gitaly.Repository - 65, // 7: gitaly.ListAllCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter - 67, // 8: gitaly.ListAllCommitsResponse.commits:type_name -> gitaly.GitCommit - 64, // 9: gitaly.CommitStatsRequest.repository:type_name -> gitaly.Repository - 64, // 10: gitaly.CommitIsAncestorRequest.repository:type_name -> gitaly.Repository - 64, // 11: gitaly.TreeEntryRequest.repository:type_name -> gitaly.Repository + 71, // 3: gitaly.ListCommitsRequest.after:type_name -> google.protobuf.Timestamp + 71, // 4: gitaly.ListCommitsRequest.before:type_name -> google.protobuf.Timestamp + 72, // 5: gitaly.ListCommitsResponse.commits:type_name -> gitaly.GitCommit + 69, // 6: gitaly.ListAllCommitsRequest.repository:type_name -> gitaly.Repository + 70, // 7: gitaly.ListAllCommitsRequest.pagination_params:type_name -> gitaly.PaginationParameter + 72, // 8: gitaly.ListAllCommitsResponse.commits:type_name -> gitaly.GitCommit + 69, // 9: gitaly.CommitStatsRequest.repository:type_name -> gitaly.Repository + 69, // 10: gitaly.CommitIsAncestorRequest.repository:type_name -> gitaly.Repository + 69, // 11: gitaly.TreeEntryRequest.repository:type_name -> gitaly.Repository 1, // 12: gitaly.TreeEntryResponse.type:type_name -> gitaly.TreeEntryResponse.ObjectType - 64, // 13: gitaly.CountCommitsRequest.repository:type_name -> gitaly.Repository - 66, // 14: gitaly.CountCommitsRequest.after:type_name -> google.protobuf.Timestamp - 66, // 15: gitaly.CountCommitsRequest.before:type_name -> google.protobuf.Timestamp - 68, // 16: gitaly.CountCommitsRequest.global_options:type_name -> gitaly.GlobalOptions - 64, // 17: gitaly.CountDivergingCommitsRequest.repository:type_name -> gitaly.Repository + 69, // 13: gitaly.CountCommitsRequest.repository:type_name -> gitaly.Repository + 71, // 14: gitaly.CountCommitsRequest.after:type_name -> google.protobuf.Timestamp + 71, // 15: gitaly.CountCommitsRequest.before:type_name -> google.protobuf.Timestamp + 73, // 16: gitaly.CountCommitsRequest.global_options:type_name -> gitaly.GlobalOptions + 69, // 17: gitaly.CountDivergingCommitsRequest.repository:type_name -> gitaly.Repository 2, // 18: gitaly.TreeEntry.type:type_name -> gitaly.TreeEntry.EntryType - 64, // 19: gitaly.GetTreeEntriesRequest.repository:type_name -> gitaly.Repository + 69, // 19: gitaly.GetTreeEntriesRequest.repository:type_name -> gitaly.Repository 3, // 20: gitaly.GetTreeEntriesRequest.sort:type_name -> gitaly.GetTreeEntriesRequest.SortBy - 65, // 21: gitaly.GetTreeEntriesRequest.pagination_params:type_name -> gitaly.PaginationParameter - 21, // 22: gitaly.GetTreeEntriesResponse.entries:type_name -> gitaly.TreeEntry - 69, // 23: gitaly.GetTreeEntriesResponse.pagination_cursor:type_name -> gitaly.PaginationCursor - 70, // 24: gitaly.GetTreeEntriesError.resolve_tree:type_name -> gitaly.ResolveRevisionError - 71, // 25: gitaly.GetTreeEntriesError.path:type_name -> gitaly.PathError - 64, // 26: gitaly.ListFilesRequest.repository:type_name -> gitaly.Repository - 64, // 27: gitaly.FindCommitRequest.repository:type_name -> gitaly.Repository - 67, // 28: gitaly.FindCommitResponse.commit:type_name -> gitaly.GitCommit - 64, // 29: gitaly.ListCommitsByOidRequest.repository:type_name -> gitaly.Repository - 67, // 30: gitaly.ListCommitsByOidResponse.commits:type_name -> gitaly.GitCommit - 64, // 31: gitaly.ListCommitsByRefNameRequest.repository:type_name -> gitaly.Repository - 57, // 32: gitaly.ListCommitsByRefNameResponse.commit_refs:type_name -> gitaly.ListCommitsByRefNameResponse.CommitForRef - 64, // 33: gitaly.FindAllCommitsRequest.repository:type_name -> gitaly.Repository + 70, // 21: gitaly.GetTreeEntriesRequest.pagination_params:type_name -> gitaly.PaginationParameter + 23, // 22: gitaly.GetTreeEntriesResponse.entries:type_name -> gitaly.TreeEntry + 74, // 23: gitaly.GetTreeEntriesResponse.pagination_cursor:type_name -> gitaly.PaginationCursor + 75, // 24: gitaly.GetTreeEntriesError.resolve_tree:type_name -> gitaly.ResolveRevisionError + 76, // 25: gitaly.GetTreeEntriesError.path:type_name -> gitaly.PathError + 69, // 26: gitaly.ListFilesRequest.repository:type_name -> gitaly.Repository + 69, // 27: gitaly.FindCommitRequest.repository:type_name -> gitaly.Repository + 72, // 28: gitaly.FindCommitResponse.commit:type_name -> gitaly.GitCommit + 69, // 29: gitaly.ListCommitsByOidRequest.repository:type_name -> gitaly.Repository + 72, // 30: gitaly.ListCommitsByOidResponse.commits:type_name -> gitaly.GitCommit + 69, // 31: gitaly.ListCommitsByRefNameRequest.repository:type_name -> gitaly.Repository + 61, // 32: gitaly.ListCommitsByRefNameResponse.commit_refs:type_name -> gitaly.ListCommitsByRefNameResponse.CommitForRef + 69, // 33: gitaly.FindAllCommitsRequest.repository:type_name -> gitaly.Repository 4, // 34: gitaly.FindAllCommitsRequest.order:type_name -> gitaly.FindAllCommitsRequest.Order - 67, // 35: gitaly.FindAllCommitsResponse.commits:type_name -> gitaly.GitCommit - 64, // 36: gitaly.FindCommitsRequest.repository:type_name -> gitaly.Repository - 66, // 37: gitaly.FindCommitsRequest.after:type_name -> google.protobuf.Timestamp - 66, // 38: gitaly.FindCommitsRequest.before:type_name -> google.protobuf.Timestamp + 72, // 35: gitaly.FindAllCommitsResponse.commits:type_name -> gitaly.GitCommit + 69, // 36: gitaly.FindCommitsRequest.repository:type_name -> gitaly.Repository + 71, // 37: gitaly.FindCommitsRequest.after:type_name -> google.protobuf.Timestamp + 71, // 38: gitaly.FindCommitsRequest.before:type_name -> google.protobuf.Timestamp 5, // 39: gitaly.FindCommitsRequest.order:type_name -> gitaly.FindCommitsRequest.Order - 68, // 40: gitaly.FindCommitsRequest.global_options:type_name -> gitaly.GlobalOptions - 67, // 41: gitaly.FindCommitsResponse.commits:type_name -> gitaly.GitCommit - 72, // 42: gitaly.FindCommitsError.bad_object:type_name -> gitaly.BadObjectError - 73, // 43: gitaly.FindCommitsError.ambiguous_ref:type_name -> gitaly.AmbiguousReferenceError - 74, // 44: gitaly.FindCommitsError.invalid_range:type_name -> gitaly.InvalidRevisionRange - 64, // 45: gitaly.CommitLanguagesRequest.repository:type_name -> gitaly.Repository - 58, // 46: gitaly.CommitLanguagesResponse.languages:type_name -> gitaly.CommitLanguagesResponse.Language - 64, // 47: gitaly.RawBlameRequest.repository:type_name -> gitaly.Repository - 75, // 48: gitaly.RawBlameError.path_not_found:type_name -> gitaly.PathNotFoundError - 59, // 49: gitaly.RawBlameError.out_of_range:type_name -> gitaly.RawBlameError.OutOfRangeError - 61, // 50: gitaly.RawBlameError.resolve_ignore_revs:type_name -> gitaly.RawBlameError.ResolveIgnoreRevsError - 60, // 51: gitaly.RawBlameError.invalid_ignore_revs_format:type_name -> gitaly.RawBlameError.InvalidIgnoreRevsFormatError - 64, // 52: gitaly.LastCommitForPathRequest.repository:type_name -> gitaly.Repository - 68, // 53: gitaly.LastCommitForPathRequest.global_options:type_name -> gitaly.GlobalOptions - 67, // 54: gitaly.LastCommitForPathResponse.commit:type_name -> gitaly.GitCommit - 64, // 55: gitaly.ListLastCommitsForTreeRequest.repository:type_name -> gitaly.Repository - 68, // 56: gitaly.ListLastCommitsForTreeRequest.global_options:type_name -> gitaly.GlobalOptions - 62, // 57: gitaly.ListLastCommitsForTreeResponse.commits:type_name -> gitaly.ListLastCommitsForTreeResponse.CommitForTree - 64, // 58: gitaly.CommitsByMessageRequest.repository:type_name -> gitaly.Repository - 68, // 59: gitaly.CommitsByMessageRequest.global_options:type_name -> gitaly.GlobalOptions - 67, // 60: gitaly.CommitsByMessageResponse.commits:type_name -> gitaly.GitCommit - 64, // 61: gitaly.FilterShasWithSignaturesRequest.repository:type_name -> gitaly.Repository - 64, // 62: gitaly.GetCommitSignaturesRequest.repository:type_name -> gitaly.Repository + 73, // 40: gitaly.FindCommitsRequest.global_options:type_name -> gitaly.GlobalOptions + 72, // 41: gitaly.FindCommitsResponse.commits:type_name -> gitaly.GitCommit + 77, // 42: gitaly.FindCommitsError.bad_object:type_name -> gitaly.BadObjectError + 78, // 43: gitaly.FindCommitsError.ambiguous_ref:type_name -> gitaly.AmbiguousReferenceError + 79, // 44: gitaly.FindCommitsError.invalid_range:type_name -> gitaly.InvalidRevisionRange + 69, // 45: gitaly.CommitLanguagesRequest.repository:type_name -> gitaly.Repository + 62, // 46: gitaly.CommitLanguagesResponse.languages:type_name -> gitaly.CommitLanguagesResponse.Language + 69, // 47: gitaly.RawBlameRequest.repository:type_name -> gitaly.Repository + 80, // 48: gitaly.RawBlameError.path_not_found:type_name -> gitaly.PathNotFoundError + 63, // 49: gitaly.RawBlameError.out_of_range:type_name -> gitaly.RawBlameError.OutOfRangeError + 65, // 50: gitaly.RawBlameError.resolve_ignore_revs:type_name -> gitaly.RawBlameError.ResolveIgnoreRevsError + 64, // 51: gitaly.RawBlameError.invalid_ignore_revs_format:type_name -> gitaly.RawBlameError.InvalidIgnoreRevsFormatError + 69, // 52: gitaly.LastCommitForPathRequest.repository:type_name -> gitaly.Repository + 73, // 53: gitaly.LastCommitForPathRequest.global_options:type_name -> gitaly.GlobalOptions + 72, // 54: gitaly.LastCommitForPathResponse.commit:type_name -> gitaly.GitCommit + 69, // 55: gitaly.ListLastCommitsForTreeRequest.repository:type_name -> gitaly.Repository + 73, // 56: gitaly.ListLastCommitsForTreeRequest.global_options:type_name -> gitaly.GlobalOptions + 66, // 57: gitaly.ListLastCommitsForTreeResponse.commits:type_name -> gitaly.ListLastCommitsForTreeResponse.CommitForTree + 69, // 58: gitaly.CommitsByMessageRequest.repository:type_name -> gitaly.Repository + 73, // 59: gitaly.CommitsByMessageRequest.global_options:type_name -> gitaly.GlobalOptions + 72, // 60: gitaly.CommitsByMessageResponse.commits:type_name -> gitaly.GitCommit + 69, // 61: gitaly.FilterShasWithSignaturesRequest.repository:type_name -> gitaly.Repository + 69, // 62: gitaly.GetCommitSignaturesRequest.repository:type_name -> gitaly.Repository 6, // 63: gitaly.GetCommitSignaturesResponse.signer:type_name -> gitaly.GetCommitSignaturesResponse.Signer - 76, // 64: gitaly.GetCommitSignaturesResponse.author:type_name -> gitaly.CommitAuthor - 76, // 65: gitaly.GetCommitSignaturesResponse.committer:type_name -> gitaly.CommitAuthor - 64, // 66: gitaly.GetCommitMessagesRequest.repository:type_name -> gitaly.Repository - 64, // 67: gitaly.CheckObjectsExistRequest.repository:type_name -> gitaly.Repository - 63, // 68: gitaly.CheckObjectsExistResponse.revisions:type_name -> gitaly.CheckObjectsExistResponse.RevisionExistence - 67, // 69: gitaly.ListCommitsByRefNameResponse.CommitForRef.commit:type_name -> gitaly.GitCommit - 67, // 70: gitaly.ListLastCommitsForTreeResponse.CommitForTree.commit:type_name -> gitaly.GitCommit - 7, // 71: gitaly.CommitService.ListCommits:input_type -> gitaly.ListCommitsRequest - 9, // 72: gitaly.CommitService.ListAllCommits:input_type -> gitaly.ListAllCommitsRequest - 13, // 73: gitaly.CommitService.CommitIsAncestor:input_type -> gitaly.CommitIsAncestorRequest - 15, // 74: gitaly.CommitService.TreeEntry:input_type -> gitaly.TreeEntryRequest - 17, // 75: gitaly.CommitService.CountCommits:input_type -> gitaly.CountCommitsRequest - 19, // 76: gitaly.CommitService.CountDivergingCommits:input_type -> gitaly.CountDivergingCommitsRequest - 22, // 77: gitaly.CommitService.GetTreeEntries:input_type -> gitaly.GetTreeEntriesRequest - 25, // 78: gitaly.CommitService.ListFiles:input_type -> gitaly.ListFilesRequest - 27, // 79: gitaly.CommitService.FindCommit:input_type -> gitaly.FindCommitRequest - 11, // 80: gitaly.CommitService.CommitStats:input_type -> gitaly.CommitStatsRequest - 33, // 81: gitaly.CommitService.FindAllCommits:input_type -> gitaly.FindAllCommitsRequest - 35, // 82: gitaly.CommitService.FindCommits:input_type -> gitaly.FindCommitsRequest - 38, // 83: gitaly.CommitService.CommitLanguages:input_type -> gitaly.CommitLanguagesRequest - 40, // 84: gitaly.CommitService.RawBlame:input_type -> gitaly.RawBlameRequest - 43, // 85: gitaly.CommitService.LastCommitForPath:input_type -> gitaly.LastCommitForPathRequest - 45, // 86: gitaly.CommitService.ListLastCommitsForTree:input_type -> gitaly.ListLastCommitsForTreeRequest - 47, // 87: gitaly.CommitService.CommitsByMessage:input_type -> gitaly.CommitsByMessageRequest - 29, // 88: gitaly.CommitService.ListCommitsByOid:input_type -> gitaly.ListCommitsByOidRequest - 31, // 89: gitaly.CommitService.ListCommitsByRefName:input_type -> gitaly.ListCommitsByRefNameRequest - 49, // 90: gitaly.CommitService.FilterShasWithSignatures:input_type -> gitaly.FilterShasWithSignaturesRequest - 51, // 91: gitaly.CommitService.GetCommitSignatures:input_type -> gitaly.GetCommitSignaturesRequest - 53, // 92: gitaly.CommitService.GetCommitMessages:input_type -> gitaly.GetCommitMessagesRequest - 55, // 93: gitaly.CommitService.CheckObjectsExist:input_type -> gitaly.CheckObjectsExistRequest - 8, // 94: gitaly.CommitService.ListCommits:output_type -> gitaly.ListCommitsResponse - 10, // 95: gitaly.CommitService.ListAllCommits:output_type -> gitaly.ListAllCommitsResponse - 14, // 96: gitaly.CommitService.CommitIsAncestor:output_type -> gitaly.CommitIsAncestorResponse - 16, // 97: gitaly.CommitService.TreeEntry:output_type -> gitaly.TreeEntryResponse - 18, // 98: gitaly.CommitService.CountCommits:output_type -> gitaly.CountCommitsResponse - 20, // 99: gitaly.CommitService.CountDivergingCommits:output_type -> gitaly.CountDivergingCommitsResponse - 23, // 100: gitaly.CommitService.GetTreeEntries:output_type -> gitaly.GetTreeEntriesResponse - 26, // 101: gitaly.CommitService.ListFiles:output_type -> gitaly.ListFilesResponse - 28, // 102: gitaly.CommitService.FindCommit:output_type -> gitaly.FindCommitResponse - 12, // 103: gitaly.CommitService.CommitStats:output_type -> gitaly.CommitStatsResponse - 34, // 104: gitaly.CommitService.FindAllCommits:output_type -> gitaly.FindAllCommitsResponse - 36, // 105: gitaly.CommitService.FindCommits:output_type -> gitaly.FindCommitsResponse - 39, // 106: gitaly.CommitService.CommitLanguages:output_type -> gitaly.CommitLanguagesResponse - 41, // 107: gitaly.CommitService.RawBlame:output_type -> gitaly.RawBlameResponse - 44, // 108: gitaly.CommitService.LastCommitForPath:output_type -> gitaly.LastCommitForPathResponse - 46, // 109: gitaly.CommitService.ListLastCommitsForTree:output_type -> gitaly.ListLastCommitsForTreeResponse - 48, // 110: gitaly.CommitService.CommitsByMessage:output_type -> gitaly.CommitsByMessageResponse - 30, // 111: gitaly.CommitService.ListCommitsByOid:output_type -> gitaly.ListCommitsByOidResponse - 32, // 112: gitaly.CommitService.ListCommitsByRefName:output_type -> gitaly.ListCommitsByRefNameResponse - 50, // 113: gitaly.CommitService.FilterShasWithSignatures:output_type -> gitaly.FilterShasWithSignaturesResponse - 52, // 114: gitaly.CommitService.GetCommitSignatures:output_type -> gitaly.GetCommitSignaturesResponse - 54, // 115: gitaly.CommitService.GetCommitMessages:output_type -> gitaly.GetCommitMessagesResponse - 56, // 116: gitaly.CommitService.CheckObjectsExist:output_type -> gitaly.CheckObjectsExistResponse - 94, // [94:117] is the sub-list for method output_type - 71, // [71:94] is the sub-list for method input_type - 71, // [71:71] is the sub-list for extension type_name - 71, // [71:71] is the sub-list for extension extendee - 0, // [0:71] is the sub-list for field type_name + 81, // 64: gitaly.GetCommitSignaturesResponse.author:type_name -> gitaly.CommitAuthor + 81, // 65: gitaly.GetCommitSignaturesResponse.committer:type_name -> gitaly.CommitAuthor + 69, // 66: gitaly.GetCommitMessagesRequest.repository:type_name -> gitaly.Repository + 69, // 67: gitaly.CheckObjectsExistRequest.repository:type_name -> gitaly.Repository + 67, // 68: gitaly.CheckObjectsExistResponse.revisions:type_name -> gitaly.CheckObjectsExistResponse.RevisionExistence + 69, // 69: gitaly.ListContributorsRequest.repository:type_name -> gitaly.Repository + 7, // 70: gitaly.ListContributorsRequest.order:type_name -> gitaly.ListContributorsRequest.SortBy + 8, // 71: gitaly.ListContributorsRequest.contributor_type:type_name -> gitaly.ListContributorsRequest.ContributorType + 68, // 72: gitaly.ListContributorsResponse.contributors:type_name -> gitaly.ListContributorsResponse.Contributor + 72, // 73: gitaly.ListCommitsByRefNameResponse.CommitForRef.commit:type_name -> gitaly.GitCommit + 72, // 74: gitaly.ListLastCommitsForTreeResponse.CommitForTree.commit:type_name -> gitaly.GitCommit + 9, // 75: gitaly.CommitService.ListCommits:input_type -> gitaly.ListCommitsRequest + 11, // 76: gitaly.CommitService.ListAllCommits:input_type -> gitaly.ListAllCommitsRequest + 15, // 77: gitaly.CommitService.CommitIsAncestor:input_type -> gitaly.CommitIsAncestorRequest + 17, // 78: gitaly.CommitService.TreeEntry:input_type -> gitaly.TreeEntryRequest + 19, // 79: gitaly.CommitService.CountCommits:input_type -> gitaly.CountCommitsRequest + 21, // 80: gitaly.CommitService.CountDivergingCommits:input_type -> gitaly.CountDivergingCommitsRequest + 24, // 81: gitaly.CommitService.GetTreeEntries:input_type -> gitaly.GetTreeEntriesRequest + 27, // 82: gitaly.CommitService.ListFiles:input_type -> gitaly.ListFilesRequest + 29, // 83: gitaly.CommitService.FindCommit:input_type -> gitaly.FindCommitRequest + 13, // 84: gitaly.CommitService.CommitStats:input_type -> gitaly.CommitStatsRequest + 35, // 85: gitaly.CommitService.FindAllCommits:input_type -> gitaly.FindAllCommitsRequest + 37, // 86: gitaly.CommitService.FindCommits:input_type -> gitaly.FindCommitsRequest + 40, // 87: gitaly.CommitService.CommitLanguages:input_type -> gitaly.CommitLanguagesRequest + 42, // 88: gitaly.CommitService.RawBlame:input_type -> gitaly.RawBlameRequest + 45, // 89: gitaly.CommitService.LastCommitForPath:input_type -> gitaly.LastCommitForPathRequest + 47, // 90: gitaly.CommitService.ListLastCommitsForTree:input_type -> gitaly.ListLastCommitsForTreeRequest + 49, // 91: gitaly.CommitService.CommitsByMessage:input_type -> gitaly.CommitsByMessageRequest + 31, // 92: gitaly.CommitService.ListCommitsByOid:input_type -> gitaly.ListCommitsByOidRequest + 33, // 93: gitaly.CommitService.ListCommitsByRefName:input_type -> gitaly.ListCommitsByRefNameRequest + 51, // 94: gitaly.CommitService.FilterShasWithSignatures:input_type -> gitaly.FilterShasWithSignaturesRequest + 53, // 95: gitaly.CommitService.GetCommitSignatures:input_type -> gitaly.GetCommitSignaturesRequest + 55, // 96: gitaly.CommitService.GetCommitMessages:input_type -> gitaly.GetCommitMessagesRequest + 57, // 97: gitaly.CommitService.CheckObjectsExist:input_type -> gitaly.CheckObjectsExistRequest + 59, // 98: gitaly.CommitService.ListContributors:input_type -> gitaly.ListContributorsRequest + 10, // 99: gitaly.CommitService.ListCommits:output_type -> gitaly.ListCommitsResponse + 12, // 100: gitaly.CommitService.ListAllCommits:output_type -> gitaly.ListAllCommitsResponse + 16, // 101: gitaly.CommitService.CommitIsAncestor:output_type -> gitaly.CommitIsAncestorResponse + 18, // 102: gitaly.CommitService.TreeEntry:output_type -> gitaly.TreeEntryResponse + 20, // 103: gitaly.CommitService.CountCommits:output_type -> gitaly.CountCommitsResponse + 22, // 104: gitaly.CommitService.CountDivergingCommits:output_type -> gitaly.CountDivergingCommitsResponse + 25, // 105: gitaly.CommitService.GetTreeEntries:output_type -> gitaly.GetTreeEntriesResponse + 28, // 106: gitaly.CommitService.ListFiles:output_type -> gitaly.ListFilesResponse + 30, // 107: gitaly.CommitService.FindCommit:output_type -> gitaly.FindCommitResponse + 14, // 108: gitaly.CommitService.CommitStats:output_type -> gitaly.CommitStatsResponse + 36, // 109: gitaly.CommitService.FindAllCommits:output_type -> gitaly.FindAllCommitsResponse + 38, // 110: gitaly.CommitService.FindCommits:output_type -> gitaly.FindCommitsResponse + 41, // 111: gitaly.CommitService.CommitLanguages:output_type -> gitaly.CommitLanguagesResponse + 43, // 112: gitaly.CommitService.RawBlame:output_type -> gitaly.RawBlameResponse + 46, // 113: gitaly.CommitService.LastCommitForPath:output_type -> gitaly.LastCommitForPathResponse + 48, // 114: gitaly.CommitService.ListLastCommitsForTree:output_type -> gitaly.ListLastCommitsForTreeResponse + 50, // 115: gitaly.CommitService.CommitsByMessage:output_type -> gitaly.CommitsByMessageResponse + 32, // 116: gitaly.CommitService.ListCommitsByOid:output_type -> gitaly.ListCommitsByOidResponse + 34, // 117: gitaly.CommitService.ListCommitsByRefName:output_type -> gitaly.ListCommitsByRefNameResponse + 52, // 118: gitaly.CommitService.FilterShasWithSignatures:output_type -> gitaly.FilterShasWithSignaturesResponse + 54, // 119: gitaly.CommitService.GetCommitSignatures:output_type -> gitaly.GetCommitSignaturesResponse + 56, // 120: gitaly.CommitService.GetCommitMessages:output_type -> gitaly.GetCommitMessagesResponse + 58, // 121: gitaly.CommitService.CheckObjectsExist:output_type -> gitaly.CheckObjectsExistResponse + 60, // 122: gitaly.CommitService.ListContributors:output_type -> gitaly.ListContributorsResponse + 99, // [99:123] is the sub-list for method output_type + 75, // [75:99] is the sub-list for method input_type + 75, // [75:75] is the sub-list for extension type_name + 75, // [75:75] is the sub-list for extension extendee + 0, // [0:75] is the sub-list for field type_name } func init() { file_commit_proto_init() } @@ -5314,8 +5660,8 @@ func file_commit_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_commit_proto_rawDesc), len(file_commit_proto_rawDesc)), - NumEnums: 7, - NumMessages: 57, + NumEnums: 9, + NumMessages: 60, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gitalypb/commit_grpc.pb.go b/proto/go/gitalypb/commit_grpc.pb.go index 2a3f1e8c1ef530db4e2181be2c920f56daa7e1ad..98c5cdb9a246dd5ed2969f2839870e23378f86ca 100644 --- a/proto/go/gitalypb/commit_grpc.pb.go +++ b/proto/go/gitalypb/commit_grpc.pb.go @@ -8,6 +8,7 @@ package gitalypb import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -42,6 +43,7 @@ const ( CommitService_GetCommitSignatures_FullMethodName = "/gitaly.CommitService/GetCommitSignatures" CommitService_GetCommitMessages_FullMethodName = "/gitaly.CommitService/GetCommitMessages" CommitService_CheckObjectsExist_FullMethodName = "/gitaly.CommitService/CheckObjectsExist" + CommitService_ListContributors_FullMethodName = "/gitaly.CommitService/ListContributors" ) // CommitServiceClient is the client API for CommitService service. @@ -120,6 +122,10 @@ type CommitServiceClient interface { // from 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) (grpc.BidiStreamingClient[CheckObjectsExistRequest, CheckObjectsExistResponse], error) + // ListContributors lists all unique contributors to a repository. + // This is optimized for performance using git-shortlog internally, making it + // efficient for repositories of any size including those with millions of commits. + ListContributors(ctx context.Context, in *ListContributorsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ListContributorsResponse], error) } type commitServiceClient struct { @@ -492,6 +498,25 @@ func (c *commitServiceClient) CheckObjectsExist(ctx context.Context, opts ...grp // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type CommitService_CheckObjectsExistClient = grpc.BidiStreamingClient[CheckObjectsExistRequest, CheckObjectsExistResponse] +func (c *commitServiceClient) ListContributors(ctx context.Context, in *ListContributorsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ListContributorsResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &CommitService_ServiceDesc.Streams[16], CommitService_ListContributors_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[ListContributorsRequest, ListContributorsResponse]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type CommitService_ListContributorsClient = grpc.ServerStreamingClient[ListContributorsResponse] + // CommitServiceServer is the server API for CommitService service. // All implementations must embed UnimplementedCommitServiceServer // for forward compatibility. @@ -568,6 +593,10 @@ type CommitServiceServer interface { // from 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(grpc.BidiStreamingServer[CheckObjectsExistRequest, CheckObjectsExistResponse]) error + // ListContributors lists all unique contributors to a repository. + // This is optimized for performance using git-shortlog internally, making it + // efficient for repositories of any size including those with millions of commits. + ListContributors(*ListContributorsRequest, grpc.ServerStreamingServer[ListContributorsResponse]) error mustEmbedUnimplementedCommitServiceServer() } @@ -647,6 +676,9 @@ func (UnimplementedCommitServiceServer) GetCommitMessages(*GetCommitMessagesRequ func (UnimplementedCommitServiceServer) CheckObjectsExist(grpc.BidiStreamingServer[CheckObjectsExistRequest, CheckObjectsExistResponse]) error { return status.Errorf(codes.Unimplemented, "method CheckObjectsExist not implemented") } +func (UnimplementedCommitServiceServer) ListContributors(*ListContributorsRequest, grpc.ServerStreamingServer[ListContributorsResponse]) error { + return status.Errorf(codes.Unimplemented, "method ListContributors not implemented") +} func (UnimplementedCommitServiceServer) mustEmbedUnimplementedCommitServiceServer() {} func (UnimplementedCommitServiceServer) testEmbeddedByValue() {} @@ -962,6 +994,17 @@ func _CommitService_CheckObjectsExist_Handler(srv interface{}, stream grpc.Serve // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type CommitService_CheckObjectsExistServer = grpc.BidiStreamingServer[CheckObjectsExistRequest, CheckObjectsExistResponse] +func _CommitService_ListContributors_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ListContributorsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(CommitServiceServer).ListContributors(m, &grpc.GenericServerStream[ListContributorsRequest, ListContributorsResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type CommitService_ListContributorsServer = grpc.ServerStreamingServer[ListContributorsResponse] + // 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) @@ -1081,6 +1124,11 @@ var CommitService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "ListContributors", + Handler: _CommitService_ListContributors_Handler, + ServerStreams: true, + }, }, Metadata: "commit.proto", }