// 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: project_mgmt/program.proto

package project_mgmt

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 the metadata for a program, which ultimately controls how this
// program is managed throughout the infrastructure.
//
// NEXT ID: 7
type Program struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Defines the human-readable name for the program.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the program.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the program configuration.
	// Relative to the git-repo
	ConfigPath string `protobuf:"bytes,3,opt,name=config_path,json=configPath,proto3" json:"config_path,omitempty"`
	// Defines the path the repo is checked out to in the source tree, i.e. the
	// "path" attribute in the manifest.
	RepoCheckoutPath string `protobuf:"bytes,4,opt,name=repo_checkout_path,json=repoCheckoutPath,proto3" json:"repo_checkout_path,omitempty"`
	// Defines projects within this program.
	Projects *ProjectList `protobuf:"bytes,5,opt,name=projects,proto3" json:"projects,omitempty"`
	// The Google Storage bucket for artifacts from the program's builds.
	GsBucket string `protobuf:"bytes,6,opt,name=gs_bucket,json=gsBucket,proto3" json:"gs_bucket,omitempty"`
}

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

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

func (*Program) ProtoMessage() {}

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

func (x *Program) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

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

func (x *Program) GetConfigPath() string {
	if x != nil {
		return x.ConfigPath
	}
	return ""
}

func (x *Program) GetRepoCheckoutPath() string {
	if x != nil {
		return x.RepoCheckoutPath
	}
	return ""
}

func (x *Program) GetProjects() *ProjectList {
	if x != nil {
		return x.Projects
	}
	return nil
}

func (x *Program) GetGsBucket() string {
	if x != nil {
		return x.GsBucket
	}
	return ""
}

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

	Value []*Program `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*ProgramList) ProtoMessage() {}

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

func (x *ProgramList) GetValue() []*Program {
	if x != nil {
		return x.Value
	}
	return nil
}

var File_project_mgmt_program_proto protoreflect.FileDescriptor

var file_project_mgmt_program_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x70,
	0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x70, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x1a, 0x1a, 0x70, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x67, 0x72,
	0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x72,
	0x65, 0x70, 0x6f, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x74,
	0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x43, 0x68, 0x65,
	0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65,
	0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,
	0x12, 0x1b, 0x0a, 0x09, 0x67, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x3a, 0x0a,
	0x0b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72,
	0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x38, 0x5a, 0x36, 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, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d,
	0x67, 0x6d, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_project_mgmt_program_proto_rawDescOnce sync.Once
	file_project_mgmt_program_proto_rawDescData = file_project_mgmt_program_proto_rawDesc
)

func file_project_mgmt_program_proto_rawDescGZIP() []byte {
	file_project_mgmt_program_proto_rawDescOnce.Do(func() {
		file_project_mgmt_program_proto_rawDescData = protoimpl.X.CompressGZIP(file_project_mgmt_program_proto_rawDescData)
	})
	return file_project_mgmt_program_proto_rawDescData
}

var file_project_mgmt_program_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_project_mgmt_program_proto_goTypes = []interface{}{
	(*Program)(nil),     // 0: project_mgmt.Program
	(*ProgramList)(nil), // 1: project_mgmt.ProgramList
	(*ProjectList)(nil), // 2: project_mgmt.ProjectList
}
var file_project_mgmt_program_proto_depIdxs = []int32{
	2, // 0: project_mgmt.Program.projects:type_name -> project_mgmt.ProjectList
	0, // 1: project_mgmt.ProgramList.value:type_name -> project_mgmt.Program
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_project_mgmt_program_proto_init() }
func file_project_mgmt_program_proto_init() {
	if File_project_mgmt_program_proto != nil {
		return
	}
	file_project_mgmt_project_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_project_mgmt_program_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Program); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_project_mgmt_program_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProgramList); 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_project_mgmt_program_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_project_mgmt_program_proto_goTypes,
		DependencyIndexes: file_project_mgmt_program_proto_depIdxs,
		MessageInfos:      file_project_mgmt_program_proto_msgTypes,
	}.Build()
	File_project_mgmt_program_proto = out.File
	file_project_mgmt_program_proto_rawDesc = nil
	file_project_mgmt_program_proto_goTypes = nil
	file_project_mgmt_program_proto_depIdxs = nil
}
