// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/custom_results/graphics/package.proto

package graphics

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

// Next Tag: 7
type Package struct {
	Name    string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// Hash of last commit in git repo.
	GitHash string `protobuf:"bytes,3,opt,name=git_hash,json=gitHash,proto3" json:"git_hash,omitempty"`
	// Git branch package was build from.
	Branch string `protobuf:"bytes,4,opt,name=branch,proto3" json:"branch,omitempty"`
	// Commit date of last commit in git repo.
	CommitDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=commit_date,json=commitDate,proto3" json:"commit_date,omitempty"`
	// For packages coming from git, indicate if the build was generated
	// with a dirty git repo.
	RepoDirty            bool     `protobuf:"varint,6,opt,name=repo_dirty,json=repoDirty,proto3" json:"repo_dirty,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Package proto.InternalMessageInfo

func (m *Package) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Package) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *Package) GetGitHash() string {
	if m != nil {
		return m.GitHash
	}
	return ""
}

func (m *Package) GetBranch() string {
	if m != nil {
		return m.Branch
	}
	return ""
}

func (m *Package) GetCommitDate() *timestamp.Timestamp {
	if m != nil {
		return m.CommitDate
	}
	return nil
}

func (m *Package) GetRepoDirty() bool {
	if m != nil {
		return m.RepoDirty
	}
	return false
}

func init() {
	proto.RegisterType((*Package)(nil), "test.custom_results.graphics.Package")
}

func init() {
	proto.RegisterFile("test/custom_results/graphics/package.proto", fileDescriptor_bec6cee28f50b9e9)
}

var fileDescriptor_bec6cee28f50b9e9 = []byte{
	// 272 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x3f, 0x4b, 0x04, 0x31,
	0x14, 0xc4, 0x59, 0x3d, 0xef, 0x4f, 0xae, 0x4b, 0x21, 0xf1, 0x50, 0x3c, 0xac, 0x16, 0x8b, 0x04,
	0xb4, 0xb4, 0x93, 0x43, 0xae, 0x94, 0xc5, 0xca, 0x66, 0x79, 0x9b, 0xcb, 0x25, 0xc1, 0xcb, 0xbe,
	0x25, 0x79, 0x2b, 0xf8, 0x05, 0xfd, 0x5c, 0xb2, 0x1b, 0xb7, 0xb0, 0xb1, 0xcb, 0xcc, 0xfc, 0xf2,
	0x18, 0x86, 0xdd, 0x93, 0x49, 0xa4, 0x74, 0x9f, 0x08, 0x43, 0x1d, 0x4d, 0xea, 0x4f, 0x94, 0x94,
	0x8d, 0xd0, 0x39, 0xaf, 0x93, 0xea, 0x40, 0x7f, 0x80, 0x35, 0xb2, 0x8b, 0x48, 0xc8, 0xaf, 0x07,
	0x56, 0xfe, 0x65, 0xe5, 0xc4, 0x6e, 0x6e, 0x2d, 0xa2, 0x3d, 0x19, 0x35, 0xb2, 0x4d, 0x7f, 0x54,
	0xe4, 0x83, 0x49, 0x04, 0xa1, 0xcb, 0xdf, 0xef, 0xbe, 0x0b, 0xb6, 0x78, 0xcd, 0x07, 0x39, 0x67,
	0xb3, 0x16, 0x82, 0x11, 0xc5, 0xb6, 0x28, 0x57, 0xd5, 0xf8, 0xe6, 0x82, 0x2d, 0x3e, 0x4d, 0x4c,
	0x1e, 0x5b, 0x71, 0x36, 0xda, 0x93, 0xe4, 0x57, 0x6c, 0x69, 0x3d, 0xd5, 0x0e, 0x92, 0x13, 0xe7,
	0x39, 0xb2, 0x9e, 0xf6, 0x90, 0x1c, 0xbf, 0x64, 0xf3, 0x26, 0x42, 0xab, 0x9d, 0x98, 0x8d, 0xc1,
	0xaf, 0xe2, 0x4f, 0x6c, 0xad, 0x31, 0x04, 0x4f, 0xf5, 0x01, 0xc8, 0x88, 0x8b, 0x6d, 0x51, 0xae,
	0x1f, 0x36, 0x32, 0x77, 0x94, 0x53, 0x47, 0xf9, 0x36, 0x75, 0xac, 0x58, 0xc6, 0x77, 0x40, 0x86,
	0xdf, 0x30, 0x16, 0x4d, 0x87, 0xf5, 0xc1, 0x47, 0xfa, 0x12, 0xf3, 0x6d, 0x51, 0x2e, 0xab, 0xd5,
	0xe0, 0xec, 0x06, 0xe3, 0x79, 0xff, 0xfe, 0x62, 0x51, 0x6a, 0x17, 0x31, 0xf8, 0x3e, 0x48, 0x8c,
	0x56, 0x4d, 0x02, 0x93, 0xf2, 0xed, 0x31, 0x42, 0x5e, 0x41, 0x59, 0x54, 0xff, 0xed, 0xdb, 0xcc,
	0x47, 0xec, 0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0xad, 0x9b, 0xae, 0x5c, 0x86, 0x01, 0x00, 0x00,
}
