// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/packages.proto

package api

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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 GetBestVisibleRequest struct {
	// An atom to pass to portageq, e.g. 'chromeos-chrome'.
	Atom string `protobuf:"bytes,1,opt,name=atom,proto3" json:"atom,omitempty"`
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine. Checks the chroot when not provided.
	// Required when examining a build target.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleRequest proto.InternalMessageInfo

func (m *GetBestVisibleRequest) GetAtom() string {
	if m != nil {
		return m.Atom
	}
	return ""
}

func (m *GetBestVisibleRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *GetBestVisibleRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

type GetBestVisibleResponse struct {
	// TODO: is this sufficient? Needs tag too?
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleResponse proto.InternalMessageInfo

func (m *GetBestVisibleResponse) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type GetChromeVersionRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *GetChromeVersionRequest) Reset()         { *m = GetChromeVersionRequest{} }
func (m *GetChromeVersionRequest) String() string { return proto.CompactTextString(m) }
func (*GetChromeVersionRequest) ProtoMessage()    {}
func (*GetChromeVersionRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{2}
}

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

var xxx_messageInfo_GetChromeVersionRequest proto.InternalMessageInfo

func (m *GetChromeVersionRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *GetChromeVersionRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

type GetChromeVersionResponse struct {
	// The chrome version.
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetChromeVersionResponse) Reset()         { *m = GetChromeVersionResponse{} }
func (m *GetChromeVersionResponse) String() string { return proto.CompactTextString(m) }
func (*GetChromeVersionResponse) ProtoMessage()    {}
func (*GetChromeVersionResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{3}
}

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

var xxx_messageInfo_GetChromeVersionResponse proto.InternalMessageInfo

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

// This can easily be generalized to a HasPrebuilt method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type HasChromePrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *HasChromePrebuiltRequest) Reset()         { *m = HasChromePrebuiltRequest{} }
func (m *HasChromePrebuiltRequest) String() string { return proto.CompactTextString(m) }
func (*HasChromePrebuiltRequest) ProtoMessage()    {}
func (*HasChromePrebuiltRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{4}
}

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

var xxx_messageInfo_HasChromePrebuiltRequest proto.InternalMessageInfo

func (m *HasChromePrebuiltRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *HasChromePrebuiltRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

type HasChromePrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HasChromePrebuiltResponse) Reset()         { *m = HasChromePrebuiltResponse{} }
func (m *HasChromePrebuiltResponse) String() string { return proto.CompactTextString(m) }
func (*HasChromePrebuiltResponse) ProtoMessage()    {}
func (*HasChromePrebuiltResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{5}
}

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

var xxx_messageInfo_HasChromePrebuiltResponse proto.InternalMessageInfo

func (m *HasChromePrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type UprevPackagesRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target(s) whose packages should be uprevved.
	// Defaults to all build targets when none are given.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,2,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// Required.
	// The overlay type to search against.
	OverlayType OverlayType `protobuf:"varint,3,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Optional.
	// A directory where results should be dumped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UprevPackagesRequest) Reset()         { *m = UprevPackagesRequest{} }
func (m *UprevPackagesRequest) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesRequest) ProtoMessage()    {}
func (*UprevPackagesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{6}
}

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

var xxx_messageInfo_UprevPackagesRequest proto.InternalMessageInfo

func (m *UprevPackagesRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *UprevPackagesRequest) GetOverlayType() OverlayType {
	if m != nil {
		return m.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

func (m *UprevPackagesRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

// TODO(evanhernandez): Support build-target specific uprevs once needed.
type UprevVersionedPackageRequest struct {
	// The chroot path. Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The package to uprev.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// The versions to consider for an update.
	Versions []*UprevVersionedPackageRequest_GitRef `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"`
	// The build targets whose sysroot should be cleaned of old versions.
	BuildTargets         []*chromiumos.BuildTarget `protobuf:"bytes,4,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *UprevVersionedPackageRequest) Reset()         { *m = UprevVersionedPackageRequest{} }
func (m *UprevVersionedPackageRequest) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageRequest) ProtoMessage()    {}
func (*UprevVersionedPackageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{7}
}

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

var xxx_messageInfo_UprevVersionedPackageRequest proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetVersions() []*UprevVersionedPackageRequest_GitRef {
	if m != nil {
		return m.Versions
	}
	return nil
}

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

type UprevVersionedPackageRequest_GitRef struct {
	// Relative path to the git repository.
	Repository string `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"`
	// The name of the git ref.
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// The exact sha1 of the git ref.
	Revision             string   `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageRequest_GitRef proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest_GitRef) GetRepository() string {
	if m != nil {
		return m.Repository
	}
	return ""
}

func (m *UprevVersionedPackageRequest_GitRef) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *UprevVersionedPackageRequest_GitRef) GetRevision() string {
	if m != nil {
		return m.Revision
	}
	return ""
}

type UprevPackagesResponse struct {
	// The list of ebuilds that were modified. Contains added and deleted files.
	ModifiedEbuilds []*UprevPackagesResponse_Ebuild `protobuf:"bytes,1,rep,name=modified_ebuilds,json=modifiedEbuilds,proto3" json:"modified_ebuilds,omitempty"`
	// The new version that was uprevved to when an uprev was completed.
	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UprevPackagesResponse) Reset()         { *m = UprevPackagesResponse{} }
func (m *UprevPackagesResponse) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesResponse) ProtoMessage()    {}
func (*UprevPackagesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{8}
}

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

var xxx_messageInfo_UprevPackagesResponse proto.InternalMessageInfo

func (m *UprevPackagesResponse) GetModifiedEbuilds() []*UprevPackagesResponse_Ebuild {
	if m != nil {
		return m.ModifiedEbuilds
	}
	return nil
}

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

type UprevPackagesResponse_Ebuild 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 *UprevPackagesResponse_Ebuild) Reset()         { *m = UprevPackagesResponse_Ebuild{} }
func (m *UprevPackagesResponse_Ebuild) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesResponse_Ebuild) ProtoMessage()    {}
func (*UprevPackagesResponse_Ebuild) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{8, 0}
}

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

var xxx_messageInfo_UprevPackagesResponse_Ebuild proto.InternalMessageInfo

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

type UprevVersionedPackageResponse struct {
	// list of uprev responses.
	Responses            []*UprevPackagesResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *UprevVersionedPackageResponse) Reset()         { *m = UprevVersionedPackageResponse{} }
func (m *UprevVersionedPackageResponse) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageResponse) ProtoMessage()    {}
func (*UprevVersionedPackageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{9}
}

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

var xxx_messageInfo_UprevVersionedPackageResponse proto.InternalMessageInfo

func (m *UprevVersionedPackageResponse) GetResponses() []*UprevPackagesResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func init() {
	proto.RegisterType((*GetBestVisibleRequest)(nil), "chromite.api.GetBestVisibleRequest")
	proto.RegisterType((*GetBestVisibleResponse)(nil), "chromite.api.GetBestVisibleResponse")
	proto.RegisterType((*GetChromeVersionRequest)(nil), "chromite.api.GetChromeVersionRequest")
	proto.RegisterType((*GetChromeVersionResponse)(nil), "chromite.api.GetChromeVersionResponse")
	proto.RegisterType((*HasChromePrebuiltRequest)(nil), "chromite.api.HasChromePrebuiltRequest")
	proto.RegisterType((*HasChromePrebuiltResponse)(nil), "chromite.api.HasChromePrebuiltResponse")
	proto.RegisterType((*UprevPackagesRequest)(nil), "chromite.api.UprevPackagesRequest")
	proto.RegisterType((*UprevVersionedPackageRequest)(nil), "chromite.api.UprevVersionedPackageRequest")
	proto.RegisterType((*UprevVersionedPackageRequest_GitRef)(nil), "chromite.api.UprevVersionedPackageRequest.GitRef")
	proto.RegisterType((*UprevPackagesResponse)(nil), "chromite.api.UprevPackagesResponse")
	proto.RegisterType((*UprevPackagesResponse_Ebuild)(nil), "chromite.api.UprevPackagesResponse.Ebuild")
	proto.RegisterType((*UprevVersionedPackageResponse)(nil), "chromite.api.UprevVersionedPackageResponse")
}

func init() { proto.RegisterFile("chromite/api/packages.proto", fileDescriptor_40286986e1d9a416) }

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