// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/build_irrelevance_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 skipping of builds for CQ runs when the triggering CLs can't
// actually affect builds.
type BuildIrrelevanceCfg struct {
	// File patterns that never affect Chrome OS builds.
	// See documentation in the FilePattern message.
	IrrelevantFilePatterns []*FilePattern `protobuf:"bytes,3,rep,name=irrelevant_file_patterns,json=irrelevantFilePatterns,proto3" json:"irrelevant_file_patterns,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}       `json:"-"`
	XXX_unrecognized       []byte         `json:"-"`
	XXX_sizecache          int32          `json:"-"`
}

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

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

var xxx_messageInfo_BuildIrrelevanceCfg proto.InternalMessageInfo

func (m *BuildIrrelevanceCfg) GetIrrelevantFilePatterns() []*FilePattern {
	if m != nil {
		return m.IrrelevantFilePatterns
	}
	return nil
}

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

func init() {
	proto.RegisterFile("testplans/build_irrelevance_config.proto", fileDescriptor_d2966f69ce94ced6)
}

var fileDescriptor_d2966f69ce94ced6 = []byte{
	// 184 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0xce, 0x41, 0x8b, 0xc3, 0x20,
	0x10, 0x05, 0xe0, 0x43, 0x60, 0x61, 0xb3, 0xb7, 0x2c, 0x84, 0xb0, 0xa7, 0xa5, 0xa7, 0x9c, 0x14,
	0x1a, 0xfa, 0x07, 0x52, 0x28, 0xf4, 0x16, 0x7a, 0xec, 0x45, 0x8c, 0x55, 0x3b, 0xa0, 0x4e, 0x18,
	0x4d, 0x7f, 0x7f, 0x69, 0x42, 0x4d, 0x8f, 0x3e, 0xdf, 0xfb, 0x98, 0xb2, 0x4d, 0x3a, 0xa6, 0xc9,
	0xc9, 0x10, 0xf9, 0x38, 0x83, 0xbb, 0x09, 0x20, 0xd2, 0x4e, 0x3f, 0x64, 0x50, 0x5a, 0x28, 0x0c,
	0x06, 0x2c, 0x9b, 0x08, 0x13, 0x56, 0xdf, 0xb9, 0xf9, 0x57, 0x6f, 0x23, 0x85, 0xde, 0x63, 0x58,
	0x2b, 0x3b, 0x5b, 0xfe, 0xf6, 0x2f, 0xe4, 0xbc, 0x19, 0x47, 0x63, 0xab, 0xa1, 0x6c, 0xb2, 0x9a,
	0x84, 0x01, 0xa7, 0xc5, 0x24, 0x53, 0xd2, 0x14, 0x62, 0x53, 0xfc, 0x17, 0xed, 0xcf, 0xbe, 0x66,
	0x59, 0x64, 0x27, 0x70, 0x7a, 0x58, 0xbf, 0x2f, 0xf5, 0xb6, 0xfb, 0x88, 0x63, 0x7f, 0xb8, 0x76,
	0x16, 0x99, 0xba, 0x13, 0x7a, 0x98, 0x3d, 0x43, 0xb2, 0xfc, 0xfd, 0xc0, 0xc8, 0x21, 0x18, 0x92,
	0x7c, 0x39, 0x89, 0x5b, 0xe4, 0x99, 0x1e, 0xbf, 0x96, 0xac, 0x7b, 0x06, 0x00, 0x00, 0xff, 0xff,
	0xbf, 0xd8, 0xc6, 0x71, 0xf5, 0x00, 0x00, 0x00,
}
