// Copyright 2019 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/generate_build_plan.proto

package chromiumos

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

// The input proto for invocations of the Build Planner.
type GenerateBuildPlanRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Serialized buildbucket GerritChanges, or none if this is a postsubmit run
	// or similar. Explicit proto import is avoided here to prevent a dependency
	// on the luci-go repo.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/common.proto
	GerritChanges []*ProtoBytes `protobuf:"bytes,1,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	// The manifest-internal snapshot commit hash that's being used for the current build.
	// Note that manifest_commit will be soon replaced with gitiles_commit below.
	ManifestCommit string `protobuf:"bytes,2,opt,name=manifest_commit,json=manifestCommit,proto3" json:"manifest_commit,omitempty"`
	// Serialized buildbucket GitilesCommit, representing the manifest or
	// manifest-internal commit to which the build is synced.
	GitilesCommit *ProtoBytes `protobuf:"bytes,4,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// The BuilderConfigs to consider for skipping.
	BuilderConfigs []*BuilderConfig `protobuf:"bytes,3,rep,name=builder_configs,json=builderConfigs,proto3" json:"builder_configs,omitempty"`
}

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

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

func (*GenerateBuildPlanRequest) ProtoMessage() {}

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

func (x *GenerateBuildPlanRequest) GetGerritChanges() []*ProtoBytes {
	if x != nil {
		return x.GerritChanges
	}
	return nil
}

func (x *GenerateBuildPlanRequest) GetManifestCommit() string {
	if x != nil {
		return x.ManifestCommit
	}
	return ""
}

func (x *GenerateBuildPlanRequest) GetGitilesCommit() *ProtoBytes {
	if x != nil {
		return x.GitilesCommit
	}
	return nil
}

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

// The output proto for invocations of the Build Planner.
type GenerateBuildPlanResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// BuilderConfigs that cannot be skipped.
	BuildsToRun []*BuilderConfig_Id `protobuf:"bytes,1,rep,name=builds_to_run,json=buildsToRun,proto3" json:"builds_to_run,omitempty"`
	// BuilderConfigs that can be skipped due to Portage dependency rules around
	// files that are known to never be relevant for Chrome OS builds.
	SkipForGlobalBuildIrrelevance []*BuilderConfig_Id `protobuf:"bytes,2,rep,name=skip_for_global_build_irrelevance,json=skipForGlobalBuildIrrelevance,proto3" json:"skip_for_global_build_irrelevance,omitempty"`
	// BuilderConfigs that can be skipped because of per-BuilderConfig RunWhen
	// rules.
	SkipForRunWhenRules []*BuilderConfig_Id `protobuf:"bytes,3,rep,name=skip_for_run_when_rules,json=skipForRunWhenRules,proto3" json:"skip_for_run_when_rules,omitempty"`
}

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

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

func (*GenerateBuildPlanResponse) ProtoMessage() {}

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

func (x *GenerateBuildPlanResponse) GetBuildsToRun() []*BuilderConfig_Id {
	if x != nil {
		return x.BuildsToRun
	}
	return nil
}

func (x *GenerateBuildPlanResponse) GetSkipForGlobalBuildIrrelevance() []*BuilderConfig_Id {
	if x != nil {
		return x.SkipForGlobalBuildIrrelevance
	}
	return nil
}

func (x *GenerateBuildPlanResponse) GetSkipForRunWhenRules() []*BuilderConfig_Id {
	if x != nil {
		return x.SkipForRunWhenRules
	}
	return nil
}

var File_chromiumos_generate_build_plan_proto protoreflect.FileDescriptor

var file_chromiumos_generate_build_plan_proto_rawDesc = []byte{
	0x0a, 0x24, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x6e,
	0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x6e,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x1a, 0x1f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f,
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x02, 0x0a,
	0x18, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x6c,
	0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x0e, 0x67, 0x65, 0x72,
	0x72, 0x69, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50,
	0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0d, 0x67, 0x65, 0x72, 0x72, 0x69,
	0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x69,
	0x66, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69,
	0x74, 0x12, 0x3d, 0x0a, 0x0e, 0x67, 0x69, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d,
	0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74, 0x65,
	0x73, 0x52, 0x0d, 0x67, 0x69, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
	0x12, 0x42, 0x0a, 0x0f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 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, 0x22, 0x99, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
	0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f,
	0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x64, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x54,
	0x6f, 0x52, 0x75, 0x6e, 0x12, 0x66, 0x0a, 0x21, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x66, 0x6f, 0x72,
	0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x72,
	0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x64, 0x52, 0x1d, 0x73,
	0x6b, 0x69, 0x70, 0x46, 0x6f, 0x72, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x49, 0x72, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x17,
	0x73, 0x6b, 0x69, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x77, 0x68, 0x65,
	0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x64, 0x52, 0x13, 0x73, 0x6b, 0x69,
	0x70, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73,
	0x42, 0x36, 0x5a, 0x34, 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, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_generate_build_plan_proto_rawDescOnce sync.Once
	file_chromiumos_generate_build_plan_proto_rawDescData = file_chromiumos_generate_build_plan_proto_rawDesc
)

func file_chromiumos_generate_build_plan_proto_rawDescGZIP() []byte {
	file_chromiumos_generate_build_plan_proto_rawDescOnce.Do(func() {
		file_chromiumos_generate_build_plan_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_generate_build_plan_proto_rawDescData)
	})
	return file_chromiumos_generate_build_plan_proto_rawDescData
}

var file_chromiumos_generate_build_plan_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_chromiumos_generate_build_plan_proto_goTypes = []interface{}{
	(*GenerateBuildPlanRequest)(nil),  // 0: chromiumos.GenerateBuildPlanRequest
	(*GenerateBuildPlanResponse)(nil), // 1: chromiumos.GenerateBuildPlanResponse
	(*ProtoBytes)(nil),                // 2: chromiumos.ProtoBytes
	(*BuilderConfig)(nil),             // 3: chromiumos.BuilderConfig
	(*BuilderConfig_Id)(nil),          // 4: chromiumos.BuilderConfig.Id
}
var file_chromiumos_generate_build_plan_proto_depIdxs = []int32{
	2, // 0: chromiumos.GenerateBuildPlanRequest.gerrit_changes:type_name -> chromiumos.ProtoBytes
	2, // 1: chromiumos.GenerateBuildPlanRequest.gitiles_commit:type_name -> chromiumos.ProtoBytes
	3, // 2: chromiumos.GenerateBuildPlanRequest.builder_configs:type_name -> chromiumos.BuilderConfig
	4, // 3: chromiumos.GenerateBuildPlanResponse.builds_to_run:type_name -> chromiumos.BuilderConfig.Id
	4, // 4: chromiumos.GenerateBuildPlanResponse.skip_for_global_build_irrelevance:type_name -> chromiumos.BuilderConfig.Id
	4, // 5: chromiumos.GenerateBuildPlanResponse.skip_for_run_when_rules:type_name -> chromiumos.BuilderConfig.Id
	6, // [6:6] is the sub-list for method output_type
	6, // [6:6] is the sub-list for method input_type
	6, // [6:6] is the sub-list for extension type_name
	6, // [6:6] is the sub-list for extension extendee
	0, // [0:6] is the sub-list for field type_name
}

func init() { file_chromiumos_generate_build_plan_proto_init() }
func file_chromiumos_generate_build_plan_proto_init() {
	if File_chromiumos_generate_build_plan_proto != nil {
		return
	}
	file_chromiumos_builder_config_proto_init()
	file_chromiumos_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_generate_build_plan_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateBuildPlanRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_generate_build_plan_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateBuildPlanResponse); 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_generate_build_plan_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_generate_build_plan_proto_goTypes,
		DependencyIndexes: file_chromiumos_generate_build_plan_proto_depIdxs,
		MessageInfos:      file_chromiumos_generate_build_plan_proto_msgTypes,
	}.Build()
	File_chromiumos_generate_build_plan_proto = out.File
	file_chromiumos_generate_build_plan_proto_rawDesc = nil
	file_chromiumos_generate_build_plan_proto_goTypes = nil
	file_chromiumos_generate_build_plan_proto_depIdxs = nil
}
