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

package testplans

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

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
)

var PointlessBuildCheckResponse_PointlessBuildReason_name = map[int32]string{
	0: "POINTLESS_BUILD_REASON_UNSPECIFIED",
	1: "IRRELEVANT_TO_DEPS_GRAPH",
	2: "IRRELEVANT_TO_KNOWN_NON_PORTAGE_DIRECTORIES",
}

var 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) String() string {
	return proto.EnumName(PointlessBuildCheckResponse_PointlessBuildReason_name, int32(x))
}

func (PointlessBuildCheckResponse_PointlessBuildReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_65492a4cea7c5e67, []int{1, 0}
}

// The input proto for invocations of the Pointless Build Checker program.
type PointlessBuildCheckRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_PointlessBuildCheckRequest proto.InternalMessageInfo

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

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

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

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

type PointlessBuildCheckRequest_Path struct {
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PointlessBuildCheckRequest_Path proto.InternalMessageInfo

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

// The output proto for invocations of the Pointless Build Checker program.
type PointlessBuildCheckResponse struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

func (m *PointlessBuildCheckResponse) Reset()         { *m = PointlessBuildCheckResponse{} }
func (m *PointlessBuildCheckResponse) String() string { return proto.CompactTextString(m) }
func (*PointlessBuildCheckResponse) ProtoMessage()    {}
func (*PointlessBuildCheckResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_65492a4cea7c5e67, []int{1}
}

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

var xxx_messageInfo_PointlessBuildCheckResponse proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterEnum("testplans.PointlessBuildCheckResponse_PointlessBuildReason", PointlessBuildCheckResponse_PointlessBuildReason_name, PointlessBuildCheckResponse_PointlessBuildReason_value)
	proto.RegisterType((*PointlessBuildCheckRequest)(nil), "testplans.PointlessBuildCheckRequest")
	proto.RegisterType((*PointlessBuildCheckRequest_Path)(nil), "testplans.PointlessBuildCheckRequest.Path")
	proto.RegisterType((*PointlessBuildCheckResponse)(nil), "testplans.PointlessBuildCheckResponse")
}

func init() { proto.RegisterFile("testplans/pointless_build.proto", fileDescriptor_65492a4cea7c5e67) }

var fileDescriptor_65492a4cea7c5e67 = []byte{
	// 492 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x5d, 0x6f, 0xd3, 0x30,
	0x14, 0x25, 0x65, 0x94, 0xd5, 0xd3, 0x4a, 0x65, 0x8d, 0x29, 0x0a, 0x08, 0xaa, 0x3e, 0x40, 0x05,
	0x52, 0x22, 0x75, 0xe2, 0x09, 0x5e, 0xfa, 0x61, 0xb6, 0x40, 0x95, 0x04, 0xa7, 0x1b, 0x12, 0x2f,
	0x96, 0x5b, 0xdc, 0xd4, 0x22, 0x89, 0x33, 0xdb, 0x01, 0xf1, 0x23, 0xf8, 0x3b, 0xfc, 0x28, 0x7e,
	0x05, 0x8a, 0xa3, 0x04, 0x98, 0x0a, 0xbc, 0xe5, 0xde, 0x7b, 0xee, 0x39, 0x27, 0xf7, 0x18, 0x3c,
	0xd6, 0x4c, 0xe9, 0x22, 0xa5, 0xb9, 0xf2, 0x0a, 0xc1, 0x73, 0x9d, 0x32, 0xa5, 0xc8, 0xba, 0xe4,
	0xe9, 0x47, 0xb7, 0x90, 0x42, 0x0b, 0xd8, 0x6b, 0x01, 0xce, 0xe9, 0x2f, 0xec, 0x46, 0x64, 0x99,
	0xc8, 0x6b, 0x88, 0xf3, 0x28, 0x11, 0x22, 0x49, 0x99, 0x67, 0xaa, 0x75, 0xb9, 0xf5, 0xbe, 0x48,
	0x5a, 0x14, 0x4c, 0xaa, 0x7a, 0x3e, 0xfa, 0xde, 0x01, 0x4e, 0xd4, 0x90, 0xcf, 0x2a, 0xee, 0xf9,
	0x8e, 0x6d, 0x3e, 0x61, 0x76, 0x5d, 0x32, 0xa5, 0xe1, 0x2b, 0xd0, 0x4f, 0x98, 0x94, 0x5c, 0x93,
	0xcd, 0x8e, 0xe6, 0x09, 0x53, 0xf6, 0xdd, 0xe1, 0xed, 0xf1, 0xd1, 0xe4, 0xbe, 0xdb, 0xea, 0xb9,
	0x51, 0x45, 0x34, 0xfb, 0xaa, 0x99, 0xc2, 0xc7, 0x35, 0x78, 0x5e, 0x63, 0xe1, 0x3b, 0xd0, 0x97,
	0x2c, 0x65, 0x9f, 0x69, 0xae, 0x49, 0x41, 0xf5, 0x4e, 0xd9, 0x3d, 0xb3, 0xfd, 0xec, 0xf7, 0xed,
	0xbf, 0x8a, 0xbb, 0x11, 0xd5, 0x3b, 0x7c, 0xdc, 0x30, 0x54, 0x95, 0x82, 0x4f, 0xc1, 0xbd, 0x8c,
	0xe6, 0x7c, 0xcb, 0x94, 0x26, 0xd5, 0x8f, 0x72, 0x6d, 0x77, 0x87, 0xd6, 0xb8, 0x87, 0xfb, 0x4d,
	0x7b, 0x6e, 0xba, 0xc6, 0x39, 0xd7, 0x3c, 0x65, 0xaa, 0xc1, 0x1d, 0x0e, 0xad, 0x7f, 0x39, 0xaf,
	0xc1, 0xf5, 0xb6, 0xe3, 0x80, 0x83, 0x4a, 0x0f, 0x42, 0x70, 0x50, 0x19, 0xb7, 0x2d, 0xa3, 0x61,
	0xbe, 0xdf, 0x1c, 0x1c, 0xde, 0x19, 0x74, 0x47, 0x3f, 0x3a, 0xe0, 0xc1, 0x5e, 0xef, 0xaa, 0x10,
	0xb9, 0x62, 0xf0, 0x02, 0x40, 0x13, 0x15, 0xe1, 0x8a, 0xb4, 0xe9, 0x19, 0x9e, 0xa3, 0x89, 0xe3,
	0xd6, 0xa9, 0xb8, 0x4d, 0x2a, 0xee, 0x4c, 0x88, 0xf4, 0x8a, 0xa6, 0x25, 0xc3, 0x03, 0xb3, 0xe5,
	0xab, 0x96, 0x1b, 0x5e, 0x83, 0xd3, 0x1b, 0xf1, 0x13, 0xc9, 0xa8, 0x12, 0xb9, 0xdd, 0x19, 0x5a,
	0xe3, 0xfe, 0xe4, 0xe5, 0xff, 0xae, 0x59, 0x3b, 0xba, 0x31, 0xc3, 0x86, 0x02, 0x9f, 0x14, 0x7b,
	0xba, 0xa3, 0x6f, 0x16, 0x38, 0xd9, 0x07, 0x87, 0x4f, 0xc0, 0x28, 0x0a, 0xfd, 0x60, 0xb5, 0x44,
	0x71, 0x4c, 0x66, 0x97, 0xfe, 0x72, 0x41, 0x30, 0x9a, 0xc6, 0x61, 0x40, 0x2e, 0x83, 0x38, 0x42,
	0x73, 0xff, 0xb5, 0x8f, 0x16, 0x83, 0x5b, 0xf0, 0x21, 0xb0, 0x7d, 0x8c, 0xd1, 0x12, 0x5d, 0x4d,
	0x83, 0x15, 0x59, 0x85, 0x64, 0x81, 0xa2, 0x98, 0x9c, 0xe3, 0x69, 0x74, 0x31, 0xb0, 0xa0, 0x07,
	0x9e, 0xff, 0x39, 0x7d, 0x1b, 0x84, 0xef, 0x03, 0x12, 0x84, 0x01, 0x89, 0x42, 0xbc, 0x9a, 0x9e,
	0x23, 0xb2, 0xf0, 0x31, 0x9a, 0xaf, 0x42, 0xec, 0xa3, 0x78, 0xd0, 0x99, 0xbd, 0xf8, 0x70, 0x96,
	0x08, 0x77, 0xb3, 0x93, 0x22, 0xe3, 0x65, 0xe6, 0x0a, 0x99, 0x78, 0x4d, 0x21, 0x94, 0xc7, 0xf3,
	0xad, 0xa4, 0xf5, 0x0b, 0xf7, 0x12, 0xe1, 0xb5, 0xd7, 0x58, 0x77, 0x4d, 0xef, 0xec, 0x67, 0x00,
	0x00, 0x00, 0xff, 0xff, 0x67, 0xa5, 0xdb, 0x27, 0x49, 0x03, 0x00, 0x00,
}
