// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/slim_build_config.proto

package testplans

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

// Configures the scheduling of slim CQ builds when the triggering CLs only
// affect paths which are eligible for slim builds.
type SlimBuildCfg struct {
	// File patterns that are eligible for slim builds.
	// See documentation in the FilePattern message.
	SlimEligibleFilePatterns []*FilePattern `protobuf:"bytes,1,rep,name=slim_eligible_file_patterns,json=slimEligibleFilePatterns,proto3" json:"slim_eligible_file_patterns,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}       `json:"-"`
	XXX_unrecognized         []byte         `json:"-"`
	XXX_sizecache            int32          `json:"-"`
}

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

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

var xxx_messageInfo_SlimBuildCfg proto.InternalMessageInfo

func (m *SlimBuildCfg) GetSlimEligibleFilePatterns() []*FilePattern {
	if m != nil {
		return m.SlimEligibleFilePatterns
	}
	return nil
}

func init() {
	proto.RegisterType((*SlimBuildCfg)(nil), "testplans.SlimBuildCfg")
}

func init() { proto.RegisterFile("testplans/slim_build_config.proto", fileDescriptor_0db177f82a677f62) }

var fileDescriptor_0db177f82a677f62 = []byte{
	// 187 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8e, 0x41, 0x8b, 0xc2, 0x30,
	0x10, 0x46, 0x59, 0x16, 0x16, 0xb6, 0xbb, 0xa7, 0x1e, 0x4a, 0xd1, 0x8b, 0x7a, 0xf2, 0x94, 0x80,
	0xc5, 0x3f, 0x50, 0xd1, 0xb3, 0x28, 0x5e, 0xbc, 0x84, 0xb6, 0x4e, 0xe2, 0xc0, 0x24, 0x53, 0x92,
	0xf4, 0xff, 0x4b, 0x5b, 0xad, 0x1e, 0x93, 0xef, 0xbd, 0xc7, 0x24, 0xcb, 0x08, 0x21, 0xb6, 0x54,
	0xb9, 0x20, 0x03, 0xa1, 0x55, 0x75, 0x87, 0x74, 0x53, 0x0d, 0x3b, 0x8d, 0x46, 0xb4, 0x9e, 0x23,
	0xa7, 0xbf, 0x13, 0x32, 0xcb, 0xde, 0x74, 0xc3, 0xd6, 0xb2, 0x1b, 0x91, 0x15, 0x24, 0xff, 0x67,
	0x42, 0x5b, 0xf6, 0xf2, 0x4e, 0x9b, 0xf4, 0x92, 0xcc, 0x87, 0x1a, 0x10, 0x1a, 0xac, 0x09, 0x94,
	0x46, 0x02, 0xd5, 0x56, 0x31, 0x82, 0x77, 0x21, 0xff, 0x5a, 0x7c, 0xaf, 0xff, 0x36, 0x99, 0x98,
	0x6a, 0xe2, 0x80, 0x04, 0xc7, 0x71, 0x3e, 0xe5, 0xbd, 0xba, 0x7f, 0x9a, 0x1f, 0x43, 0x28, 0xb7,
	0xd7, 0xc2, 0xb0, 0x68, 0xee, 0x9e, 0x2d, 0x76, 0x56, 0xb0, 0x37, 0xf2, 0xf5, 0xe0, 0x20, 0xd1,
	0x69, 0x5f, 0xc9, 0xe1, 0x20, 0x69, 0x58, 0x4e, 0xf1, 0xfa, 0x67, 0xf8, 0x2b, 0x1e, 0x01, 0x00,
	0x00, 0xff, 0xff, 0xd3, 0x36, 0xff, 0x7d, 0xec, 0x00, 0x00, 0x00,
}
