// Code generated by protoc-gen-go. DO NOT EDIT.
// source: project_mgmt/project.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 ACLs for a project's builders.
type BuildbucketAcls struct {
	// A list of LUCI Auth Service groups that can view a project's builds.
	BuildbucketReaders   []string `protobuf:"bytes,1,rep,name=buildbucket_readers,json=buildbucketReaders,proto3" json:"buildbucket_readers,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildbucketAcls proto.InternalMessageInfo

func (m *BuildbucketAcls) GetBuildbucketReaders() []string {
	if m != nil {
		return m.BuildbucketReaders
	}
	return nil
}

// Describes the location of a local manifest file.
// See https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md#local-manifests.
type LocalManifest struct {
	// URL of the repo with the local manifest. E.g.
	// https://chrome-internal.googlesource.com/chromeos/project/...
	RepoUrl string `protobuf:"bytes,1,opt,name=repo_url,json=repoUrl,proto3" json:"repo_url,omitempty"`
	// Path to the local manifest.
	// Relative to the repo.
	ManifestPath         string   `protobuf:"bytes,2,opt,name=manifest_path,json=manifestPath,proto3" json:"manifest_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LocalManifest proto.InternalMessageInfo

func (m *LocalManifest) GetRepoUrl() string {
	if m != nil {
		return m.RepoUrl
	}
	return ""
}

func (m *LocalManifest) GetManifestPath() string {
	if m != nil {
		return m.ManifestPath
	}
	return ""
}

// Defines the metadata for a project, which ultimately controls how this
// project is managed throughout the infrastructure.
//
// NEXT ID: 8
type Project struct {
	// Defines the human-readable name for the project.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the project.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the project 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 ACLs for a project's builders.
	BuildbucketAcls *BuildbucketAcls `protobuf:"bytes,5,opt,name=buildbucket_acls,json=buildbucketAcls,proto3" json:"buildbucket_acls,omitempty"`
	// Define the project's local_manifest.
	LocalManifest *LocalManifest `protobuf:"bytes,6,opt,name=local_manifest,json=localManifest,proto3" json:"local_manifest,omitempty"`
	// The Google Storage bucket for artifacts from the project's builds.
	GsBucket             string   `protobuf:"bytes,7,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 *Project) Reset()         { *m = Project{} }
func (m *Project) String() string { return proto.CompactTextString(m) }
func (*Project) ProtoMessage()    {}
func (*Project) Descriptor() ([]byte, []int) {
	return fileDescriptor_18d734e2ff24bda5, []int{2}
}

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

var xxx_messageInfo_Project proto.InternalMessageInfo

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

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

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

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

func (m *Project) GetBuildbucketAcls() *BuildbucketAcls {
	if m != nil {
		return m.BuildbucketAcls
	}
	return nil
}

func (m *Project) GetLocalManifest() *LocalManifest {
	if m != nil {
		return m.LocalManifest
	}
	return nil
}

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

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

func (m *ProjectList) Reset()         { *m = ProjectList{} }
func (m *ProjectList) String() string { return proto.CompactTextString(m) }
func (*ProjectList) ProtoMessage()    {}
func (*ProjectList) Descriptor() ([]byte, []int) {
	return fileDescriptor_18d734e2ff24bda5, []int{3}
}

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

var xxx_messageInfo_ProjectList proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*BuildbucketAcls)(nil), "project_mgmt.BuildbucketAcls")
	proto.RegisterType((*LocalManifest)(nil), "project_mgmt.LocalManifest")
	proto.RegisterType((*Project)(nil), "project_mgmt.Project")
	proto.RegisterType((*ProjectList)(nil), "project_mgmt.ProjectList")
}

func init() { proto.RegisterFile("project_mgmt/project.proto", fileDescriptor_18d734e2ff24bda5) }

var fileDescriptor_18d734e2ff24bda5 = []byte{
	// 362 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x92, 0x4f, 0x6b, 0xa3, 0x40,
	0x18, 0xc6, 0x31, 0xff, 0xf3, 0x9a, 0x6c, 0xc2, 0x2c, 0x0b, 0xee, 0x86, 0x65, 0x83, 0x7b, 0x09,
	0xb4, 0x28, 0xa4, 0x50, 0x4a, 0x6f, 0xb5, 0x97, 0x1e, 0x52, 0x1a, 0x84, 0x5e, 0x7a, 0x91, 0x71,
	0x32, 0x51, 0x9b, 0xd1, 0x91, 0x99, 0xb1, 0x5f, 0xaa, 0x5f, 0xb2, 0x38, 0x4e, 0xa8, 0xe6, 0x36,
	0xef, 0xf3, 0x3c, 0x3e, 0xf3, 0xfa, 0x53, 0xf8, 0x53, 0x0a, 0xfe, 0x4e, 0x89, 0x8a, 0xf2, 0x24,
	0x57, 0xbe, 0x19, 0xbc, 0x52, 0x70, 0xc5, 0xd1, 0xac, 0xed, 0xb9, 0x01, 0x2c, 0x82, 0x2a, 0x63,
	0x87, 0xb8, 0x22, 0x27, 0xaa, 0x1e, 0x08, 0x93, 0xc8, 0x87, 0x9f, 0xf1, 0xb7, 0x14, 0x09, 0x8a,
	0x0f, 0x54, 0x48, 0xc7, 0x5a, 0xf7, 0x37, 0xd3, 0x10, 0xb5, 0xac, 0xb0, 0x71, 0xdc, 0x17, 0x98,
	0xef, 0x38, 0xc1, 0xec, 0x19, 0x17, 0xd9, 0x91, 0x4a, 0x85, 0x7e, 0xc3, 0x44, 0xd0, 0x92, 0x47,
	0x95, 0x60, 0x8e, 0xb5, 0xb6, 0x36, 0xd3, 0x70, 0x5c, 0xcf, 0xaf, 0x82, 0xa1, 0xff, 0x30, 0xcf,
	0x4d, 0x2c, 0x2a, 0xb1, 0x4a, 0x9d, 0x9e, 0xf6, 0x67, 0x67, 0x71, 0x8f, 0x55, 0xea, 0x7e, 0xf6,
	0x60, 0xbc, 0x6f, 0xb6, 0x44, 0x08, 0x06, 0x05, 0xce, 0xa9, 0xe9, 0xd1, 0xe7, 0x5a, 0xab, 0xfb,
	0xcc, 0xb3, 0xfa, 0x8c, 0xfe, 0x81, 0x4d, 0x78, 0x71, 0xcc, 0x92, 0xa6, 0xb6, 0xaf, 0x2d, 0x68,
	0xa4, 0xba, 0x14, 0x5d, 0x03, 0xd2, 0x4b, 0x91, 0x94, 0x92, 0x13, 0xaf, 0xcc, 0xf5, 0x03, 0x9d,
	0x5b, 0xd6, 0xce, 0xa3, 0x31, 0x74, 0xfa, 0x09, 0x96, 0x6d, 0x08, 0x98, 0x30, 0xe9, 0x0c, 0xd7,
	0xd6, 0xc6, 0xde, 0xfe, 0xf5, 0xda, 0x00, 0xbd, 0x0b, 0x7a, 0xe1, 0x22, 0xbe, 0xc0, 0x19, 0xc0,
	0x0f, 0x56, 0xd3, 0x89, 0xce, 0xaf, 0xe8, 0x8c, 0x74, 0xcf, 0xaa, 0xdb, 0xd3, 0x21, 0x18, 0xce,
	0x59, 0x07, 0xe8, 0x0a, 0xa6, 0x89, 0x8c, 0x9a, 0x52, 0x67, 0xac, 0x57, 0x9e, 0x24, 0x32, 0xd0,
	0xb3, 0x7b, 0x0f, 0xb6, 0x81, 0xb5, 0xcb, 0xa4, 0x42, 0x57, 0x30, 0xfc, 0xc0, 0xac, 0xa2, 0xfa,
	0x83, 0xd9, 0xdb, 0x5f, 0xdd, 0x6b, 0x4c, 0x32, 0x6c, 0x32, 0xc1, 0xdd, 0xdb, 0x6d, 0xc2, 0x3d,
	0x92, 0x0a, 0x9e, 0x67, 0x55, 0xee, 0x71, 0x91, 0xf8, 0xe7, 0x81, 0x4b, 0x3f, 0x2b, 0x8e, 0x02,
	0xfb, 0xfa, 0xb7, 0xf1, 0x13, 0xee, 0xb7, 0x8b, 0xe2, 0x91, 0x96, 0x6f, 0xbe, 0x02, 0x00, 0x00,
	0xff, 0xff, 0x2b, 0x7e, 0xe3, 0x1c, 0x6b, 0x02, 0x00, 0x00,
}
