// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// https://developers.google.com/protocol-buffers/docs/proto3

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.18.1
// source: api.proto

package apipb

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type HasAncestorRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Commit   string `protobuf:"bytes,1,opt,name=commit,proto3" json:"commit,omitempty"`     // full git commit hash (subject of query)
	Ancestor string `protobuf:"bytes,2,opt,name=ancestor,proto3" json:"ancestor,omitempty"` // full git commit hash of sought ancestor
}

func (x *HasAncestorRequest) Reset() {
	*x = HasAncestorRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HasAncestorRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HasAncestorRequest) ProtoMessage() {}

func (x *HasAncestorRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HasAncestorRequest.ProtoReflect.Descriptor instead.
func (*HasAncestorRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{0}
}

func (x *HasAncestorRequest) GetCommit() string {
	if x != nil {
		return x.Commit
	}
	return ""
}

func (x *HasAncestorRequest) GetAncestor() string {
	if x != nil {
		return x.Ancestor
	}
	return ""
}

type HasAncestorResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// has_ancestor is whether ancestor appears in commit's history.
	HasAncestor bool `protobuf:"varint,1,opt,name=has_ancestor,json=hasAncestor,proto3" json:"has_ancestor,omitempty"`
	// unknown_commit is true if the provided commit was unknown.
	UnknownCommit bool `protobuf:"varint,2,opt,name=unknown_commit,json=unknownCommit,proto3" json:"unknown_commit,omitempty"`
}

func (x *HasAncestorResponse) Reset() {
	*x = HasAncestorResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HasAncestorResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HasAncestorResponse) ProtoMessage() {}

func (x *HasAncestorResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HasAncestorResponse.ProtoReflect.Descriptor instead.
func (*HasAncestorResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{1}
}

func (x *HasAncestorResponse) GetHasAncestor() bool {
	if x != nil {
		return x.HasAncestor
	}
	return false
}

func (x *HasAncestorResponse) GetUnknownCommit() bool {
	if x != nil {
		return x.UnknownCommit
	}
	return false
}

type GetRefRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Ref string `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"` // "HEAD", "refs/heads/master", etc.
	// Either gerrit_server & gerrit_project must be specified, or
	// github. Currently only Gerrit is supported.
	GerritServer  string `protobuf:"bytes,2,opt,name=gerrit_server,json=gerritServer,proto3" json:"gerrit_server,omitempty"`    // "go.googlesource.com"
	GerritProject string `protobuf:"bytes,3,opt,name=gerrit_project,json=gerritProject,proto3" json:"gerrit_project,omitempty"` // "go"
}

func (x *GetRefRequest) Reset() {
	*x = GetRefRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetRefRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetRefRequest) ProtoMessage() {}

func (x *GetRefRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetRefRequest.ProtoReflect.Descriptor instead.
func (*GetRefRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{2}
}

func (x *GetRefRequest) GetRef() string {
	if x != nil {
		return x.Ref
	}
	return ""
}

func (x *GetRefRequest) GetGerritServer() string {
	if x != nil {
		return x.GerritServer
	}
	return ""
}

func (x *GetRefRequest) GetGerritProject() string {
	if x != nil {
		return x.GerritProject
	}
	return ""
}

type GetRefResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // git commit, or empty string on miss
}

func (x *GetRefResponse) Reset() {
	*x = GetRefResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetRefResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetRefResponse) ProtoMessage() {}

func (x *GetRefResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetRefResponse.ProtoReflect.Descriptor instead.
func (*GetRefResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{3}
}

func (x *GetRefResponse) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

type GoFindTryWorkRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// for_staging says whether this is a trybot request for the staging
	// cluster. When using staging, the comment "Run-StagingTryBot"
	// is used instead of label:Run-TryBot=1.
	ForStaging bool `protobuf:"varint,1,opt,name=for_staging,json=forStaging,proto3" json:"for_staging,omitempty"`
}

func (x *GoFindTryWorkRequest) Reset() {
	*x = GoFindTryWorkRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GoFindTryWorkRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GoFindTryWorkRequest) ProtoMessage() {}

func (x *GoFindTryWorkRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GoFindTryWorkRequest.ProtoReflect.Descriptor instead.
func (*GoFindTryWorkRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{4}
}

func (x *GoFindTryWorkRequest) GetForStaging() bool {
	if x != nil {
		return x.ForStaging
	}
	return false
}

type GoFindTryWorkResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// waiting are the Gerrit CLs wanting a trybot run and not yet with results.
	// These might already be running.
	Waiting []*GerritTryWorkItem `protobuf:"bytes,1,rep,name=waiting,proto3" json:"waiting,omitempty"`
}

func (x *GoFindTryWorkResponse) Reset() {
	*x = GoFindTryWorkResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GoFindTryWorkResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GoFindTryWorkResponse) ProtoMessage() {}

func (x *GoFindTryWorkResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GoFindTryWorkResponse.ProtoReflect.Descriptor instead.
func (*GoFindTryWorkResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{5}
}

func (x *GoFindTryWorkResponse) GetWaiting() []*GerritTryWorkItem {
	if x != nil {
		return x.Waiting
	}
	return nil
}

type GerritTryWorkItem struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Project  string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`                   // "go", "net", etc. (Gerrit Project)
	Branch   string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"`                     // "master", "release-branch.go1.8", etc.
	ChangeId string `protobuf:"bytes,3,opt,name=change_id,json=changeId,proto3" json:"change_id,omitempty"` // "I1a27695838409259d1586a0adfa9f92bccf7ceba"
	Commit   string `protobuf:"bytes,4,opt,name=commit,proto3" json:"commit,omitempty"`                     // "ecf3dffc81dc21408fb02159af352651882a8383"
	Version  int32  `protobuf:"varint,9,opt,name=version,proto3" json:"version,omitempty"`                  // which Gerrit revision number commit is
	// go_commit is set for subrepos and is the Go commit(s) to test against.
	// go_branch is a branch name of go_commit, for showing to users when
	// a try set fails.
	GoCommit []string `protobuf:"bytes,5,rep,name=go_commit,json=goCommit,proto3" json:"go_commit,omitempty"` // "4833e920c1d7f6b23458e6ff3c73951fcf754219"
	GoBranch []string `protobuf:"bytes,6,rep,name=go_branch,json=goBranch,proto3" json:"go_branch,omitempty"` // "master", "release-branch.go1.8", etc.
	// go_version specifies the major and minor version of the targeted Go toolchain.
	// For Go repo, it contains exactly one element.
	// For subrepos, it contains elements that correspond to go_commit.
	GoVersion []*MajorMinor `protobuf:"bytes,7,rep,name=go_version,json=goVersion,proto3" json:"go_version,omitempty"`
	// try_message is the list of TRY=xxxx messages associated with Run-TryBot votes.
	// It's sorted from oldest to newest.
	TryMessage []*TryVoteMessage `protobuf:"bytes,8,rep,name=try_message,json=tryMessage,proto3" json:"try_message,omitempty"`
}

func (x *GerritTryWorkItem) Reset() {
	*x = GerritTryWorkItem{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GerritTryWorkItem) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GerritTryWorkItem) ProtoMessage() {}

func (x *GerritTryWorkItem) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GerritTryWorkItem.ProtoReflect.Descriptor instead.
func (*GerritTryWorkItem) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{6}
}

func (x *GerritTryWorkItem) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *GerritTryWorkItem) GetBranch() string {
	if x != nil {
		return x.Branch
	}
	return ""
}

func (x *GerritTryWorkItem) GetChangeId() string {
	if x != nil {
		return x.ChangeId
	}
	return ""
}

func (x *GerritTryWorkItem) GetCommit() string {
	if x != nil {
		return x.Commit
	}
	return ""
}

func (x *GerritTryWorkItem) GetVersion() int32 {
	if x != nil {
		return x.Version
	}
	return 0
}

func (x *GerritTryWorkItem) GetGoCommit() []string {
	if x != nil {
		return x.GoCommit
	}
	return nil
}

func (x *GerritTryWorkItem) GetGoBranch() []string {
	if x != nil {
		return x.GoBranch
	}
	return nil
}

func (x *GerritTryWorkItem) GetGoVersion() []*MajorMinor {
	if x != nil {
		return x.GoVersion
	}
	return nil
}

func (x *GerritTryWorkItem) GetTryMessage() []*TryVoteMessage {
	if x != nil {
		return x.TryMessage
	}
	return nil
}

type TryVoteMessage struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Message  string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`                    // just the part after "TRY=" until end of line, without \n
	AuthorId int64  `protobuf:"varint,2,opt,name=author_id,json=authorId,proto3" json:"author_id,omitempty"` // Gerrit-internal ID
	Version  int32  `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"`                   // revision number comment was for
}

func (x *TryVoteMessage) Reset() {
	*x = TryVoteMessage{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TryVoteMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TryVoteMessage) ProtoMessage() {}

func (x *TryVoteMessage) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TryVoteMessage.ProtoReflect.Descriptor instead.
func (*TryVoteMessage) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{7}
}

func (x *TryVoteMessage) GetMessage() string {
	if x != nil {
		return x.Message
	}
	return ""
}

func (x *TryVoteMessage) GetAuthorId() int64 {
	if x != nil {
		return x.AuthorId
	}
	return 0
}

func (x *TryVoteMessage) GetVersion() int32 {
	if x != nil {
		return x.Version
	}
	return 0
}

type MajorMinor struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
}

func (x *MajorMinor) Reset() {
	*x = MajorMinor{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *MajorMinor) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MajorMinor) ProtoMessage() {}

func (x *MajorMinor) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use MajorMinor.ProtoReflect.Descriptor instead.
func (*MajorMinor) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{8}
}

func (x *MajorMinor) GetMajor() int32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *MajorMinor) GetMinor() int32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

type ListGoReleasesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *ListGoReleasesRequest) Reset() {
	*x = ListGoReleasesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListGoReleasesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListGoReleasesRequest) ProtoMessage() {}

func (x *ListGoReleasesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListGoReleasesRequest.ProtoReflect.Descriptor instead.
func (*ListGoReleasesRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{9}
}

type ListGoReleasesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Releases []*GoRelease `protobuf:"bytes,1,rep,name=releases,proto3" json:"releases,omitempty"`
}

func (x *ListGoReleasesResponse) Reset() {
	*x = ListGoReleasesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListGoReleasesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListGoReleasesResponse) ProtoMessage() {}

func (x *ListGoReleasesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListGoReleasesResponse.ProtoReflect.Descriptor instead.
func (*ListGoReleasesResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{10}
}

func (x *ListGoReleasesResponse) GetReleases() []*GoRelease {
	if x != nil {
		return x.Releases
	}
	return nil
}

type GoRelease struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major     int32  `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor     int32  `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	Patch     int32  `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"`
	TagName   string `protobuf:"bytes,4,opt,name=tag_name,json=tagName,proto3" json:"tag_name,omitempty"`       // "go1.11.1", etc.
	TagCommit string `protobuf:"bytes,5,opt,name=tag_commit,json=tagCommit,proto3" json:"tag_commit,omitempty"` // "26957168c4c0cdcc7ca4f0b19d0eb19474d224ac"
	// Release branch information for this major-minor version pair.
	BranchName   string `protobuf:"bytes,6,opt,name=branch_name,json=branchName,proto3" json:"branch_name,omitempty"`       // "release-branch.go1.11", etc.
	BranchCommit string `protobuf:"bytes,7,opt,name=branch_commit,json=branchCommit,proto3" json:"branch_commit,omitempty"` // most recent commit on the release branch, e.g., "edb6c16b9b62ed8586d2e3e422911d646095b7e5"
}

func (x *GoRelease) Reset() {
	*x = GoRelease{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GoRelease) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GoRelease) ProtoMessage() {}

func (x *GoRelease) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GoRelease.ProtoReflect.Descriptor instead.
func (*GoRelease) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{11}
}

func (x *GoRelease) GetMajor() int32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *GoRelease) GetMinor() int32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

func (x *GoRelease) GetPatch() int32 {
	if x != nil {
		return x.Patch
	}
	return 0
}

func (x *GoRelease) GetTagName() string {
	if x != nil {
		return x.TagName
	}
	return ""
}

func (x *GoRelease) GetTagCommit() string {
	if x != nil {
		return x.TagCommit
	}
	return ""
}

func (x *GoRelease) GetBranchName() string {
	if x != nil {
		return x.BranchName
	}
	return ""
}

func (x *GoRelease) GetBranchCommit() string {
	if x != nil {
		return x.BranchCommit
	}
	return ""
}

type DashboardRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// page is the zero-based page number.
	// TODO: deprecate, replace with time or commit continuation token.
	Page int32 `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"`
	// repo is which repo to show ("go", "golang.org/x/net", "" means go).
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// branch specifies which branch to show ("master", "release-branch.go1.13").
	// Empty means "master".
	// The special branch value "mixed" means to blend together all branches by commit time.
	Branch string `protobuf:"bytes,3,opt,name=branch,proto3" json:"branch,omitempty"`
	// max_commits specifies the number of commits that are desired.
	// Zero means to use a default.
	MaxCommits int32 `protobuf:"varint,4,opt,name=max_commits,json=maxCommits,proto3" json:"max_commits,omitempty"`
}

func (x *DashboardRequest) Reset() {
	*x = DashboardRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DashboardRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DashboardRequest) ProtoMessage() {}

func (x *DashboardRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[12]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DashboardRequest.ProtoReflect.Descriptor instead.
func (*DashboardRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{12}
}

func (x *DashboardRequest) GetPage() int32 {
	if x != nil {
		return x.Page
	}
	return 0
}

func (x *DashboardRequest) GetRepo() string {
	if x != nil {
		return x.Repo
	}
	return ""
}

func (x *DashboardRequest) GetBranch() string {
	if x != nil {
		return x.Branch
	}
	return ""
}

func (x *DashboardRequest) GetMaxCommits() int32 {
	if x != nil {
		return x.MaxCommits
	}
	return 0
}

type DashboardResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// commits are the commits to display, starting with the newest.
	Commits []*DashCommit `protobuf:"bytes,1,rep,name=commits,proto3" json:"commits,omitempty"`
	// commits_truncated is whether the returned commits were truncated.
	CommitsTruncated bool `protobuf:"varint,5,opt,name=commits_truncated,json=commitsTruncated,proto3" json:"commits_truncated,omitempty"`
	// repo_heads contains the current head commit (of their master
	// branch) for every repo on Go's Gerrit server.
	RepoHeads []*DashRepoHead `protobuf:"bytes,2,rep,name=repo_heads,json=repoHeads,proto3" json:"repo_heads,omitempty"`
	Branches  []string        `protobuf:"bytes,3,rep,name=branches,proto3" json:"branches,omitempty"`
	// releases is the same content is ListGoReleasesResponse, but with the addition of a "master"
	// release first, containing the info for the "master" branch, which is just commits[0]
	// if page 0. But if page != 0, the master head wouldn't be
	// available otherwise, so we denormalize it a bit here:
	// It's sorted from newest to oldest (master, release-branch.go1.latest, release-branch.go1.prior)
	// Only the branch_name and branch_commit fields are guaranteed to be populated.
	Releases []*GoRelease `protobuf:"bytes,4,rep,name=releases,proto3" json:"releases,omitempty"`
}

func (x *DashboardResponse) Reset() {
	*x = DashboardResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DashboardResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DashboardResponse) ProtoMessage() {}

func (x *DashboardResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[13]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DashboardResponse.ProtoReflect.Descriptor instead.
func (*DashboardResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{13}
}

func (x *DashboardResponse) GetCommits() []*DashCommit {
	if x != nil {
		return x.Commits
	}
	return nil
}

func (x *DashboardResponse) GetCommitsTruncated() bool {
	if x != nil {
		return x.CommitsTruncated
	}
	return false
}

func (x *DashboardResponse) GetRepoHeads() []*DashRepoHead {
	if x != nil {
		return x.RepoHeads
	}
	return nil
}

func (x *DashboardResponse) GetBranches() []string {
	if x != nil {
		return x.Branches
	}
	return nil
}

func (x *DashboardResponse) GetReleases() []*GoRelease {
	if x != nil {
		return x.Releases
	}
	return nil
}

type DashCommit struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// commit is the git commit hash ("26957168c4c0cdcc7ca4f0b19d0eb19474d224ac").
	Commit string `protobuf:"bytes,1,opt,name=commit,proto3" json:"commit,omitempty"`
	// author_name is the git author name part ("Foo Bar").
	AuthorName string `protobuf:"bytes,2,opt,name=author_name,json=authorName,proto3" json:"author_name,omitempty"` // "Foo Bar"
	// author_email is the git author email part ("foo@bar.com").
	AuthorEmail string `protobuf:"bytes,3,opt,name=author_email,json=authorEmail,proto3" json:"author_email,omitempty"` // "foo@bar.com"
	// commit_time_sec is the timestamp of git commit time, in unix seconds.
	CommitTimeSec int64 `protobuf:"varint,4,opt,name=commit_time_sec,json=commitTimeSec,proto3" json:"commit_time_sec,omitempty"`
	// title is the git commit's first line ("runtime: fix all the bugs").
	Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"`
	// branch is the branch this commit was queried from ("master", "release-branch.go1.14")/
	// This is normally redundant but is useful when DashboardRequest.branch == "mixed".
	Branch string `protobuf:"bytes,7,opt,name=branch,proto3" json:"branch,omitempty"`
	// For non-go repos, go_commit_at_time is what the Go master commit was at
	// the time of DashCommit.commit_time.
	GoCommitAtTime string `protobuf:"bytes,6,opt,name=go_commit_at_time,json=goCommitAtTime,proto3" json:"go_commit_at_time,omitempty"`
	// For non-go repos, go_commit_latest is the most recent Go master commit that's
	// older than the the following x/foo commit's commit_time.
	// If DashCommit is the current HEAD, go_commit_at_time can continue to update.
	// go_commit_at_time might be the same as go_commit_at_time.
	GoCommitLatest string `protobuf:"bytes,8,opt,name=go_commit_latest,json=goCommitLatest,proto3" json:"go_commit_latest,omitempty"`
}

func (x *DashCommit) Reset() {
	*x = DashCommit{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DashCommit) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DashCommit) ProtoMessage() {}

func (x *DashCommit) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[14]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DashCommit.ProtoReflect.Descriptor instead.
func (*DashCommit) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{14}
}

func (x *DashCommit) GetCommit() string {
	if x != nil {
		return x.Commit
	}
	return ""
}

func (x *DashCommit) GetAuthorName() string {
	if x != nil {
		return x.AuthorName
	}
	return ""
}

func (x *DashCommit) GetAuthorEmail() string {
	if x != nil {
		return x.AuthorEmail
	}
	return ""
}

func (x *DashCommit) GetCommitTimeSec() int64 {
	if x != nil {
		return x.CommitTimeSec
	}
	return 0
}

func (x *DashCommit) GetTitle() string {
	if x != nil {
		return x.Title
	}
	return ""
}

func (x *DashCommit) GetBranch() string {
	if x != nil {
		return x.Branch
	}
	return ""
}

func (x *DashCommit) GetGoCommitAtTime() string {
	if x != nil {
		return x.GoCommitAtTime
	}
	return ""
}

func (x *DashCommit) GetGoCommitLatest() string {
	if x != nil {
		return x.GoCommitLatest
	}
	return ""
}

type DashRepoHead struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// gerrit_project is Gerrit project name ("net", "go").
	GerritProject string `protobuf:"bytes,1,opt,name=gerrit_project,json=gerritProject,proto3" json:"gerrit_project,omitempty"`
	// commit is the current top-level commit in that project.
	// (currently always on the master branch)
	Commit *DashCommit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
}

func (x *DashRepoHead) Reset() {
	*x = DashRepoHead{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DashRepoHead) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DashRepoHead) ProtoMessage() {}

func (x *DashRepoHead) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_msgTypes[15]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DashRepoHead.ProtoReflect.Descriptor instead.
func (*DashRepoHead) Descriptor() ([]byte, []int) {
	return file_api_proto_rawDescGZIP(), []int{15}
}

func (x *DashRepoHead) GetGerritProject() string {
	if x != nil {
		return x.GerritProject
	}
	return ""
}

func (x *DashRepoHead) GetCommit() *DashCommit {
	if x != nil {
		return x.Commit
	}
	return nil
}

var File_api_proto protoreflect.FileDescriptor

var file_api_proto_rawDesc = []byte{
	0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x61, 0x70, 0x69,
	0x70, 0x62, 0x22, 0x48, 0x0a, 0x12, 0x48, 0x61, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f,
	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
	0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
	0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x22, 0x5f, 0x0a, 0x13,
	0x48, 0x61, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x61, 0x6e, 0x63, 0x65, 0x73,
	0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x41, 0x6e,
	0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77,
	0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d,
	0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x22, 0x6d, 0x0a,
	0x0d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10,
	0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66,
	0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65,
	0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x53,
	0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f,
	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67,
	0x65, 0x72, 0x72, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x26, 0x0a, 0x0e,
	0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
	0x61, 0x6c, 0x75, 0x65, 0x22, 0x37, 0x0a, 0x14, 0x47, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x54, 0x72,
	0x79, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b,
	0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x22, 0x4b, 0x0a,
	0x15, 0x47, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x54, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e,
	0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e,
	0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x54, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x49, 0x74, 0x65,
	0x6d, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xb8, 0x02, 0x0a, 0x11, 0x47,
	0x65, 0x72, 0x72, 0x69, 0x74, 0x54, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x49, 0x74, 0x65, 0x6d,
	0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72,
	0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e,
	0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x12,
	0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x05,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x67, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1b,
	0x0a, 0x09, 0x67, 0x6f, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x06, 0x20, 0x03, 0x28,
	0x09, 0x52, 0x08, 0x67, 0x6f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x0a, 0x67,
	0x6f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x11, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x4d, 0x69, 0x6e,
	0x6f, 0x72, 0x52, 0x09, 0x67, 0x6f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a,
	0x0b, 0x74, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x79, 0x56, 0x6f,
	0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0a, 0x74, 0x72, 0x79, 0x4d, 0x65,
	0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x61, 0x0a, 0x0e, 0x54, 0x72, 0x79, 0x56, 0x6f, 0x74, 0x65,
	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
	0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x18,
	0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,
	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x38, 0x0a, 0x0a, 0x4d, 0x61, 0x6a, 0x6f,
	0x72, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05,
	0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e,
	0x6f, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65,
	0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x46, 0x0a, 0x16, 0x4c,
	0x69, 0x73, 0x74, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e,
	0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x65, 0x61,
	0x73, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x09, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73,
	0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a,
	0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61,
	0x74, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d,
	0x0a, 0x0a, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a,
	0x0b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23,
	0x0a, 0x0d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18,
	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x43, 0x6f, 0x6d,
	0x6d, 0x69, 0x74, 0x22, 0x73, 0x0a, 0x10, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72,
	0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12,
	0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x63,
	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61,
	0x78, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x11, 0x44, 0x61, 0x73,
	0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b,
	0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x11, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6d, 0x6d,
	0x69, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63,
	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x54,
	0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f,
	0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61,
	0x70, 0x69, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x48, 0x65, 0x61,
	0x64, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6f, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x65,
	0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69,
	0x70, 0x62, 0x2e, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65,
	0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x22, 0x93, 0x02, 0x0a, 0x0a, 0x44, 0x61, 0x73, 0x68, 0x43,
	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a,
	0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21,
	0x0a, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x45, 0x6d, 0x61, 0x69,
	0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65,
	0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d,
	0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74,
	0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12,
	0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x11, 0x67, 0x6f, 0x5f, 0x63, 0x6f,
	0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0e, 0x67, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x41, 0x74, 0x54, 0x69,
	0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f,
	0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x6f,
	0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x0c,
	0x44, 0x61, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x48, 0x65, 0x61, 0x64, 0x12, 0x25, 0x0a, 0x0e,
	0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x50, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x73, 0x68,
	0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x32, 0xec,
	0x02, 0x0a, 0x0f, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69,
	0x63, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x48, 0x61, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f,
	0x72, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x41, 0x6e, 0x63,
	0x65, 0x73, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61,
	0x70, 0x69, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52,
	0x65, 0x66, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,
	0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62,
	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x4a, 0x0a, 0x0d, 0x47, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x54, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b,
	0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x54,
	0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,
	0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x54, 0x72, 0x79, 0x57,
	0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x4c,
	0x69, 0x73, 0x74, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x12, 0x1c, 0x2e,
	0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65,
	0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70,
	0x69, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73,
	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x47, 0x65,
	0x74, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69,
	0x70, 0x62, 0x2e, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x73, 0x68,
	0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a,
	0x2b, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x2f, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x6e, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x69,
	0x6e, 0x74, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_api_proto_rawDescOnce sync.Once
	file_api_proto_rawDescData = file_api_proto_rawDesc
)

func file_api_proto_rawDescGZIP() []byte {
	file_api_proto_rawDescOnce.Do(func() {
		file_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_proto_rawDescData)
	})
	return file_api_proto_rawDescData
}

var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
var file_api_proto_goTypes = []interface{}{
	(*HasAncestorRequest)(nil),     // 0: apipb.HasAncestorRequest
	(*HasAncestorResponse)(nil),    // 1: apipb.HasAncestorResponse
	(*GetRefRequest)(nil),          // 2: apipb.GetRefRequest
	(*GetRefResponse)(nil),         // 3: apipb.GetRefResponse
	(*GoFindTryWorkRequest)(nil),   // 4: apipb.GoFindTryWorkRequest
	(*GoFindTryWorkResponse)(nil),  // 5: apipb.GoFindTryWorkResponse
	(*GerritTryWorkItem)(nil),      // 6: apipb.GerritTryWorkItem
	(*TryVoteMessage)(nil),         // 7: apipb.TryVoteMessage
	(*MajorMinor)(nil),             // 8: apipb.MajorMinor
	(*ListGoReleasesRequest)(nil),  // 9: apipb.ListGoReleasesRequest
	(*ListGoReleasesResponse)(nil), // 10: apipb.ListGoReleasesResponse
	(*GoRelease)(nil),              // 11: apipb.GoRelease
	(*DashboardRequest)(nil),       // 12: apipb.DashboardRequest
	(*DashboardResponse)(nil),      // 13: apipb.DashboardResponse
	(*DashCommit)(nil),             // 14: apipb.DashCommit
	(*DashRepoHead)(nil),           // 15: apipb.DashRepoHead
}
var file_api_proto_depIdxs = []int32{
	6,  // 0: apipb.GoFindTryWorkResponse.waiting:type_name -> apipb.GerritTryWorkItem
	8,  // 1: apipb.GerritTryWorkItem.go_version:type_name -> apipb.MajorMinor
	7,  // 2: apipb.GerritTryWorkItem.try_message:type_name -> apipb.TryVoteMessage
	11, // 3: apipb.ListGoReleasesResponse.releases:type_name -> apipb.GoRelease
	14, // 4: apipb.DashboardResponse.commits:type_name -> apipb.DashCommit
	15, // 5: apipb.DashboardResponse.repo_heads:type_name -> apipb.DashRepoHead
	11, // 6: apipb.DashboardResponse.releases:type_name -> apipb.GoRelease
	14, // 7: apipb.DashRepoHead.commit:type_name -> apipb.DashCommit
	0,  // 8: apipb.MaintnerService.HasAncestor:input_type -> apipb.HasAncestorRequest
	2,  // 9: apipb.MaintnerService.GetRef:input_type -> apipb.GetRefRequest
	4,  // 10: apipb.MaintnerService.GoFindTryWork:input_type -> apipb.GoFindTryWorkRequest
	9,  // 11: apipb.MaintnerService.ListGoReleases:input_type -> apipb.ListGoReleasesRequest
	12, // 12: apipb.MaintnerService.GetDashboard:input_type -> apipb.DashboardRequest
	1,  // 13: apipb.MaintnerService.HasAncestor:output_type -> apipb.HasAncestorResponse
	3,  // 14: apipb.MaintnerService.GetRef:output_type -> apipb.GetRefResponse
	5,  // 15: apipb.MaintnerService.GoFindTryWork:output_type -> apipb.GoFindTryWorkResponse
	10, // 16: apipb.MaintnerService.ListGoReleases:output_type -> apipb.ListGoReleasesResponse
	13, // 17: apipb.MaintnerService.GetDashboard:output_type -> apipb.DashboardResponse
	13, // [13:18] is the sub-list for method output_type
	8,  // [8:13] is the sub-list for method input_type
	8,  // [8:8] is the sub-list for extension type_name
	8,  // [8:8] is the sub-list for extension extendee
	0,  // [0:8] is the sub-list for field type_name
}

func init() { file_api_proto_init() }
func file_api_proto_init() {
	if File_api_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HasAncestorRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HasAncestorResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRefRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRefResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GoFindTryWorkRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GoFindTryWorkResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GerritTryWorkItem); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TryVoteMessage); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MajorMinor); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListGoReleasesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListGoReleasesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GoRelease); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DashboardRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DashboardResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DashCommit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DashRepoHead); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_api_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   16,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_api_proto_goTypes,
		DependencyIndexes: file_api_proto_depIdxs,
		MessageInfos:      file_api_proto_msgTypes,
	}.Build()
	File_api_proto = out.File
	file_api_proto_rawDesc = nil
	file_api_proto_goTypes = nil
	file_api_proto_depIdxs = nil
}
