// Copyright 2020 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: prototype/milestone.proto

package prototype

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)
)

// Defines planning details around release milestones that drive
// branching, device project planning, and release CI/testing.
type Milestone struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// E.g. 86
	Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"`
	// Initially planned branch date for the milestone.
	TargetBranchDate *Milestone_Date `protobuf:"bytes,2,opt,name=target_branch_date,json=targetBranchDate,proto3" json:"target_branch_date,omitempty"`
	// Actual branch name when the branch is created.
	// E.g. release-R86-13421.B
	BranchName string `protobuf:"bytes,3,opt,name=branch_name,json=branchName,proto3" json:"branch_name,omitempty"`
	// Defines the overall timeline for channel releases of the given milestone.
	ChannelPlan []*Milestone_ChannelPlan `protobuf:"bytes,4,rep,name=channel_plan,json=channelPlan,proto3" json:"channel_plan,omitempty"`
	// Defines the builds that run for the given milestone.
	BuilderConfigs []*BuilderConfig `protobuf:"bytes,5,rep,name=builder_configs,json=builderConfigs,proto3" json:"builder_configs,omitempty"`
}

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

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

func (*Milestone) ProtoMessage() {}

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

func (x *Milestone) GetNumber() int32 {
	if x != nil {
		return x.Number
	}
	return 0
}

func (x *Milestone) GetTargetBranchDate() *Milestone_Date {
	if x != nil {
		return x.TargetBranchDate
	}
	return nil
}

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

func (x *Milestone) GetChannelPlan() []*Milestone_ChannelPlan {
	if x != nil {
		return x.ChannelPlan
	}
	return nil
}

func (x *Milestone) GetBuilderConfigs() []*BuilderConfig {
	if x != nil {
		return x.BuilderConfigs
	}
	return nil
}

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

	// Format: YYYY-MM-DD (ISO 8601)
	// E.g. 2020-02-10
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*Milestone_Date) ProtoMessage() {}

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

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

// Defines a planned release date for a given channel
type Milestone_ChannelPlan struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Channel           *Channel        `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	TargetReleaseDate *Milestone_Date `protobuf:"bytes,2,opt,name=target_release_date,json=targetReleaseDate,proto3" json:"target_release_date,omitempty"`
}

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

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

func (*Milestone_ChannelPlan) ProtoMessage() {}

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

func (x *Milestone_ChannelPlan) GetChannel() *Channel {
	if x != nil {
		return x.Channel
	}
	return nil
}

func (x *Milestone_ChannelPlan) GetTargetReleaseDate() *Milestone_Date {
	if x != nil {
		return x.TargetReleaseDate
	}
	return nil
}

var File_prototype_milestone_proto protoreflect.FileDescriptor

var file_prototype_milestone_proto_rawDesc = []byte{
	0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x69, 0x6c, 0x65,
	0x73, 0x74, 0x6f, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70,
	0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70,
	0x65, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xbc, 0x03, 0x0a, 0x09, 0x4d, 0x69, 0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x0a,
	0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e,
	0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x69,
	0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x10, 0x74, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1f,
	0x0a, 0x0b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x12,
	0x43, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18,
	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70,
	0x65, 0x2e, 0x4d, 0x69, 0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e,
	0x6e, 0x65, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
	0x50, 0x6c, 0x61, 0x6e, 0x12, 0x41, 0x0a, 0x0f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x1c, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x65, 0x12,
	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x86, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
	0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79,
	0x70, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e,
	0x6e, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x13, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65,
	0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x69, 0x6c,
	0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x11, 0x74, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x42, 0x35,
	0x5a, 0x33, 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, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x74, 0x79, 0x70, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_prototype_milestone_proto_rawDescOnce sync.Once
	file_prototype_milestone_proto_rawDescData = file_prototype_milestone_proto_rawDesc
)

func file_prototype_milestone_proto_rawDescGZIP() []byte {
	file_prototype_milestone_proto_rawDescOnce.Do(func() {
		file_prototype_milestone_proto_rawDescData = protoimpl.X.CompressGZIP(file_prototype_milestone_proto_rawDescData)
	})
	return file_prototype_milestone_proto_rawDescData
}

var file_prototype_milestone_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_prototype_milestone_proto_goTypes = []interface{}{
	(*Milestone)(nil),             // 0: prototype.Milestone
	(*Milestone_Date)(nil),        // 1: prototype.Milestone.Date
	(*Milestone_ChannelPlan)(nil), // 2: prototype.Milestone.ChannelPlan
	(*BuilderConfig)(nil),         // 3: prototype.BuilderConfig
	(*Channel)(nil),               // 4: prototype.Channel
}
var file_prototype_milestone_proto_depIdxs = []int32{
	1, // 0: prototype.Milestone.target_branch_date:type_name -> prototype.Milestone.Date
	2, // 1: prototype.Milestone.channel_plan:type_name -> prototype.Milestone.ChannelPlan
	3, // 2: prototype.Milestone.builder_configs:type_name -> prototype.BuilderConfig
	4, // 3: prototype.Milestone.ChannelPlan.channel:type_name -> prototype.Channel
	1, // 4: prototype.Milestone.ChannelPlan.target_release_date:type_name -> prototype.Milestone.Date
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_prototype_milestone_proto_init() }
func file_prototype_milestone_proto_init() {
	if File_prototype_milestone_proto != nil {
		return
	}
	file_prototype_builder_config_proto_init()
	file_prototype_channel_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_prototype_milestone_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Milestone); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_milestone_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Milestone_Date); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_milestone_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Milestone_ChannelPlan); 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_prototype_milestone_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_prototype_milestone_proto_goTypes,
		DependencyIndexes: file_prototype_milestone_proto_depIdxs,
		MessageInfos:      file_prototype_milestone_proto_msgTypes,
	}.Build()
	File_prototype_milestone_proto = out.File
	file_prototype_milestone_proto_rawDesc = nil
	file_prototype_milestone_proto_goTypes = nil
	file_prototype_milestone_proto_depIdxs = nil
}
