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

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromiumos/version_bumper/version_bumper.proto

package version_bumper

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 BumpVersionRequest_VersionComponent int32

const (
	BumpVersionRequest_COMPONENT_TYPE_UNSPECIFIED BumpVersionRequest_VersionComponent = 0
	BumpVersionRequest_COMPONENT_TYPE_MILESTONE   BumpVersionRequest_VersionComponent = 1
	BumpVersionRequest_COMPONENT_TYPE_BUILD       BumpVersionRequest_VersionComponent = 2
	BumpVersionRequest_COMPONENT_TYPE_BRANCH      BumpVersionRequest_VersionComponent = 3
	BumpVersionRequest_COMPONENT_TYPE_PATCH       BumpVersionRequest_VersionComponent = 4
)

// Enum value maps for BumpVersionRequest_VersionComponent.
var (
	BumpVersionRequest_VersionComponent_name = map[int32]string{
		0: "COMPONENT_TYPE_UNSPECIFIED",
		1: "COMPONENT_TYPE_MILESTONE",
		2: "COMPONENT_TYPE_BUILD",
		3: "COMPONENT_TYPE_BRANCH",
		4: "COMPONENT_TYPE_PATCH",
	}
	BumpVersionRequest_VersionComponent_value = map[string]int32{
		"COMPONENT_TYPE_UNSPECIFIED": 0,
		"COMPONENT_TYPE_MILESTONE":   1,
		"COMPONENT_TYPE_BUILD":       2,
		"COMPONENT_TYPE_BRANCH":      3,
		"COMPONENT_TYPE_PATCH":       4,
	}
)

func (x BumpVersionRequest_VersionComponent) Enum() *BumpVersionRequest_VersionComponent {
	p := new(BumpVersionRequest_VersionComponent)
	*p = x
	return p
}

func (x BumpVersionRequest_VersionComponent) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (BumpVersionRequest_VersionComponent) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_version_bumper_version_bumper_proto_enumTypes[0].Descriptor()
}

func (BumpVersionRequest_VersionComponent) Type() protoreflect.EnumType {
	return &file_chromiumos_version_bumper_version_bumper_proto_enumTypes[0]
}

func (x BumpVersionRequest_VersionComponent) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use BumpVersionRequest_VersionComponent.Descriptor instead.
func (BumpVersionRequest_VersionComponent) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_version_bumper_version_bumper_proto_rawDescGZIP(), []int{0, 0}
}

// BumpVersionRequest is the input for the Go-based version_bumper.
type BumpVersionRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Full path to checkout of chromiumos-overlay repo.
	ChromiumosOverlayRepo string `protobuf:"bytes,1,opt,name=chromiumosOverlayRepo,proto3" json:"chromiumosOverlayRepo,omitempty"`
	// Component of the ChromeOS version to bump.
	ComponentToBump BumpVersionRequest_VersionComponent `protobuf:"varint,2,opt,name=componentToBump,proto3,enum=chromiumos.version_bumper.BumpVersionRequest_VersionComponent" json:"componentToBump,omitempty"`
}

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

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

func (*BumpVersionRequest) ProtoMessage() {}

func (x *BumpVersionRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_version_bumper_version_bumper_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 BumpVersionRequest.ProtoReflect.Descriptor instead.
func (*BumpVersionRequest) Descriptor() ([]byte, []int) {
	return file_chromiumos_version_bumper_version_bumper_proto_rawDescGZIP(), []int{0}
}

func (x *BumpVersionRequest) GetChromiumosOverlayRepo() string {
	if x != nil {
		return x.ChromiumosOverlayRepo
	}
	return ""
}

func (x *BumpVersionRequest) GetComponentToBump() BumpVersionRequest_VersionComponent {
	if x != nil {
		return x.ComponentToBump
	}
	return BumpVersionRequest_COMPONENT_TYPE_UNSPECIFIED
}

// BumpVersionResponse is the output for the Go-based version_bumper.
type BumpVersionResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A markdown string that should be used in Buildbucket as a summary of the
	// version_bumper execution.
	ErrorSummaryMarkdown string `protobuf:"bytes,1,opt,name=error_summary_markdown,json=errorSummaryMarkdown,proto3" json:"error_summary_markdown,omitempty"`
}

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

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

func (*BumpVersionResponse) ProtoMessage() {}

func (x *BumpVersionResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_version_bumper_version_bumper_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 BumpVersionResponse.ProtoReflect.Descriptor instead.
func (*BumpVersionResponse) Descriptor() ([]byte, []int) {
	return file_chromiumos_version_bumper_version_bumper_proto_rawDescGZIP(), []int{1}
}

func (x *BumpVersionResponse) GetErrorSummaryMarkdown() string {
	if x != nil {
		return x.ErrorSummaryMarkdown
	}
	return ""
}

var File_chromiumos_version_bumper_version_bumper_proto protoreflect.FileDescriptor

var file_chromiumos_version_bumper_version_bumper_proto_rawDesc = []byte{
	0x0a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x65, 0x72, 0x2f, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x19, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x76, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x65, 0x72, 0x22, 0xd6, 0x02, 0x0a, 0x12,
	0x42, 0x75, 0x6d, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x15, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x4f, 0x76, 0x65,
	0x72, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x68, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70,
	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x3e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x76,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x75,
	0x6d, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e,
	0x74, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75,
	0x6d, 0x70, 0x22, 0x9f, 0x01, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f,
	0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x4d, 0x50, 0x4f,
	0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4d, 0x50, 0x4f,
	0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x49, 0x4c, 0x45, 0x53, 0x54,
	0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45,
	0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12,
	0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50,
	0x45, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f,
	0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x54,
	0x43, 0x48, 0x10, 0x04, 0x22, 0x4b, 0x0a, 0x13, 0x42, 0x75, 0x6d, 0x70, 0x56, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65,
	0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x72,
	0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x65, 0x72, 0x72,
	0x6f, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77,
	0x6e, 0x42, 0x45, 0x5a, 0x43, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f,
	0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x5f, 0x62, 0x75, 0x6d, 0x70, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_version_bumper_version_bumper_proto_rawDescOnce sync.Once
	file_chromiumos_version_bumper_version_bumper_proto_rawDescData = file_chromiumos_version_bumper_version_bumper_proto_rawDesc
)

func file_chromiumos_version_bumper_version_bumper_proto_rawDescGZIP() []byte {
	file_chromiumos_version_bumper_version_bumper_proto_rawDescOnce.Do(func() {
		file_chromiumos_version_bumper_version_bumper_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_version_bumper_version_bumper_proto_rawDescData)
	})
	return file_chromiumos_version_bumper_version_bumper_proto_rawDescData
}

var file_chromiumos_version_bumper_version_bumper_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromiumos_version_bumper_version_bumper_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_chromiumos_version_bumper_version_bumper_proto_goTypes = []interface{}{
	(BumpVersionRequest_VersionComponent)(0), // 0: chromiumos.version_bumper.BumpVersionRequest.VersionComponent
	(*BumpVersionRequest)(nil),               // 1: chromiumos.version_bumper.BumpVersionRequest
	(*BumpVersionResponse)(nil),              // 2: chromiumos.version_bumper.BumpVersionResponse
}
var file_chromiumos_version_bumper_version_bumper_proto_depIdxs = []int32{
	0, // 0: chromiumos.version_bumper.BumpVersionRequest.componentToBump:type_name -> chromiumos.version_bumper.BumpVersionRequest.VersionComponent
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_chromiumos_version_bumper_version_bumper_proto_init() }
func file_chromiumos_version_bumper_version_bumper_proto_init() {
	if File_chromiumos_version_bumper_version_bumper_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_version_bumper_version_bumper_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BumpVersionRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_version_bumper_version_bumper_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BumpVersionResponse); 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_chromiumos_version_bumper_version_bumper_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_version_bumper_version_bumper_proto_goTypes,
		DependencyIndexes: file_chromiumos_version_bumper_version_bumper_proto_depIdxs,
		EnumInfos:         file_chromiumos_version_bumper_version_bumper_proto_enumTypes,
		MessageInfos:      file_chromiumos_version_bumper_version_bumper_proto_msgTypes,
	}.Build()
	File_chromiumos_version_bumper_version_bumper_proto = out.File
	file_chromiumos_version_bumper_version_bumper_proto_rawDesc = nil
	file_chromiumos_version_bumper_version_bumper_proto_goTypes = nil
	file_chromiumos_version_bumper_version_bumper_proto_depIdxs = nil
}
