// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: testplans/build_irrelevance_config.proto

package testplans

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Configures the skipping of builds for CQ runs when the triggering CLs can't
// actually affect builds.
type BuildIrrelevanceCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *BuildIrrelevanceCfg) Reset() {
	*x = BuildIrrelevanceCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_build_irrelevance_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildIrrelevanceCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildIrrelevanceCfg) ProtoMessage() {}

func (x *BuildIrrelevanceCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_build_irrelevance_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildIrrelevanceCfg.ProtoReflect.Descriptor instead.
func (*BuildIrrelevanceCfg) Descriptor() ([]byte, []int) {
	return file_testplans_build_irrelevance_config_proto_rawDescGZIP(), []int{0}
}

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

var File_testplans_build_irrelevance_config_proto protoreflect.FileDescriptor

var file_testplans_build_irrelevance_config_proto_rawDesc = []byte{
	0x0a, 0x28, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x5f, 0x69, 0x72, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a, 0x16, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x67, 0x0a,
	0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x72, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63,
	0x65, 0x43, 0x66, 0x67, 0x12, 0x50, 0x0a, 0x18, 0x69, 0x72, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61,
	0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73,
	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61,
	0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x16,
	0x69, 0x72, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61,
	0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_build_irrelevance_config_proto_rawDescOnce sync.Once
	file_testplans_build_irrelevance_config_proto_rawDescData = file_testplans_build_irrelevance_config_proto_rawDesc
)

func file_testplans_build_irrelevance_config_proto_rawDescGZIP() []byte {
	file_testplans_build_irrelevance_config_proto_rawDescOnce.Do(func() {
		file_testplans_build_irrelevance_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_build_irrelevance_config_proto_rawDescData)
	})
	return file_testplans_build_irrelevance_config_proto_rawDescData
}

var file_testplans_build_irrelevance_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_testplans_build_irrelevance_config_proto_goTypes = []interface{}{
	(*BuildIrrelevanceCfg)(nil), // 0: testplans.BuildIrrelevanceCfg
	(*FilePattern)(nil),         // 1: testplans.FilePattern
}
var file_testplans_build_irrelevance_config_proto_depIdxs = []int32{
	1, // 0: testplans.BuildIrrelevanceCfg.irrelevant_file_patterns:type_name -> testplans.FilePattern
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_testplans_build_irrelevance_config_proto_init() }
func file_testplans_build_irrelevance_config_proto_init() {
	if File_testplans_build_irrelevance_config_proto != nil {
		return
	}
	file_testplans_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_testplans_build_irrelevance_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildIrrelevanceCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_build_irrelevance_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_build_irrelevance_config_proto_goTypes,
		DependencyIndexes: file_testplans_build_irrelevance_config_proto_depIdxs,
		MessageInfos:      file_testplans_build_irrelevance_config_proto_msgTypes,
	}.Build()
	File_testplans_build_irrelevance_config_proto = out.File
	file_testplans_build_irrelevance_config_proto_rawDesc = nil
	file_testplans_build_irrelevance_config_proto_goTypes = nil
	file_testplans_build_irrelevance_config_proto_depIdxs = nil
}
