// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/branch.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 types of branches that can be created.
type Branch_BranchType int32

const (
	Branch_UNSPECIFIED Branch_BranchType = 0
	Branch_RELEASE     Branch_BranchType = 1
	Branch_FACTORY     Branch_BranchType = 2
	Branch_FIRMWARE    Branch_BranchType = 3
	Branch_STABILIZE   Branch_BranchType = 4
	Branch_CUSTOM      Branch_BranchType = 5
)

var Branch_BranchType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "RELEASE",
	2: "FACTORY",
	3: "FIRMWARE",
	4: "STABILIZE",
	5: "CUSTOM",
}

var Branch_BranchType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"RELEASE":     1,
	"FACTORY":     2,
	"FIRMWARE":    3,
	"STABILIZE":   4,
	"CUSTOM":      5,
}

func (x Branch_BranchType) String() string {
	return proto.EnumName(Branch_BranchType_name, int32(x))
}

func (Branch_BranchType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_5475cbd01bbee860, []int{0, 0}
}

// A message to specify branches.
type Branch struct {
	// Type of branch.
	Type Branch_BranchType `protobuf:"varint,1,opt,name=type,proto3,enum=chromiumos.Branch_BranchType" json:"type,omitempty"`
	// Name of branch.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Branch descriptor (usually a build target or device name).
	// Optional.
	Descriptor_          string   `protobuf:"bytes,3,opt,name=descriptor,proto3" json:"descriptor,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Branch proto.InternalMessageInfo

func (m *Branch) GetType() Branch_BranchType {
	if m != nil {
		return m.Type
	}
	return Branch_UNSPECIFIED
}

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

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

func init() {
	proto.RegisterEnum("chromiumos.Branch_BranchType", Branch_BranchType_name, Branch_BranchType_value)
	proto.RegisterType((*Branch)(nil), "chromiumos.Branch")
}

func init() { proto.RegisterFile("chromiumos/branch.proto", fileDescriptor_5475cbd01bbee860) }

var fileDescriptor_5475cbd01bbee860 = []byte{
	// 249 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x90, 0x4d, 0x4f, 0x83, 0x40,
	0x10, 0x86, 0xdd, 0x16, 0xd1, 0x4e, 0xfd, 0xd8, 0xcc, 0x45, 0x2e, 0x9a, 0xa6, 0xa7, 0x9e, 0x20,
	0x7e, 0xc4, 0x3b, 0xe0, 0x92, 0x6c, 0xd2, 0x5a, 0xb3, 0xd0, 0x18, 0x7b, 0x92, 0x22, 0x52, 0x0e,
	0x30, 0x64, 0x8b, 0x87, 0xfe, 0x4c, 0xff, 0x91, 0x71, 0x35, 0x85, 0xd3, 0xee, 0xbc, 0xcf, 0x93,
	0xc9, 0xe4, 0x85, 0xab, 0x6c, 0xab, 0xa9, 0x2a, 0xbf, 0x2a, 0xda, 0x79, 0x1b, 0x9d, 0xd6, 0xd9,
	0xd6, 0x6d, 0x34, 0xb5, 0x84, 0xd0, 0x81, 0xe9, 0x37, 0x03, 0x3b, 0x30, 0x10, 0x6f, 0xc1, 0x6a,
	0xf7, 0x4d, 0xee, 0xb0, 0x09, 0x9b, 0x5d, 0xdc, 0x5d, 0xbb, 0x9d, 0xe5, 0xfe, 0x19, 0xff, 0x4f,
	0xb2, 0x6f, 0x72, 0x65, 0x54, 0x44, 0xb0, 0xea, 0xb4, 0xca, 0x9d, 0xc1, 0x84, 0xcd, 0x46, 0xca,
	0xfc, 0xf1, 0x06, 0xe0, 0x23, 0xdf, 0x65, 0xba, 0x6c, 0x5a, 0xd2, 0xce, 0xd0, 0x90, 0x5e, 0x32,
	0x7d, 0x07, 0xe8, 0xf6, 0xe0, 0x25, 0x8c, 0x57, 0xcf, 0xf1, 0x8b, 0x08, 0x65, 0x24, 0xc5, 0x13,
	0x3f, 0xc2, 0x31, 0x9c, 0x28, 0x31, 0x17, 0x7e, 0x2c, 0x38, 0xfb, 0x1d, 0x22, 0x3f, 0x4c, 0x96,
	0xea, 0x8d, 0x0f, 0xf0, 0x0c, 0x4e, 0x23, 0xa9, 0x16, 0xaf, 0xbe, 0x12, 0x7c, 0x88, 0xe7, 0x30,
	0x8a, 0x13, 0x3f, 0x90, 0x73, 0xb9, 0x16, 0xdc, 0x42, 0x00, 0x3b, 0x5c, 0xc5, 0xc9, 0x72, 0xc1,
	0x8f, 0x83, 0xc7, 0xf5, 0x43, 0x41, 0x87, 0xf3, 0x5d, 0xd2, 0x85, 0xd7, 0xab, 0xa2, 0xac, 0x3f,
	0x75, 0xea, 0x99, 0x26, 0xbc, 0x82, 0x7a, 0x64, 0x63, 0x9b, 0xf0, 0xfe, 0x27, 0x00, 0x00, 0xff,
	0xff, 0x5b, 0x32, 0x90, 0x82, 0x39, 0x01, 0x00, 0x00,
}
