// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/repo_cache_state.proto

package chromiumos

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

// The state of the tree.
type RepoState_State int32

const (
	// Unknown: Treated as if it was DIRTY.
	RepoState_STATE_UNSPECIFIED RepoState_State = 0
	// Clean.  The tree is clean.
	RepoState_STATE_CLEAN RepoState_State = 1
	// Dirty.  The tree is in the process of being updated.
	RepoState_STATE_DIRTY RepoState_State = 2
	// Recovery.  Recovery from DIRTY is in progress.
	RepoState_STATE_RECOVERY RepoState_State = 3
)

var RepoState_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "STATE_CLEAN",
	2: "STATE_DIRTY",
	3: "STATE_RECOVERY",
}

var RepoState_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"STATE_CLEAN":       1,
	"STATE_DIRTY":       2,
	"STATE_RECOVERY":    3,
}

func (x RepoState_State) String() string {
	return proto.EnumName(RepoState_State_name, int32(x))
}

func (RepoState_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_89fc521bebffa778, []int{0, 0}
}

type RepoState struct {
	State RepoState_State `protobuf:"varint,1,opt,name=state,proto3,enum=chromiumos.RepoState_State" json:"state,omitempty"`
	// The checked out branch.
	ManifestBranch string `protobuf:"bytes,2,opt,name=manifest_branch,json=manifestBranch,proto3" json:"manifest_branch,omitempty"`
	// The manifest URL.
	ManifestUrl          string   `protobuf:"bytes,3,opt,name=manifest_url,json=manifestUrl,proto3" json:"manifest_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RepoState proto.InternalMessageInfo

func (m *RepoState) GetState() RepoState_State {
	if m != nil {
		return m.State
	}
	return RepoState_STATE_UNSPECIFIED
}

func (m *RepoState) GetManifestBranch() string {
	if m != nil {
		return m.ManifestBranch
	}
	return ""
}

func (m *RepoState) GetManifestUrl() string {
	if m != nil {
		return m.ManifestUrl
	}
	return ""
}

func init() {
	proto.RegisterEnum("chromiumos.RepoState_State", RepoState_State_name, RepoState_State_value)
	proto.RegisterType((*RepoState)(nil), "chromiumos.RepoState")
}

func init() { proto.RegisterFile("chromiumos/repo_cache_state.proto", fileDescriptor_89fc521bebffa778) }

var fileDescriptor_89fc521bebffa778 = []byte{
	// 250 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0xd0, 0xcf, 0x6b, 0xc2, 0x30,
	0x14, 0xc0, 0xf1, 0x45, 0x71, 0xe0, 0x73, 0xd4, 0x2e, 0x30, 0x28, 0xec, 0xa2, 0x5e, 0xe6, 0x29,
	0x65, 0x3f, 0xd8, 0x5d, 0x6b, 0x06, 0x85, 0xe1, 0x46, 0x5a, 0x07, 0xee, 0x52, 0x62, 0x89, 0x6d,
	0xc1, 0xf6, 0x95, 0xb4, 0xfe, 0xbf, 0xfb, 0x53, 0x86, 0x29, 0xb6, 0xbd, 0xe4, 0xf0, 0x7d, 0x9f,
	0x43, 0xde, 0x83, 0x79, 0x9c, 0x6a, 0xcc, 0xb3, 0x73, 0x8e, 0x95, 0xab, 0x55, 0x89, 0x51, 0x2c,
	0xe3, 0x54, 0x45, 0x55, 0x2d, 0x6b, 0xc5, 0x4a, 0x8d, 0x35, 0x52, 0xe8, 0xc8, 0xe2, 0x8f, 0xc0,
	0x58, 0xa8, 0x12, 0x83, 0xcb, 0x9c, 0x3e, 0xc3, 0xc8, 0x40, 0x87, 0xcc, 0xc8, 0xd2, 0x7a, 0x79,
	0x64, 0x9d, 0x64, 0xad, 0x62, 0xe6, 0x15, 0x8d, 0xa4, 0x4f, 0x30, 0xcd, 0x65, 0x91, 0x1d, 0x55,
	0x55, 0x47, 0x07, 0x2d, 0x8b, 0x38, 0x75, 0x06, 0x33, 0xb2, 0x1c, 0x0b, 0xeb, 0x9a, 0xd7, 0xa6,
	0xd2, 0x39, 0xdc, 0xb5, 0xf0, 0xac, 0x4f, 0xce, 0xd0, 0xa8, 0xc9, 0xb5, 0xed, 0xf4, 0x69, 0x11,
	0xc2, 0xa8, 0xf9, 0xc7, 0x03, 0xdc, 0x07, 0xe1, 0x2a, 0xe4, 0xd1, 0x6e, 0x1b, 0x7c, 0x73, 0xcf,
	0xff, 0xf0, 0xf9, 0xc6, 0xbe, 0xa1, 0x53, 0x98, 0x34, 0xd9, 0xfb, 0xe4, 0xab, 0xad, 0x4d, 0xba,
	0xb0, 0xf1, 0x45, 0xb8, 0xb7, 0x07, 0x94, 0x82, 0xd5, 0x04, 0xc1, 0xbd, 0xaf, 0x1f, 0x2e, 0xf6,
	0xf6, 0x70, 0xfd, 0xfe, 0xfb, 0x96, 0x60, 0xbb, 0x09, 0x43, 0x9d, 0xb8, 0xbd, 0x1b, 0x65, 0xc5,
	0x51, 0x4b, 0xd7, 0x1c, 0xc6, 0x4d, 0xb0, 0x37, 0x39, 0xdc, 0x9a, 0xf8, 0xfa, 0x1f, 0x00, 0x00,
	0xff, 0xff, 0x4e, 0x57, 0x8c, 0xc6, 0x52, 0x01, 0x00, 0x00,
}
