// Copyright 2021 The Fuchsia 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.27.1
// 	protoc        v3.17.3
// source: build_artifacts.proto

package proto

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	structpb "google.golang.org/protobuf/types/known/structpb"
	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)
)

// BuildArtifacts contains information about the targets built by `fint build`.
type BuildArtifacts struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A brief error log populated in case of a recognized failure mode (e.g. a
	// Ninja compilation failure).
	FailureSummary string `protobuf:"bytes,1,opt,name=failure_summary,json=failureSummary,proto3" json:"failure_summary,omitempty"`
	// All targets that were passed to Ninja.
	BuiltTargets []string `protobuf:"bytes,2,rep,name=built_targets,json=builtTargets,proto3" json:"built_targets,omitempty"`
	// Images produced by the build. We use a struct to avoid needing to maintain
	// a copy of the images.json schema here.
	BuiltImages []*structpb.Struct `protobuf:"bytes,3,rep,name=built_images,json=builtImages,proto3" json:"built_images,omitempty"`
	// Archives produced by the build. We use a struct to avoid needing to
	// maintain a copy of the images.json schema here.
	BuiltArchives []*structpb.Struct `protobuf:"bytes,4,rep,name=built_archives,json=builtArchives,proto3" json:"built_archives,omitempty"`
	// Zedboot paving images built for ZBI tests. Only populated if ZBI tests were
	// built.
	BuiltZedbootImages []*structpb.Struct `protobuf:"bytes,5,rep,name=built_zedboot_images,json=builtZedbootImages,proto3" json:"built_zedboot_images,omitempty"`
	// Mapping from ZBI test name to QEMU kernel image for the test. Only
	// populated if ZBI tests were built.
	ZbiTestQemuKernelImages map[string]*structpb.Struct `protobuf:"bytes,6,rep,name=zbi_test_qemu_kernel_images,json=zbiTestQemuKernelImages,proto3" json:"zbi_test_qemu_kernel_images,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Absolute path to the Ninja log file.
	NinjaLogPath string `protobuf:"bytes,7,opt,name=ninja_log_path,json=ninjaLogPath,proto3" json:"ninja_log_path,omitempty"`
	// Absolute path to a Ninja graph file.
	NinjaGraphPath string `protobuf:"bytes,8,opt,name=ninja_graph_path,json=ninjaGraphPath,proto3" json:"ninja_graph_path,omitempty"`
	// Absolute path to a Ninja compdb file.
	NinjaCompdbPath string `protobuf:"bytes,9,opt,name=ninja_compdb_path,json=ninjaCompdbPath,proto3" json:"ninja_compdb_path,omitempty"`
	// The duration taken by the ninja build step.
	NinjaDurationSeconds int32 `protobuf:"varint,10,opt,name=ninja_duration_seconds,json=ninjaDurationSeconds,proto3" json:"ninja_duration_seconds,omitempty"`
	// Mapping from user-friendly title to absolute path for important log files
	// that should be presented by the infrastructure for humans to read. We
	// reference the logs by path rather than inlining the contents in the
	// protobuf because the logs may be very long and inlining them would make it
	// very hard for humans to read the output proto.
	LogFiles map[string]string `protobuf:"bytes,11,rep,name=log_files,json=logFiles,proto3" json:"log_files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Whether an analysis of the build graph determined that the changed files do
	// not affect the build.
	BuildNotAffected bool `protobuf:"varint,12,opt,name=build_not_affected,json=buildNotAffected,proto3" json:"build_not_affected,omitempty"`
	// Names, as they appear in tests.json, of tests affected by the change under
	// tests. This is determined by doing a build graph analysis of the files
	// reported in the `changed_files` context spec field.
	AffectedTests []string `protobuf:"bytes,13,rep,name=affected_tests,json=affectedTests,proto3" json:"affected_tests,omitempty"`
}

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

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

func (*BuildArtifacts) ProtoMessage() {}

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

func (x *BuildArtifacts) GetFailureSummary() string {
	if x != nil {
		return x.FailureSummary
	}
	return ""
}

func (x *BuildArtifacts) GetBuiltTargets() []string {
	if x != nil {
		return x.BuiltTargets
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltImages() []*structpb.Struct {
	if x != nil {
		return x.BuiltImages
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltArchives() []*structpb.Struct {
	if x != nil {
		return x.BuiltArchives
	}
	return nil
}

func (x *BuildArtifacts) GetBuiltZedbootImages() []*structpb.Struct {
	if x != nil {
		return x.BuiltZedbootImages
	}
	return nil
}

func (x *BuildArtifacts) GetZbiTestQemuKernelImages() map[string]*structpb.Struct {
	if x != nil {
		return x.ZbiTestQemuKernelImages
	}
	return nil
}

func (x *BuildArtifacts) GetNinjaLogPath() string {
	if x != nil {
		return x.NinjaLogPath
	}
	return ""
}

func (x *BuildArtifacts) GetNinjaGraphPath() string {
	if x != nil {
		return x.NinjaGraphPath
	}
	return ""
}

func (x *BuildArtifacts) GetNinjaCompdbPath() string {
	if x != nil {
		return x.NinjaCompdbPath
	}
	return ""
}

func (x *BuildArtifacts) GetNinjaDurationSeconds() int32 {
	if x != nil {
		return x.NinjaDurationSeconds
	}
	return 0
}

func (x *BuildArtifacts) GetLogFiles() map[string]string {
	if x != nil {
		return x.LogFiles
	}
	return nil
}

func (x *BuildArtifacts) GetBuildNotAffected() bool {
	if x != nil {
		return x.BuildNotAffected
	}
	return false
}

func (x *BuildArtifacts) GetAffectedTests() []string {
	if x != nil {
		return x.AffectedTests
	}
	return nil
}

var File_build_artifacts_proto protoreflect.FileDescriptor

var file_build_artifacts_proto_rawDesc = []byte{
	0x0a, 0x15, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x66, 0x69, 0x6e, 0x74, 0x1a, 0x1c, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73,
	0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x07, 0x0a, 0x0e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x27,
	0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72,
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
	0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x74,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69,
	0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0e, 0x62, 0x75, 0x69, 0x6c,
	0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x74,
	0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x14, 0x62, 0x75, 0x69, 0x6c,
	0x74, 0x5f, 0x7a, 0x65, 0x64, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73,
	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52,
	0x12, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5a, 0x65, 0x64, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61,
	0x67, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x1b, 0x7a, 0x62, 0x69, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x71, 0x65, 0x6d, 0x75, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6d, 0x61, 0x67,
	0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x74, 0x2e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2e, 0x5a,
	0x62, 0x69, 0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c,
	0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x7a, 0x62, 0x69,
	0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x6c, 0x6f,
	0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x69,
	0x6e, 0x6a, 0x61, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x69,
	0x6e, 0x6a, 0x61, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68,
	0x50, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x63, 0x6f,
	0x6d, 0x70, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0f, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x64, 0x62, 0x50, 0x61, 0x74, 0x68,
	0x12, 0x34, 0x0a, 0x16, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x14, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
	0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69,
	0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x66, 0x69, 0x6e, 0x74,
	0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x2e,
	0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6c,
	0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20,
	0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4e, 0x6f, 0x74, 0x41, 0x66, 0x66,
	0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
	0x64, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61,
	0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x63, 0x0a, 0x1c,
	0x5a, 0x62, 0x69, 0x54, 0x65, 0x73, 0x74, 0x51, 0x65, 0x6d, 0x75, 0x4b, 0x65, 0x72, 0x6e, 0x65,
	0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
	0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
	0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x35,
	0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x66, 0x75, 0x63, 0x68, 0x73, 0x69, 0x61, 0x2e, 0x64, 0x65, 0x76,
	0x2f, 0x66, 0x75, 0x63, 0x68, 0x73, 0x69, 0x61, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x69,
	0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x66, 0x69, 0x6e, 0x74, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_build_artifacts_proto_rawDescOnce sync.Once
	file_build_artifacts_proto_rawDescData = file_build_artifacts_proto_rawDesc
)

func file_build_artifacts_proto_rawDescGZIP() []byte {
	file_build_artifacts_proto_rawDescOnce.Do(func() {
		file_build_artifacts_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_artifacts_proto_rawDescData)
	})
	return file_build_artifacts_proto_rawDescData
}

var file_build_artifacts_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_build_artifacts_proto_goTypes = []interface{}{
	(*BuildArtifacts)(nil),  // 0: fint.BuildArtifacts
	nil,                     // 1: fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry
	nil,                     // 2: fint.BuildArtifacts.LogFilesEntry
	(*structpb.Struct)(nil), // 3: google.protobuf.Struct
}
var file_build_artifacts_proto_depIdxs = []int32{
	3, // 0: fint.BuildArtifacts.built_images:type_name -> google.protobuf.Struct
	3, // 1: fint.BuildArtifacts.built_archives:type_name -> google.protobuf.Struct
	3, // 2: fint.BuildArtifacts.built_zedboot_images:type_name -> google.protobuf.Struct
	1, // 3: fint.BuildArtifacts.zbi_test_qemu_kernel_images:type_name -> fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry
	2, // 4: fint.BuildArtifacts.log_files:type_name -> fint.BuildArtifacts.LogFilesEntry
	3, // 5: fint.BuildArtifacts.ZbiTestQemuKernelImagesEntry.value:type_name -> google.protobuf.Struct
	6, // [6:6] is the sub-list for method output_type
	6, // [6:6] is the sub-list for method input_type
	6, // [6:6] is the sub-list for extension type_name
	6, // [6:6] is the sub-list for extension extendee
	0, // [0:6] is the sub-list for field type_name
}

func init() { file_build_artifacts_proto_init() }
func file_build_artifacts_proto_init() {
	if File_build_artifacts_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_build_artifacts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildArtifacts); 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_build_artifacts_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_build_artifacts_proto_goTypes,
		DependencyIndexes: file_build_artifacts_proto_depIdxs,
		MessageInfos:      file_build_artifacts_proto_msgTypes,
	}.Build()
	File_build_artifacts_proto = out.File
	file_build_artifacts_proto_rawDesc = nil
	file_build_artifacts_proto_goTypes = nil
	file_build_artifacts_proto_depIdxs = nil
}
