aboutsummaryrefslogtreecommitdiffstats
path: root/core/reference.go
diff options
context:
space:
mode:
authorMáximo Cuadros <mcuadros@gmail.com>2016-08-11 23:57:37 +0200
committerMáximo Cuadros <mcuadros@gmail.com>2016-08-11 23:57:37 +0200
commit68307cee4259c6c4fded8124af7f993f0266a545 (patch)
tree60ce61c531bba4161744f9c6d359ac1d45e0399a /core/reference.go
parent223308ee235035d26ca75fe312fe0da6e6a33222 (diff)
downloadgo-git-68307cee4259c6c4fded8124af7f993f0266a545.tar.gz
core: Reference logic implementation, and InvalidObject ObjectType
Diffstat (limited to 'core/reference.go')
-rw-r--r--core/reference.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/core/reference.go b/core/reference.go
new file mode 100644
index 0000000..9114b58
--- /dev/null
+++ b/core/reference.go
@@ -0,0 +1,124 @@
+package core
+
+import "strings"
+
+const (
+ refPrefix = "refs/"
+ refHeadPrefix = refPrefix + "heads/"
+ refTagPrefix = refPrefix + "tags/"
+ refRemotePrefix = refPrefix + "remotes/"
+ refNotePrefix = refPrefix + "notes/"
+ symrefPrefix = "ref: "
+)
+
+// ReferenceType reference type's
+type ReferenceType int8
+
+const (
+ InvalidReference ReferenceType = 0
+ HashReference ReferenceType = 1
+ SymbolicReference ReferenceType = 2
+)
+
+// ReferenceName reference name's
+type ReferenceName string
+
+const (
+ HEAD ReferenceName = "HEAD"
+)
+
+// Reference is a representation of git reference
+type Reference struct {
+ t ReferenceType
+ n ReferenceName
+ h Hash
+ target ReferenceName
+}
+
+// NewReferenceFromStrings creates a reference from name and target as string,
+// the resulting reference can be a SymbolicReference or a HashReference base
+// on the target provided
+func NewReferenceFromStrings(name, target string) *Reference {
+ r := &Reference{n: ReferenceName(name)}
+
+ if strings.HasPrefix(target, symrefPrefix) {
+ r.t = SymbolicReference
+ r.target = ReferenceName(target[len(symrefPrefix):])
+ return r
+ }
+
+ r.t = HashReference
+ r.h = NewHash(target)
+ return r
+}
+
+// NewSymbolicReference creates a new SymbolicReference reference
+func NewSymbolicReference(n, target ReferenceName) *Reference {
+ return &Reference{
+ t: SymbolicReference,
+ n: n,
+ target: target,
+ }
+}
+
+// NewHashReference creates a new HashReference reference
+func NewHashReference(n ReferenceName, h Hash) *Reference {
+ return &Reference{
+ t: HashReference,
+ n: n,
+ h: h,
+ }
+}
+
+// Type return the type of a reference
+func (r *Reference) Type() ReferenceType {
+ return r.t
+}
+
+// Name return the name of a reference
+func (r *Reference) Name() ReferenceName {
+ return r.n
+}
+
+// Hash return the hash of a hash reference
+func (r *Reference) Hash() Hash {
+ return r.h
+}
+
+// Target return the target of a symbolic reference
+func (r *Reference) Target() ReferenceName {
+ return r.target
+}
+
+// IsBranch check if a reference is a branch
+func (r *Reference) IsBranch() bool {
+ return strings.HasPrefix(string(r.n), refHeadPrefix)
+}
+
+// IsNote check if a reference is a note
+func (r *Reference) IsNote() bool {
+ return strings.HasPrefix(string(r.n), refNotePrefix)
+}
+
+// IsRemote check if a reference is a remote
+func (r *Reference) IsRemote() bool {
+ return strings.HasPrefix(string(r.n), refRemotePrefix)
+}
+
+// IsTag check if a reference is a tag
+func (r *Reference) IsTag() bool {
+ return strings.HasPrefix(string(r.n), refTagPrefix)
+}
+
+// ReferenceStorage generic storage of references
+type ReferenceStorage interface {
+ Set(Reference) error
+ Get(ReferenceName) (Reference, error)
+ Iter(ObjectType) (ReferenceIter, error)
+}
+
+// ReferenceIter is a generic closable interface for iterating over references
+type ReferenceIter interface {
+ Next() (Reference, error)
+ Close()
+}