// Copyright 2023 The ChromiumOS Authors
// 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.27.1
// 	protoc        v3.17.1
// source: chromite/api/relevancy.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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 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 *Path) Reset() {
	*x = Path{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Path) ProtoMessage() {}

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

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

// A relevancy request.
type GetRelevantBuildTargetsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The set of build targets to check for relevancy.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,1,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// The relative paths in the source tree which have been modified.
	AffectedPaths []*Path `protobuf:"bytes,2,rep,name=affected_paths,json=affectedPaths,proto3" json:"affected_paths,omitempty"`
}

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

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

func (*GetRelevantBuildTargetsRequest) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTargets
	}
	return nil
}

func (x *GetRelevantBuildTargetsRequest) GetAffectedPaths() []*Path {
	if x != nil {
		return x.AffectedPaths
	}
	return nil
}

// The response to the relevancy request.
type GetRelevantBuildTargetsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The (possibly) reduced set of build targets which are applicable.
	BuildTargets []*GetRelevantBuildTargetsResponse_RelevantTarget `protobuf:"bytes,1,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
}

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

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

func (*GetRelevantBuildTargetsResponse) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse) GetBuildTargets() []*GetRelevantBuildTargetsResponse_RelevantTarget {
	if x != nil {
		return x.BuildTargets
	}
	return nil
}

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

	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The reason this build target is considered relevant.  Note that a build
	// target may be relevant for many reasons, but the logic short-circuits and
	// stops looking for further reasons a target may be relevant after its
	// already found one (since only one is enough to make the build relevant).
	Reason *GetRelevantBuildTargetsResponse_RelevantTarget_Reason `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget) GetReason() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason {
	if x != nil {
		return x.Reason
	}
	return nil
}

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

	// The path that caused this reason.
	Trigger *Path `protobuf:"bytes,1,opt,name=trigger,proto3" json:"trigger,omitempty"`
	// Types that are assignable to Reason:
	//	*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected_
	//	*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected_
	//	*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected_
	//	*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected_
	//	*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected_
	Reason isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason `protobuf_oneof:"reason"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetTrigger() *Path {
	if x != nil {
		return x.Trigger
	}
	return nil
}

func (m *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetReason() isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason {
	if m != nil {
		return m.Reason
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetBuildToolAffected() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected {
	if x, ok := x.GetReason().(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected_); ok {
		return x.BuildToolAffected
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetProfileAffected() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected {
	if x, ok := x.GetReason().(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected_); ok {
		return x.ProfileAffected
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetOverlayAffected() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected {
	if x, ok := x.GetReason().(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected_); ok {
		return x.OverlayAffected
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetPackageAffected() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected {
	if x, ok := x.GetReason().(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected_); ok {
		return x.PackageAffected
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason) GetPathRuleAffected() *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected {
	if x, ok := x.GetReason().(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected_); ok {
		return x.PathRuleAffected
	}
	return nil
}

type isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason interface {
	isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason()
}

type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected_ struct {
	BuildToolAffected *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected `protobuf:"bytes,2,opt,name=build_tool_affected,json=buildToolAffected,proto3,oneof"`
}

type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected_ struct {
	ProfileAffected *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected `protobuf:"bytes,3,opt,name=profile_affected,json=profileAffected,proto3,oneof"`
}

type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected_ struct {
	OverlayAffected *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected `protobuf:"bytes,4,opt,name=overlay_affected,json=overlayAffected,proto3,oneof"`
}

type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected_ struct {
	PackageAffected *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected `protobuf:"bytes,5,opt,name=package_affected,json=packageAffected,proto3,oneof"`
}

type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected_ struct {
	PathRuleAffected *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected `protobuf:"bytes,6,opt,name=path_rule_affected,json=pathRuleAffected,proto3,oneof"`
}

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected_) isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason() {
}

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected_) isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason() {
}

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected_) isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason() {
}

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected_) isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason() {
}

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected_) isGetRelevantBuildTargetsResponse_RelevantTarget_Reason_Reason() {
}

// A fundamental build tooling path (e.g., chromite, src/scripts) was
// affected.
type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Which fundamental subtree was affected?
	Subtree *Path `protobuf:"bytes,1,opt,name=subtree,proto3" json:"subtree,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected) GetSubtree() *Path {
	if x != nil {
		return x.Subtree
	}
	return nil
}

// A profile inherited by this target was affected.
type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The profile that was affected.
	Profile *Path `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected) GetProfile() *Path {
	if x != nil {
		return x.Profile
	}
	return nil
}

// An overlay inherited by this target was affected.
type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The overlay that was affected.
	Overlay *Path `protobuf:"bytes,1,opt,name=overlay,proto3" json:"overlay,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected) GetOverlay() *Path {
	if x != nil {
		return x.Overlay
	}
	return nil
}

// A package used by this build target was affected.
type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The package affected.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// The full path to the ebuild.
	Ebuild *Path `protobuf:"bytes,2,opt,name=ebuild,proto3" json:"ebuild,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected) GetPackageInfo() *chromiumos.PackageInfo {
	if x != nil {
		return x.PackageInfo
	}
	return nil
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected) GetEbuild() *Path {
	if x != nil {
		return x.Ebuild
	}
	return nil
}

// A special-case path rule resulted in the build target being affected.
type GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The pattern that triggered the path rule.
	Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"`
}

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected) Reset() {
	*x = GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_relevancy_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected) ProtoMessage() {}

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

func (x *GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected) GetPattern() string {
	if x != nil {
		return x.Pattern
	}
	return ""
}

var File_chromite_api_relevancy_proto protoreflect.FileDescriptor

var file_chromite_api_relevancy_proto_rawDesc = []byte{
	0x0a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72,
	0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x22, 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, 0x22,
	0x99, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
	0x12, 0x39, 0x0a, 0x0e, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x74,
	0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x61, 0x66,
	0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xfb, 0x0a, 0x0a, 0x1f,
	0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x61, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e,
	0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x73, 0x1a, 0xf4, 0x09, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x12, 0x5b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x43, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e,
	0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0xc8,
	0x08, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x07, 0x74, 0x72, 0x69,
	0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x07,
	0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x87, 0x01, 0x0a, 0x13, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x55, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x6f, 0x6f, 0x6c, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x6f, 0x6f, 0x6c, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x66,
	0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x53, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52,
	0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65,
	0x76, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f,
	0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x66, 0x66, 0x65,
	0x63, 0x74, 0x65, 0x64, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79,
	0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x53, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47,
	0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52,
	0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x52, 0x65,
	0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x41, 0x66, 0x66, 0x65,
	0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x41,
	0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x80, 0x01, 0x0a, 0x10, 0x70, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x53, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41,
	0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x12, 0x70,
	0x61, 0x74, 0x68, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x54, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61,
	0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x54,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x74,
	0x68, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52,
	0x10, 0x70, 0x61, 0x74, 0x68, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x1a, 0x41, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x6f, 0x6f, 0x6c, 0x41, 0x66,
	0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x72, 0x65,
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x07, 0x73, 0x75, 0x62,
	0x74, 0x72, 0x65, 0x65, 0x1a, 0x3f, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41,
	0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69,
	0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x07, 0x70, 0x72,
	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x3f, 0x0a, 0x0f, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79,
	0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x07, 0x6f, 0x76, 0x65, 0x72,
	0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x07, 0x6f,
	0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x1a, 0x79, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67,
	0x65, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67,
	0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x06, 0x65, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x1a, 0x2c, 0x0a, 0x10, 0x50, 0x61, 0x74, 0x68, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x66, 0x66,
	0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42,
	0x08, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x32, 0x9b, 0x01, 0x0a, 0x10, 0x52, 0x65,
	0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76,
	0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65,
	0x76, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61,
	0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x0f, 0xc2, 0xed, 0x1a, 0x0b, 0x0a, 0x09, 0x72, 0x65,
	0x6c, 0x65, 0x76, 0x61, 0x6e, 0x63, 0x79, 0x42, 0x38, 0x5a, 0x36, 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, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70,
	0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_relevancy_proto_rawDescOnce sync.Once
	file_chromite_api_relevancy_proto_rawDescData = file_chromite_api_relevancy_proto_rawDesc
)

func file_chromite_api_relevancy_proto_rawDescGZIP() []byte {
	file_chromite_api_relevancy_proto_rawDescOnce.Do(func() {
		file_chromite_api_relevancy_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_relevancy_proto_rawDescData)
	})
	return file_chromite_api_relevancy_proto_rawDescData
}

var file_chromite_api_relevancy_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_chromite_api_relevancy_proto_goTypes = []interface{}{
	(*Path)(nil),                                                                    // 0: chromite.api.Path
	(*GetRelevantBuildTargetsRequest)(nil),                                          // 1: chromite.api.GetRelevantBuildTargetsRequest
	(*GetRelevantBuildTargetsResponse)(nil),                                         // 2: chromite.api.GetRelevantBuildTargetsResponse
	(*GetRelevantBuildTargetsResponse_RelevantTarget)(nil),                          // 3: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason)(nil),                   // 4: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected)(nil), // 5: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.BuildToolAffected
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected)(nil),   // 6: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.ProfileAffected
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected)(nil),   // 7: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.OverlayAffected
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected)(nil),   // 8: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PackageAffected
	(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected)(nil),  // 9: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PathRuleAffected
	(*chromiumos.BuildTarget)(nil),                                                  // 10: chromiumos.BuildTarget
	(*chromiumos.PackageInfo)(nil),                                                  // 11: chromiumos.PackageInfo
}
var file_chromite_api_relevancy_proto_depIdxs = []int32{
	10, // 0: chromite.api.GetRelevantBuildTargetsRequest.build_targets:type_name -> chromiumos.BuildTarget
	0,  // 1: chromite.api.GetRelevantBuildTargetsRequest.affected_paths:type_name -> chromite.api.Path
	3,  // 2: chromite.api.GetRelevantBuildTargetsResponse.build_targets:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget
	10, // 3: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.build_target:type_name -> chromiumos.BuildTarget
	4,  // 4: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.reason:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason
	0,  // 5: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.trigger:type_name -> chromite.api.Path
	5,  // 6: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.build_tool_affected:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.BuildToolAffected
	6,  // 7: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.profile_affected:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.ProfileAffected
	7,  // 8: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.overlay_affected:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.OverlayAffected
	8,  // 9: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.package_affected:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PackageAffected
	9,  // 10: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.path_rule_affected:type_name -> chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PathRuleAffected
	0,  // 11: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.BuildToolAffected.subtree:type_name -> chromite.api.Path
	0,  // 12: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.ProfileAffected.profile:type_name -> chromite.api.Path
	0,  // 13: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.OverlayAffected.overlay:type_name -> chromite.api.Path
	11, // 14: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PackageAffected.package_info:type_name -> chromiumos.PackageInfo
	0,  // 15: chromite.api.GetRelevantBuildTargetsResponse.RelevantTarget.Reason.PackageAffected.ebuild:type_name -> chromite.api.Path
	1,  // 16: chromite.api.RelevancyService.GetRelevantBuildTargets:input_type -> chromite.api.GetRelevantBuildTargetsRequest
	2,  // 17: chromite.api.RelevancyService.GetRelevantBuildTargets:output_type -> chromite.api.GetRelevantBuildTargetsResponse
	17, // [17:18] is the sub-list for method output_type
	16, // [16:17] is the sub-list for method input_type
	16, // [16:16] is the sub-list for extension type_name
	16, // [16:16] is the sub-list for extension extendee
	0,  // [0:16] is the sub-list for field type_name
}

func init() { file_chromite_api_relevancy_proto_init() }
func file_chromite_api_relevancy_proto_init() {
	if File_chromite_api_relevancy_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_relevancy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Path); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_relevancy_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromite_api_relevancy_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_BuildToolAffected_)(nil),
		(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_ProfileAffected_)(nil),
		(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_OverlayAffected_)(nil),
		(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PackageAffected_)(nil),
		(*GetRelevantBuildTargetsResponse_RelevantTarget_Reason_PathRuleAffected_)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_relevancy_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   10,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_relevancy_proto_goTypes,
		DependencyIndexes: file_chromite_api_relevancy_proto_depIdxs,
		MessageInfos:      file_chromite_api_relevancy_proto_msgTypes,
	}.Build()
	File_chromite_api_relevancy_proto = out.File
	file_chromite_api_relevancy_proto_rawDesc = nil
	file_chromite_api_relevancy_proto_goTypes = nil
	file_chromite_api_relevancy_proto_depIdxs = nil
}
