// Code generated by protoc-gen-go. DO NOT EDIT.
// source: project_mgmt/program.proto

package project_mgmt

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Defines the metadata for a program, which ultimately controls how this
// program is managed throughout the infrastructure.
//
// NEXT ID: 7
type Program struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Program) Reset()         { *m = Program{} }
func (m *Program) String() string { return proto.CompactTextString(m) }
func (*Program) ProtoMessage()    {}
func (*Program) Descriptor() ([]byte, []int) {
	return fileDescriptor_3321a169ccc78e39, []int{0}
}

func (m *Program) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Program.Unmarshal(m, b)
}
func (m *Program) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Program.Marshal(b, m, deterministic)
}
func (m *Program) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Program.Merge(m, src)
}
func (m *Program) XXX_Size() int {
	return xxx_messageInfo_Program.Size(m)
}
func (m *Program) XXX_DiscardUnknown() {
	xxx_messageInfo_Program.DiscardUnknown(m)
}

var xxx_messageInfo_Program proto.InternalMessageInfo

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

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

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

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

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

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

type ProgramList struct {
	Value                []*Program `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *ProgramList) Reset()         { *m = ProgramList{} }
func (m *ProgramList) String() string { return proto.CompactTextString(m) }
func (*ProgramList) ProtoMessage()    {}
func (*ProgramList) Descriptor() ([]byte, []int) {
	return fileDescriptor_3321a169ccc78e39, []int{1}
}

func (m *ProgramList) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ProgramList.Unmarshal(m, b)
}
func (m *ProgramList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ProgramList.Marshal(b, m, deterministic)
}
func (m *ProgramList) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ProgramList.Merge(m, src)
}
func (m *ProgramList) XXX_Size() int {
	return xxx_messageInfo_ProgramList.Size(m)
}
func (m *ProgramList) XXX_DiscardUnknown() {
	xxx_messageInfo_ProgramList.DiscardUnknown(m)
}

var xxx_messageInfo_ProgramList proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*Program)(nil), "project_mgmt.Program")
	proto.RegisterType((*ProgramList)(nil), "project_mgmt.ProgramList")
}

func init() { proto.RegisterFile("project_mgmt/program.proto", fileDescriptor_3321a169ccc78e39) }

var fileDescriptor_3321a169ccc78e39 = []byte{
	// 268 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x4f, 0x4b, 0xc4, 0x30,
	0x10, 0xc5, 0xa9, 0xfb, 0xc7, 0xdd, 0xa9, 0x07, 0x09, 0x08, 0x75, 0x3d, 0xb8, 0xec, 0xa9, 0xa0,
	0x34, 0xb0, 0xa2, 0x88, 0xc7, 0xf5, 0xea, 0xa1, 0xf4, 0xe8, 0xa5, 0x64, 0x43, 0x36, 0xad, 0x6b,
	0x3a, 0x21, 0x49, 0xfd, 0xa4, 0x7e, 0x20, 0x49, 0x52, 0x97, 0xc2, 0xde, 0xf2, 0xde, 0xfb, 0xcd,
	0x63, 0x26, 0xb0, 0xd2, 0x06, 0xbf, 0x04, 0x77, 0xb5, 0x92, 0xca, 0x51, 0x6d, 0x50, 0x1a, 0xa6,
	0x0a, 0x6d, 0xd0, 0x21, 0xb9, 0x1a, 0x67, 0xab, 0x33, 0xd2, 0x8b, 0x48, 0x6e, 0x7e, 0x13, 0xb8,
	0x2c, 0xe3, 0x2c, 0x21, 0x30, 0xed, 0x98, 0x12, 0x59, 0xb2, 0x4e, 0xf2, 0x65, 0x15, 0xde, 0xde,
	0x33, 0x42, 0x63, 0x76, 0x11, 0x3d, 0xff, 0x26, 0xf7, 0x90, 0x72, 0xec, 0x0e, 0xad, 0xac, 0x35,
	0x73, 0x4d, 0x36, 0x09, 0x11, 0x44, 0xab, 0x64, 0xae, 0x21, 0x8f, 0x40, 0x3c, 0x58, 0xf3, 0x46,
	0xf0, 0x23, 0xf6, 0x2e, 0x72, 0xd3, 0xc0, 0x5d, 0xfb, 0xe4, 0x7d, 0x08, 0x02, 0xfd, 0x0c, 0x8b,
	0x61, 0x27, 0x9b, 0xcd, 0xd6, 0x49, 0x9e, 0x6e, 0x6f, 0x8b, 0xf1, 0xc6, 0x45, 0x19, 0xc5, 0x47,
	0x6b, 0x5d, 0x75, 0x42, 0xc9, 0x1d, 0x2c, 0xa5, 0xad, 0xf7, 0x3d, 0x3f, 0x0a, 0x97, 0xcd, 0x43,
	0xf7, 0x42, 0xda, 0x5d, 0xd0, 0x9b, 0x37, 0x48, 0x87, 0xab, 0xfc, 0x14, 0x79, 0x80, 0xd9, 0x0f,
	0xfb, 0xee, 0xfd, 0x69, 0x93, 0x3c, 0xdd, 0xde, 0x9c, 0xf5, 0x7b, 0xb2, 0x8a, 0xcc, 0xee, 0xf5,
	0xf3, 0x45, 0x62, 0xc1, 0x1b, 0x83, 0xaa, 0xed, 0x55, 0x81, 0x46, 0xd2, 0x7f, 0x81, 0x96, 0xb6,
	0xdd, 0xc1, 0x30, 0x1a, 0x3e, 0x8f, 0x4a, 0xa4, 0xe3, 0xa2, 0xfd, 0x3c, 0xd8, 0x4f, 0x7f, 0x01,
	0x00, 0x00, 0xff, 0xff, 0x54, 0x4f, 0xc2, 0xe4, 0x9b, 0x01, 0x00, 0x00,
}
