summaryrefslogtreecommitdiff
path: root/object.go
diff options
context:
space:
mode:
Diffstat (limited to 'object.go')
-rw-r--r--object.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/object.go b/object.go
new file mode 100644
index 0000000..c6cd8a8
--- /dev/null
+++ b/object.go
@@ -0,0 +1,84 @@
+package git
+
+/*
+#cgo pkg-config: libgit2
+#include <git2.h>
+#include <git2/errors.h>
+*/
+import "C"
+import "runtime"
+
+type ObjectType int
+
+var (
+ OBJ_ANY ObjectType = C.GIT_OBJ_ANY
+ OBJ_BAD ObjectType = C.GIT_OBJ_BAD
+ OBJ_COMMIT ObjectType = C.GIT_OBJ_COMMIT
+ OBJ_TREE ObjectType = C.GIT_OBJ_TREE
+ OBJ_BLOB ObjectType = C.GIT_OBJ_BLOB
+ OBJ_TAG ObjectType = C.GIT_OBJ_TAG
+)
+
+type Object interface {
+ Free()
+ Id() *Oid
+ Type() ObjectType
+}
+
+type gitObject struct {
+ ptr *C.git_object
+}
+
+func (t ObjectType) String() (string) {
+ switch (t) {
+ case OBJ_ANY:
+ return "Any"
+ case OBJ_BAD:
+ return "Bad"
+ case OBJ_COMMIT:
+ return "Commit"
+ case OBJ_TREE:
+ return "Tree"
+ case OBJ_BLOB:
+ return "Blob"
+ case OBJ_TAG:
+ return "tag"
+ }
+ // Never reached
+ return ""
+}
+
+func (o gitObject) Id() *Oid {
+ return newOidFromC(C.git_commit_id(o.ptr))
+}
+
+func (o gitObject) Type() ObjectType {
+ return ObjectType(C.git_object_type(o.ptr))
+}
+
+func (o *gitObject) Free() {
+ runtime.SetFinalizer(o, nil)
+ C.git_commit_free(o.ptr)
+}
+
+func allocObject(cobj *C.git_object) Object {
+
+ switch ObjectType(C.git_object_type(cobj)) {
+ case OBJ_COMMIT:
+ commit := &Commit{gitObject{cobj}}
+ runtime.SetFinalizer(commit, (*Commit).Free)
+ return commit
+
+ case OBJ_TREE:
+ tree := &Tree{gitObject{cobj}}
+ runtime.SetFinalizer(tree, (*Tree).Free)
+ return tree
+
+ case OBJ_BLOB:
+ blob := &Blob{gitObject{cobj}}
+ runtime.SetFinalizer(blob, (*Blob).Free)
+ return blob
+ }
+
+ return nil
+}