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

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

// This can easily be generalized to a Builds 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 BuildsChromeRequest 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 we are checking for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// List of packages to be installed by the builder. If none are specified the
	// standard list of packages is used.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeRequest proto.InternalMessageInfo

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

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

func (m *BuildsChromeRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

type BuildsChromeResponse struct {
	// Whether or not it builds chrome.
	BuildsChrome         bool     `protobuf:"varint,1,opt,name=builds_chrome,json=buildsChrome,proto3" json:"builds_chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeResponse proto.InternalMessageInfo

func (m *BuildsChromeResponse) GetBuildsChrome() bool {
	if m != nil {
		return m.BuildsChrome
	}
	return false
}

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{2}
}

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{3}
}

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{4}
}

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{5}
}

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 ""
}

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

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

var xxx_messageInfo_GetTargetVersionsRequest proto.InternalMessageInfo

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

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

type GetTargetVersionsResponse struct {
	// Android version, e.g. 5812377
	AndroidVersion string `protobuf:"bytes,1,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android-branch version, e.g. git_nyc
	AndroidBranchVersion string `protobuf:"bytes,2,opt,name=android_branch_version,json=androidBranchVersion,proto3" json:"android_branch_version,omitempty"`
	// Android-target version, e.g. cheets
	AndroidTargetVersion string `protobuf:"bytes,3,opt,name=android_target_version,json=androidTargetVersion,proto3" json:"android_target_version,omitempty"`
	// Chrome version, e.g. 78.0.3877.0.
	ChromeVersion string `protobuf:"bytes,4,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// Full version, e.g. R78-12438.0.0.
	FullVersion string `protobuf:"bytes,5,opt,name=full_version,json=fullVersion,proto3" json:"full_version,omitempty"`
	// Milestone version, e.g. 78.
	MilestoneVersion string `protobuf:"bytes,6,opt,name=milestone_version,json=milestoneVersion,proto3" json:"milestone_version,omitempty"`
	// Platform version, e.g. 12438.0.0.
	PlatformVersion      string   `protobuf:"bytes,7,opt,name=platform_version,json=platformVersion,proto3" json:"platform_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsResponse proto.InternalMessageInfo

func (m *GetTargetVersionsResponse) GetAndroidVersion() string {
	if m != nil {
		return m.AndroidVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidBranchVersion() string {
	if m != nil {
		return m.AndroidBranchVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidTargetVersion() string {
	if m != nil {
		return m.AndroidTargetVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetChromeVersion() string {
	if m != nil {
		return m.ChromeVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetFullVersion() string {
	if m != nil {
		return m.FullVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetMilestoneVersion() string {
	if m != nil {
		return m.MilestoneVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetPlatformVersion() string {
	if m != nil {
		return m.PlatformVersion
	}
	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"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome               bool     `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,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{8}
}

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
}

func (m *HasChromePrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

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{9}
}

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{10}
}

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{11}
}

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{11, 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{12}
}

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{12, 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{13}
}

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// PackageServiceClient is the client API for PackageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PackageServiceClient interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error)
}

type packageServiceClient struct {
	cc *grpc.ClientConn
}

func NewPackageServiceClient(cc *grpc.ClientConn) PackageServiceClient {
	return &packageServiceClient{cc}
}

func (c *packageServiceClient) BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error) {
	out := new(BuildsChromeResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/BuildsChrome", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error) {
	out := new(GetBestVisibleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBestVisible", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error) {
	out := new(GetChromeVersionResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetChromeVersion", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error) {
	out := new(GetTargetVersionsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetTargetVersions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error) {
	out := new(HasChromePrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasChromePrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error) {
	out := new(UprevPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/Uprev", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error) {
	out := new(UprevVersionedPackageResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/UprevVersionedPackage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PackageServiceServer is the server API for PackageService service.
type PackageServiceServer interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(context.Context, *BuildsChromeRequest) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(context.Context, *GetBestVisibleRequest) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(context.Context, *GetChromeVersionRequest) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(context.Context, *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(context.Context, *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(context.Context, *UprevPackagesRequest) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(context.Context, *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error)
}

// UnimplementedPackageServiceServer can be embedded to have forward compatible implementations.
type UnimplementedPackageServiceServer struct {
}

func (*UnimplementedPackageServiceServer) BuildsChrome(ctx context.Context, req *BuildsChromeRequest) (*BuildsChromeResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildsChrome not implemented")
}
func (*UnimplementedPackageServiceServer) GetBestVisible(ctx context.Context, req *GetBestVisibleRequest) (*GetBestVisibleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBestVisible not implemented")
}
func (*UnimplementedPackageServiceServer) GetChromeVersion(ctx context.Context, req *GetChromeVersionRequest) (*GetChromeVersionResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetChromeVersion not implemented")
}
func (*UnimplementedPackageServiceServer) GetTargetVersions(ctx context.Context, req *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetTargetVersions not implemented")
}
func (*UnimplementedPackageServiceServer) HasChromePrebuilt(ctx context.Context, req *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasChromePrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) Uprev(ctx context.Context, req *UprevPackagesRequest) (*UprevPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Uprev not implemented")
}
func (*UnimplementedPackageServiceServer) UprevVersionedPackage(ctx context.Context, req *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UprevVersionedPackage not implemented")
}

func RegisterPackageServiceServer(s *grpc.Server, srv PackageServiceServer) {
	s.RegisterService(&_PackageService_serviceDesc, srv)
}

func _PackageService_BuildsChrome_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildsChromeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).BuildsChrome(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/BuildsChrome",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).BuildsChrome(ctx, req.(*BuildsChromeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBestVisible_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBestVisibleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBestVisible(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBestVisible",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBestVisible(ctx, req.(*GetBestVisibleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetChromeVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetChromeVersionRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetChromeVersion",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, req.(*GetChromeVersionRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetTargetVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTargetVersionsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetTargetVersions",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, req.(*GetTargetVersionsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasChromePrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasChromePrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasChromePrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, req.(*HasChromePrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_Uprev_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).Uprev(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/Uprev",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).Uprev(ctx, req.(*UprevPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_UprevVersionedPackage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevVersionedPackageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/UprevVersionedPackage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, req.(*UprevVersionedPackageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PackageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PackageService",
	HandlerType: (*PackageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildsChrome",
			Handler:    _PackageService_BuildsChrome_Handler,
		},
		{
			MethodName: "GetBestVisible",
			Handler:    _PackageService_GetBestVisible_Handler,
		},
		{
			MethodName: "GetChromeVersion",
			Handler:    _PackageService_GetChromeVersion_Handler,
		},
		{
			MethodName: "GetTargetVersions",
			Handler:    _PackageService_GetTargetVersions_Handler,
		},
		{
			MethodName: "HasChromePrebuilt",
			Handler:    _PackageService_HasChromePrebuilt_Handler,
		},
		{
			MethodName: "Uprev",
			Handler:    _PackageService_Uprev_Handler,
		},
		{
			MethodName: "UprevVersionedPackage",
			Handler:    _PackageService_UprevVersionedPackage_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/packages.proto",
}
