// 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/pointless_build.proto

package testplans

import (
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	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)
)

type PointlessBuildCheckResponse_PointlessBuildReason int32

const (
	PointlessBuildCheckResponse_POINTLESS_BUILD_REASON_UNSPECIFIED          PointlessBuildCheckResponse_PointlessBuildReason = 0
	PointlessBuildCheckResponse_IRRELEVANT_TO_DEPS_GRAPH                    PointlessBuildCheckResponse_PointlessBuildReason = 1
	PointlessBuildCheckResponse_IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES PointlessBuildCheckResponse_PointlessBuildReason = 2
)

// Enum value maps for PointlessBuildCheckResponse_PointlessBuildReason.
var (
	PointlessBuildCheckResponse_PointlessBuildReason_name = map[int32]string{
		0: "POINTLESS_BUILD_REASON_UNSPECIFIED",
		1: "IRRELEVANT_TO_DEPS_GRAPH",
		2: "IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES",
	}
	PointlessBuildCheckResponse_PointlessBuildReason_value = map[string]int32{
		"POINTLESS_BUILD_REASON_UNSPECIFIED":          0,
		"IRRELEVANT_TO_DEPS_GRAPH":                    1,
		"IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES": 2,
	}
)

func (x PointlessBuildCheckResponse_PointlessBuildReason) Enum() *PointlessBuildCheckResponse_PointlessBuildReason {
	p := new(PointlessBuildCheckResponse_PointlessBuildReason)
	*p = x
	return p
}

func (x PointlessBuildCheckResponse_PointlessBuildReason) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PointlessBuildCheckResponse_PointlessBuildReason) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_pointless_build_proto_enumTypes[0].Descriptor()
}

func (PointlessBuildCheckResponse_PointlessBuildReason) Type() protoreflect.EnumType {
	return &file_testplans_pointless_build_proto_enumTypes[0]
}

func (x PointlessBuildCheckResponse_PointlessBuildReason) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PointlessBuildCheckResponse_PointlessBuildReason.Descriptor instead.
func (PointlessBuildCheckResponse_PointlessBuildReason) EnumDescriptor() ([]byte, []int) {
	return file_testplans_pointless_build_proto_rawDescGZIP(), []int{1, 0}
}

// The input proto for invocations of the Pointless Build Checker program.
type PointlessBuildCheckRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Serialized buildbucket GerritChanges, or none if this is a postsubmit run
	// or similar. Explicit proto import is avoided here to prevent a dependency
	// on the luci-go repo.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/common.proto
	GerritChanges []*ProtoBytes `protobuf:"bytes,7,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	// A list of paths to be considered as relevant to the current build. Can
	// be used instead of passing a full DepGraph.
	RelevantPaths []*PointlessBuildCheckRequest_Path `protobuf:"bytes,9,rep,name=relevant_paths,json=relevantPaths,proto3" json:"relevant_paths,omitempty"`
	// The manifest-internal snapshot commit hash that's being used for the current build.
	// Note that manifest_commit will be soon replaced with gitiles_commit below.
	ManifestCommit string `protobuf:"bytes,6,opt,name=manifest_commit,json=manifestCommit,proto3" json:"manifest_commit,omitempty"`
	// Serialized buildbucket GitilesCommit, representing the manifest or
	// manifest-internal commit to which the build is synced.
	GitilesCommit *ProtoBytes `protobuf:"bytes,8,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
}

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

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

func (*PointlessBuildCheckRequest) ProtoMessage() {}

func (x *PointlessBuildCheckRequest) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_pointless_build_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 PointlessBuildCheckRequest.ProtoReflect.Descriptor instead.
func (*PointlessBuildCheckRequest) Descriptor() ([]byte, []int) {
	return file_testplans_pointless_build_proto_rawDescGZIP(), []int{0}
}

func (x *PointlessBuildCheckRequest) GetGerritChanges() []*ProtoBytes {
	if x != nil {
		return x.GerritChanges
	}
	return nil
}

func (x *PointlessBuildCheckRequest) GetRelevantPaths() []*PointlessBuildCheckRequest_Path {
	if x != nil {
		return x.RelevantPaths
	}
	return nil
}

func (x *PointlessBuildCheckRequest) GetManifestCommit() string {
	if x != nil {
		return x.ManifestCommit
	}
	return ""
}

func (x *PointlessBuildCheckRequest) GetGitilesCommit() *ProtoBytes {
	if x != nil {
		return x.GitilesCommit
	}
	return nil
}

// The output proto for invocations of the Pointless Build Checker program.
type PointlessBuildCheckResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether the build is pointless and can be terminated without proceeding to
	// building packages and testing.
	BuildIsPointless *wrappers.BoolValue `protobuf:"bytes,1,opt,name=build_is_pointless,json=buildIsPointless,proto3" json:"build_is_pointless,omitempty"`
	// If build_is_pointless, this is the reason that the Pointless Build Checker
	// came to that conclusion. Otherwise, this is unspecified.
	PointlessBuildReason PointlessBuildCheckResponse_PointlessBuildReason `protobuf:"varint,2,opt,name=pointless_build_reason,json=pointlessBuildReason,proto3,enum=testplans.PointlessBuildCheckResponse_PointlessBuildReason" json:"pointless_build_reason,omitempty"`
}

func (x *PointlessBuildCheckResponse) Reset() {
	*x = PointlessBuildCheckResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_pointless_build_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*PointlessBuildCheckResponse) ProtoMessage() {}

func (x *PointlessBuildCheckResponse) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_pointless_build_proto_msgTypes[1]
	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 PointlessBuildCheckResponse.ProtoReflect.Descriptor instead.
func (*PointlessBuildCheckResponse) Descriptor() ([]byte, []int) {
	return file_testplans_pointless_build_proto_rawDescGZIP(), []int{1}
}

func (x *PointlessBuildCheckResponse) GetBuildIsPointless() *wrappers.BoolValue {
	if x != nil {
		return x.BuildIsPointless
	}
	return nil
}

func (x *PointlessBuildCheckResponse) GetPointlessBuildReason() PointlessBuildCheckResponse_PointlessBuildReason {
	if x != nil {
		return x.PointlessBuildReason
	}
	return PointlessBuildCheckResponse_POINTLESS_BUILD_REASON_UNSPECIFIED
}

type PointlessBuildCheckRequest_Path struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

func (x *PointlessBuildCheckRequest_Path) Reset() {
	*x = PointlessBuildCheckRequest_Path{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_pointless_build_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*PointlessBuildCheckRequest_Path) ProtoMessage() {}

func (x *PointlessBuildCheckRequest_Path) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_pointless_build_proto_msgTypes[2]
	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 PointlessBuildCheckRequest_Path.ProtoReflect.Descriptor instead.
func (*PointlessBuildCheckRequest_Path) Descriptor() ([]byte, []int) {
	return file_testplans_pointless_build_proto_rawDescGZIP(), []int{0, 0}
}

func (x *PointlessBuildCheckRequest_Path) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

var File_testplans_pointless_build_proto protoreflect.FileDescriptor

var file_testplans_pointless_build_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x70, 0x6f, 0x69, 0x6e,
	0x74, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 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, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x02, 0x0a, 0x1a, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65,
	0x73, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f, 0x63, 0x68,
	0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74,
	0x65, 0x73, 0x52, 0x0d, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
	0x73, 0x12, 0x51, 0x0a, 0x0e, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x70, 0x61,
	0x74, 0x68, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x50,
	0x61, 0x74, 0x68, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74,
	0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d,
	0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x3c, 0x0a,
	0x0e, 0x67, 0x69, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18,
	0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e,
	0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0d, 0x67, 0x69,
	0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x1a, 0x1a, 0x0a, 0x04, 0x50,
	0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0xea, 0x02,
	0x0a, 0x1b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a,
	0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x6c,
	0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c,
	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x73, 0x50, 0x6f,
	0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x70, 0x6f, 0x69, 0x6e, 0x74,
	0x6c, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f,
	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c,
	0x61, 0x6e, 0x73, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
	0x50, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65,
	0x61, 0x73, 0x6f, 0x6e, 0x52, 0x14, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x8d, 0x01, 0x0a, 0x14, 0x50,
	0x6f, 0x69, 0x6e, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x61,
	0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x4c, 0x45, 0x53, 0x53,
	0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x49,
	0x52, 0x52, 0x45, 0x4c, 0x45, 0x56, 0x41, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x50,
	0x53, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x01, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x52, 0x52,
	0x45, 0x4c, 0x45, 0x56, 0x41, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,
	0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x44, 0x49, 0x52,
	0x45, 0x43, 0x54, 0x4f, 0x52, 0x49, 0x45, 0x53, 0x10, 0x02, 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_pointless_build_proto_rawDescOnce sync.Once
	file_testplans_pointless_build_proto_rawDescData = file_testplans_pointless_build_proto_rawDesc
)

func file_testplans_pointless_build_proto_rawDescGZIP() []byte {
	file_testplans_pointless_build_proto_rawDescOnce.Do(func() {
		file_testplans_pointless_build_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_pointless_build_proto_rawDescData)
	})
	return file_testplans_pointless_build_proto_rawDescData
}

var file_testplans_pointless_build_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_testplans_pointless_build_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_testplans_pointless_build_proto_goTypes = []interface{}{
	(PointlessBuildCheckResponse_PointlessBuildReason)(0), // 0: testplans.PointlessBuildCheckResponse.PointlessBuildReason
	(*PointlessBuildCheckRequest)(nil),                    // 1: testplans.PointlessBuildCheckRequest
	(*PointlessBuildCheckResponse)(nil),                   // 2: testplans.PointlessBuildCheckResponse
	(*PointlessBuildCheckRequest_Path)(nil),               // 3: testplans.PointlessBuildCheckRequest.Path
	(*ProtoBytes)(nil),                                    // 4: testplans.ProtoBytes
	(*wrappers.BoolValue)(nil),                            // 5: google.protobuf.BoolValue
}
var file_testplans_pointless_build_proto_depIdxs = []int32{
	4, // 0: testplans.PointlessBuildCheckRequest.gerrit_changes:type_name -> testplans.ProtoBytes
	3, // 1: testplans.PointlessBuildCheckRequest.relevant_paths:type_name -> testplans.PointlessBuildCheckRequest.Path
	4, // 2: testplans.PointlessBuildCheckRequest.gitiles_commit:type_name -> testplans.ProtoBytes
	5, // 3: testplans.PointlessBuildCheckResponse.build_is_pointless:type_name -> google.protobuf.BoolValue
	0, // 4: testplans.PointlessBuildCheckResponse.pointless_build_reason:type_name -> testplans.PointlessBuildCheckResponse.PointlessBuildReason
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_testplans_pointless_build_proto_init() }
func file_testplans_pointless_build_proto_init() {
	if File_testplans_pointless_build_proto != nil {
		return
	}
	file_testplans_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_testplans_pointless_build_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PointlessBuildCheckRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_pointless_build_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PointlessBuildCheckResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_pointless_build_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PointlessBuildCheckRequest_Path); 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_pointless_build_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_pointless_build_proto_goTypes,
		DependencyIndexes: file_testplans_pointless_build_proto_depIdxs,
		EnumInfos:         file_testplans_pointless_build_proto_enumTypes,
		MessageInfos:      file_testplans_pointless_build_proto_msgTypes,
	}.Build()
	File_testplans_pointless_build_proto = out.File
	file_testplans_pointless_build_proto_rawDesc = nil
	file_testplans_pointless_build_proto_goTypes = nil
	file_testplans_pointless_build_proto_depIdxs = nil
}
