// 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 ""
}

// Information about the project's HWID file in the chromeos-hwid repo.
type HWIDInfo struct {
	// A key in the project.yaml metadata file, to look up the branch, path, etc.
	// For example, to match the entry in the project.yaml file:
	//
	// MILKYWAY:
	//   board: GALAXY
	//   branch: master
	//   version: 3
	//   path: v3/MILKYWAY
	//
	// project_key should be 'MILKYWAY'. The matching is case-insensitive.
	ProjectKey           string   `protobuf:"bytes,1,opt,name=project_key,json=projectKey,proto3" json:"project_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HWIDInfo proto.InternalMessageInfo

func (m *HWIDInfo) GetProjectKey() string {
	if m != nil {
		return m.ProjectKey
	}
	return ""
}

// Defines the metadata for a project, which ultimately controls how this
// project is managed throughout the infrastructure.
//
// NEXT ID: 9
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"`
	HwidInfo             *HWIDInfo `protobuf:"bytes,8,opt,name=hwid_info,json=hwidInfo,proto3" json:"hwid_info,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{3}
}

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 ""
}

func (m *Project) GetHwidInfo() *HWIDInfo {
	if m != nil {
		return m.HwidInfo
	}
	return nil
}

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{4}
}

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((*HWIDInfo)(nil), "project_mgmt.HWIDInfo")
	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{
	// 411 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x92, 0x5f, 0x6b, 0xd5, 0x30,
	0x18, 0xc6, 0xe9, 0xfe, 0x9d, 0xf6, 0xed, 0x8e, 0x1b, 0x11, 0xa5, 0x3a, 0xc4, 0x43, 0xbd, 0x39,
	0x30, 0x69, 0x61, 0x03, 0x11, 0xef, 0xac, 0x5e, 0x6c, 0x38, 0x71, 0x14, 0x44, 0xf0, 0xa6, 0xa4,
	0x39, 0x69, 0x1b, 0x4f, 0xda, 0x94, 0x24, 0x55, 0xf6, 0x6d, 0xfd, 0x28, 0x92, 0x34, 0xc5, 0x76,
	0x77, 0x79, 0x9f, 0xe7, 0xe9, 0x93, 0xb7, 0x3f, 0x02, 0x2f, 0x7b, 0x29, 0x7e, 0x51, 0xa2, 0x8b,
	0xb6, 0x6e, 0x75, 0xea, 0x86, 0xa4, 0x97, 0x42, 0x0b, 0x74, 0x3a, 0xf7, 0xe2, 0x0c, 0xce, 0xb2,
	0x81, 0xf1, 0x5d, 0x39, 0x90, 0x3d, 0xd5, 0x1f, 0x09, 0x57, 0x28, 0x85, 0xa7, 0xe5, 0x7f, 0xa9,
	0x90, 0x14, 0xef, 0xa8, 0x54, 0x91, 0xb7, 0x39, 0xdc, 0x06, 0x39, 0x9a, 0x59, 0xf9, 0xe8, 0xc4,
	0xdf, 0x60, 0x7d, 0x27, 0x08, 0xe6, 0x5f, 0x71, 0xc7, 0x2a, 0xaa, 0x34, 0x7a, 0x01, 0xbe, 0xa4,
	0xbd, 0x28, 0x06, 0xc9, 0x23, 0x6f, 0xe3, 0x6d, 0x83, 0x7c, 0x65, 0xe6, 0xef, 0x92, 0xa3, 0x37,
	0xb0, 0x6e, 0x5d, 0xac, 0xe8, 0xb1, 0x6e, 0xa2, 0x03, 0xeb, 0x9f, 0x4e, 0xe2, 0x3d, 0xd6, 0x4d,
	0x7c, 0x09, 0xfe, 0xcd, 0x8f, 0xdb, 0xcf, 0xb7, 0x5d, 0x25, 0xd0, 0x6b, 0x08, 0xa7, 0x85, 0xf7,
	0xf4, 0xc1, 0xd5, 0x81, 0x93, 0xbe, 0xd0, 0x87, 0xf8, 0xef, 0x01, 0xac, 0xee, 0xc7, 0x11, 0x21,
	0x38, 0xea, 0x70, 0x4b, 0x5d, 0xca, 0x9e, 0x8d, 0x66, 0x2e, 0x77, 0x17, 0xd9, 0xb3, 0x29, 0x25,
	0xa2, 0xab, 0x58, 0x3d, 0xee, 0x70, 0x38, 0x96, 0x8e, 0x92, 0xd9, 0x00, 0xbd, 0x05, 0x64, 0xff,
	0x80, 0x34, 0x94, 0xec, 0xc5, 0xe0, 0x76, 0x3d, 0xb2, 0xb9, 0x73, 0xe3, 0x7c, 0x72, 0x86, 0x4d,
	0xdf, 0xc0, 0xf9, 0x9c, 0x18, 0x26, 0x5c, 0x45, 0xc7, 0x1b, 0x6f, 0x1b, 0x5e, 0xbd, 0x4a, 0xe6,
	0xb4, 0x93, 0x47, 0xa8, 0xf3, 0xb3, 0xf2, 0x11, 0xfb, 0x0c, 0x9e, 0x70, 0x83, 0xb2, 0x98, 0x78,
	0x44, 0x27, 0xb6, 0xe7, 0x62, 0xd9, 0xb3, 0xc0, 0x9d, 0xaf, 0xf9, 0x82, 0xfe, 0x05, 0x04, 0xb5,
	0x2a, 0xc6, 0xd2, 0x68, 0x65, 0x57, 0xf6, 0x6b, 0x95, 0xd9, 0x19, 0x5d, 0x43, 0xd0, 0xfc, 0x61,
	0xbb, 0x82, 0x75, 0x95, 0x88, 0x7c, 0xdb, 0xfd, 0x7c, 0xd9, 0x3d, 0x91, 0xcf, 0x7d, 0x13, 0x34,
	0xa7, 0xf8, 0x03, 0x84, 0x8e, 0xf0, 0x1d, 0x53, 0x1a, 0x5d, 0xc2, 0xf1, 0x6f, 0xcc, 0x07, 0x6a,
	0x9f, 0x44, 0x78, 0xf5, 0x6c, 0xf9, 0xbd, 0x4b, 0xe6, 0x63, 0x26, 0x7b, 0xff, 0xf3, 0x5d, 0x2d,
	0x12, 0xd2, 0x48, 0xd1, 0xb2, 0xa1, 0x4d, 0x84, 0xac, 0xd3, 0x69, 0x10, 0x2a, 0x65, 0x5d, 0x25,
	0x71, 0x6a, 0x1f, 0x66, 0x5a, 0x8b, 0x74, 0x5e, 0x54, 0x9e, 0x58, 0xf9, 0xfa, 0x5f, 0x00, 0x00,
	0x00, 0xff, 0xff, 0x8e, 0xe9, 0x25, 0x62, 0xcd, 0x02, 0x00, 0x00,
}
